对于旋转,您需要使用一个单位四元数,即W^2 + X^2 + Y^2 + Z^2 = 1
四元数中的(X, Y, Z)
部分可以视为沿旋转轴的向量。这个向量分量的大小以一种不太明显的方式编码了旋转角度。
|X,Y,Z| = sqrt(X^2 + Y^2 + Z^2) = sin(rotation_angle/2)
为了完成四元数,我们有一个实部分W。
W = cos(rotation_angle/2)
使用四元数进行旋转的优点在于它具有简单的乘法规则,并避免了万向锁问题(不像欧拉角),同时只有1个多余的自由度(不像旋转矩阵,它们有6个多余的自由度)。
可以直接使用四元数来旋转点,首先将点转换为“纯虚四元数”:
P = (W=0, X=p.x, Y=p.y, Z=p.z)
(注意该四元数的向量分量与点的坐标相同)。然后,通过四元数乘法计算旋转后的点,如下所示:
either: P' = Q* P Q
or: P' = Q P Q*
(depending on convention)
这里的 Q*
是四元数 Q
的共轭。结果的实部将是零:P'.W = 0
,而向量部分 (P'.X, P'.Y, P'.Z)
将是旋转后的点坐标。
然而,通常将旋转四元数用于图形目的的方法是将它们转换为等效的旋转矩阵。您可以通过上面的公式和四元数乘法规则计算出细节,但得到的3x3旋转矩阵类似于:
[ W^2+X^2-Y^2-Z^2 2(XY-WZ) 2(ZX+WY) ]
[ 2(XY+WZ) W^2+Y^2-X^2-Z^2 2(YZ-WX) ]
[ 2(ZX-WY) 2(YZ+WX) W^2+Z^2-X^2-Y^2 ]