使用四元数绕轴旋转多个点
Rotating multiple points around axis using Quaternion
我想简单地使用四元数围绕 X、Y、Z 轴旋转多个点(一个形状)。我将我的欧拉角转换为四元数,所以四元数已经设置好并且看起来不错。
我的东西是这样设置的:
- q(四元数)-> W:0.99,X:0.07,Y : 0, Z: 0.(绕 X 轴旋转 ~17.18°)
- p(点)-> X:-0.35,Y:1.4,Z:0.35.
- p'(旋转点)-> ?
我是四元数的新手,我不知道什么字母代表我想用来旋转点的操作中的什么值。
对于旋转,您使用 unit 四元数,这样 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)
将为旋转点坐标。
但是,将旋转四元数用于图形目的的通常方法是将它们变成等效的旋转矩阵。您可以从上面的公式和 quaternion multiplication rules 中计算出详细信息,但生成的 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 ]
我想简单地使用四元数围绕 X、Y、Z 轴旋转多个点(一个形状)。我将我的欧拉角转换为四元数,所以四元数已经设置好并且看起来不错。
我的东西是这样设置的:
- q(四元数)-> W:0.99,X:0.07,Y : 0, Z: 0.(绕 X 轴旋转 ~17.18°)
- p(点)-> X:-0.35,Y:1.4,Z:0.35.
- p'(旋转点)-> ?
我是四元数的新手,我不知道什么字母代表我想用来旋转点的操作中的什么值。
对于旋转,您使用 unit 四元数,这样 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)
将为旋转点坐标。
但是,将旋转四元数用于图形目的的通常方法是将它们变成等效的旋转矩阵。您可以从上面的公式和 quaternion multiplication rules 中计算出详细信息,但生成的 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 ]