一、定义与表示
四元数是由一个实数部分和三个虚数部分组成,通常表示为q = w + xi + yj + zk,其中w是实数,x、y、z是实数系数,i、j、k是虚数单位,满足以下关系:
- i² = j² = k² = -1
- ij = k,ji = -k
- jk = i,kj = -i
- ki = j,ik = -j
四元数也可以表示为q = [w, v],其中v = (x, y, z)是矢量,w是标量。虽然v是矢量,但它不能简单地理解为3D空间的矢量,而是在4维空间中的矢量。
二、几何意义与旋转
四元数中的i、j、k可以理解为一种旋转,其中:
- i旋转代表Z轴与Y轴相交平面中Z轴正向向Y轴正向的旋转。
- j旋转代表X轴与Z轴相交平面中X轴正向向Z轴正向的旋转。
- k旋转代表Y轴与X轴相交平面中Y轴正向向X轴正向的旋转。
- -i、-j、-k分别代表i、j、k旋转的反向旋转。
因此,四元数可以用来描述一个旋转轴和一个旋转角度。具体来说,一个四元数q可以执行一个旋转,将空间中的一个点P绕着单位向量轴u旋转θ角度。这个旋转可以通过将点P扩展到四元数空间,然后应用四元数乘法p' = qpq-1是q的共轭四元数。
三、性质与运算
四元数具有一些独特的性质和运算规则,包括:
- 模:四元数的模定义为|q| = √(w² + x² + y² + z²),它表示四元数到原点的距离。
- 共轭四元数:四元数的共轭定义为q* = w - xi - yj - zk。共轭四元数在旋转计算中起到关键作用。
- 逆四元数:四元数的逆定义为q^-1 = q* / |q|²。只有当四元数为单位四元数(即模为1的四元数)时,其逆才等于其共轭。
- 乘法:四元数的乘法不满足交换律,但满足结合律和分配律。四元数乘法的结果仍然是一个四元数,且可以用来合并旋转。
四、应用
四元数在计算机图形学、机器人学、航空航天等领域有广泛应用。与传统的欧拉角或旋转矩阵相比,四元数提供了一种更稳定、更高效的方式来处理三维旋转。它们可以避免欧拉角存在的万向锁(Gimbal Lock)问题,并且在进行多次旋转运算时不会积攒误差。此外,四元数还非常适合于旋转的插值计算,在动画和飞行模拟等领域有广泛应用。
五、总结
综上所述,四元数是一种在三维空间中表示旋转的数学结构,由实数部分和三个虚数部分组成。它们具有独特的性质和运算规则,并广泛应用于计算机图形学、机器人学等领域。四元数的引入为三维旋转的表示和处理提供了新的思路和方法。
上面概念大家大概看一下了解就行,想要深入了解可以自己查询相关数学知识,接下来就是unity3d部分,我们直接上代码:
public class siyuanshu : MonoBehaviour
{
void Start()
{
//创建一个四元数
Quaternion q = Quaternion.AngleAxis(60, Vector3.right);
//创建一个游戏对象 把四元数赋值给他
GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
obj.transform.rotation = q;
}
}
运行结果:
-
创建一个四元数:
Quaternion q = Quaternion.AngleAxis(60, Vector3.right);
这行代码创建了一个四元数
q
,它表示一个围绕X轴(在Unity中,Vector3.right
代表X轴的正方向)旋转60度的旋转。Quaternion.AngleAxis
方法接受两个参数:一个是旋转的角度(以度为单位),另一个是旋转轴(一个Vector3
向量)。这里,旋转轴是X轴,角度是60度。 -
创建一个游戏对象:
GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
这行代码使用
GameObject.CreatePrimitive
方法创建了一个新的游戏对象,这个对象是一个立方体(PrimitiveType.Cube
)。新创建的游戏对象会被自动添加到当前的Unity场景中,并且其位置默认在场景的原点(0,0,0)。 -
把四元数赋值给游戏对象的旋转:
obj.transform.rotation = q;
这行代码将之前创建的四元数
q
赋值给新创建的立方体游戏对象的transform.rotation
属性。这意味着立方体将会被旋转,以匹配四元数q
所表示的旋转。具体来说,立方体将会围绕其自身的X轴旋转60度。
API讲解:
public static Quaternion AngleAxis(float angle, Vector3 axis);
参数:
angle
(float):要旋转的角度,以度为单位。正值表示按顺时针方向旋转(根据右手定则),负值表示按逆时针方向旋转。axis
(Vector3):旋转所围绕的轴,该轴应该是一个归一化(即长度为1)的向量。如果提供的轴不是归一化的,Unity 会自动将其归一化,但这可能会引入一些微小的数值误差,因此最好自己预先归一化轴。
返回值:
- 返回一个
Quaternion
,表示围绕指定轴旋转指定角度的旋转。
用法:
Quaternion.AngleAxis
常用于创建表示特定旋转的四元数,这些旋转可以随后应用于游戏对象(GameObject)的Transform
组件,以改变其方向。
public static GameObject CreatePrimitive(PrimitiveType type);
参数:
type
(PrimitiveType):这是一个枚举类型,指定了要创建的基本几何体的类型。PrimitiveType
枚举包含了多种几何体类型,如Cube
(立方体)、Sphere
(球体)、Cylinder
(圆柱体)、Capsule
(胶囊体)、Plane
(平面)、Quad
(四边形)等。
返回值:
- 返回一个
GameObject
,它是新创建的基本几何体的实例。这个GameObject
包含了表示几何体的MeshRenderer
组件和MeshFilter
组件,以及用于定位、旋转和缩放的Transform
组件。
用法:
CreatePrimitive
方法通常用于在脚本中动态添加几何体到场景中,特别是在需要根据游戏逻辑动态生成内容的情况下。
public Quaternion rotation { get; set; }
rotation
属性的特点:
-
类型:
Quaternion
,这是一个用于表示三维旋转的四元数结构。 -
可读写:你可以通过
transform.rotation
来获取当前游戏对象的旋转状态,也可以通过给它赋值来设置新的旋转。 -
影响:改变
transform.rotation
的值会立即影响游戏对象在场景中的方向。 -
避免万向锁:与欧拉角(Euler angles)相比,四元数在表示旋转时不会遇到万向锁(gimbal lock)的问题,这使得它成为三维旋转的理想选择。
-
组合旋转:四元数支持乘法运算,这意味着你可以将多个旋转组合在一起,得到一个总的旋转效果。例如,
transform.rotation = rotationA * rotationB;
会将rotationB
应用到rotationA
上,得到一个新的旋转,并将其赋值给transform.rotation
。 -
插值:在动画和过渡效果中,四元数插值(如
Quaternion.Lerp
和Quaternion.Slerp
)允许你平滑地在两个旋转之间过渡。