欧拉角-Euler
欧拉角是三个角度参数,它们描述了一个物体围绕三个主轴X、Y和Z顺序旋转的情况。三个角分别对应于偏航(Yaw)、俯仰(Pitch)和翻滚(Roll)。
- 偏航(Yaw):绕Y轴的旋转,通常表示对象的左右转向。
- 俯仰(Pitch):绕X轴的旋转,通常表示对象的上下倾斜。
- 翻滚(Roll):绕Z轴的旋转,通常表示对象的侧倾。
使用欧拉角进行旋转操作比较直观,并且容易理解。然而,它们有一个著名的问题,即万向锁(Gimbal Lock),这是由于旋转顺序导致旋转自由度的丧失所引起的现象。
四元数- Quaternion
四元数是一种复数的扩展,用于在三维空间中表示旋转。
四元数有四个分量:一个实部和三个虚部,通常写为 [w, x, y, z] 或 [x, y, z, w] 的形式。
与欧拉角相比,四元数有几个优点:
- 不受万向锁的影响:四元数可以避免万向锁的问题,因此在动画插值时更加稳定。
- 更适合插值:四元数之间的插值(如球面线性插值,SLERP)更为平滑且计算效率更高,在实现平滑动画和相机运动时特别有用。
- 计算更高效:四元数在某些情况下比使用3x3矩阵或者4x4矩阵的旋转表示更节省内存和计算资源。
在四元数中,w 是实部,而 x、y 和 z 分量构成了四元数的虚部。四元数通常表示为
一般式
q = w + xi + yj + zk
i²=j²=k²=ijk=−1
其中 ( i )、( j ) 和 ( k ) 是四元数代数中的基本单位。
有序对
q=[s, v]或[s,xi+yj+zk]s,x,y,z∈R
我们可以理解为s表示的实部,向量 v 表示的就是三维空间
四元数用于三维空间中的旋转,其优点包括避免万向锁(Gimbal Lock)和提供平滑的插值(比如球面线性插值,SLERP)。在旋转的上下文中,四元数的 w 分量和虚部分量 x、y 和 z 一起工作来定义旋转的轴和角度。实际上,一个单位四元数(长度或范数为1的四元数)可以表示为:
[ q = \cos(\frac{\theta}{2}) + (xi + yj + zk) \sin(\frac{\theta}{2}) ]
这里,( x, y, z ) 定义了旋转轴的方向
,而 ( \theta ) 是围绕该轴的旋转角度。w 分量,即 ( \cos(\frac{\theta}{2}) ),提供了关于旋转角度大小的信息
。当四元数的范数为1时,它被称为单位四元数,才能表示空间中的旋转。
在图形和游戏编程中,四元数不直接与可视对象的属性对应,而是通过内部计算来影响对象的方向。因此,w 分量通常由程序员以外的人看不到,但它在幕后进行旋转运算时非常重要。
关系
在实际编程实践中,开发者可能会以欧拉角的形式指定旋转,但内部系统会将它们转换成四元数来进行计算。例如,在Three.js中,每个Object3D对象都有两个属性:.rotation(一个包含欧拉角的Euler对象)和.quaternion(一个Quaternion对象)。当你设置.rotation时,其内部会同步更新.quaternion,反之亦然。这样,你可以使用最直观的方式来设定旋转,同时保留四元数的所有计算优势。
在Three.js等框架中,通常使用四元数来处理旋转,以避免万向锁并利用四元数进行插值和其他旋转相关的操作。当你直接设置一个对象的.rotation属性时,内部实际上是在更新四元数(.quaternion),从而完成旋转的设置。