四元数旋转相对于世界

时间:2013-12-27 14:43:48

标签: rotation quaternions

Unity3D提供以下方法:

Rotate(eulerAngles: Vector3, relativeTo: Space = Space.Self);

例如,这将围绕它的局部X轴旋转对象:

transform.Rotate(Vector3(50,0,0) * Time.deltaTime, Space.Local);

如果我首先围绕它的局部y轴(向上一致)旋转90度,然后相对于World绕X轴旋转它,它将基本围绕局部Z轴旋转,即:

//setup
transform.Rotate(Vector3(0, 90, 0));
//on update
transform.Rotate(Vector3(50,0,0) * Time.deltaTime, Space.World);

在我自己的实现中,使用四元数,我实现了局部旋转,这很容易。

//rotate around local axis
currentRotation *= rotateQuat;

如何使用四元数实现相对于世界行为?

1 个答案:

答案 0 :(得分:1)

如果没有明确的计算,可能有一种方法可以在Unity中完成,但是......

当使用四元数进行旋转时,考虑围绕特定轴(单位矢量u)的旋转(角度a)而不是使用欧拉角更有意义;四元数本身(实际上是单位四元数或“versor”)可以表示为4向量(w,x,y,z),其中w = cos(0.5 * a)和(x,y,z)= (u_x,u_y,u_z)* sin(0.5 * a)(意思是a = 2 * arccos(w)和u =(x,y,z)/ sin(0.5 * a)=(x,y,z)/罪(arccos(w)))。在此之后,“同一性”四元数(即无旋转)是(1,0,0,0),因为cos(0)= 1且sin(0)= 0,并且非常有用地,a的反向/共轭四元数,(w,-x,-y,-z)表示相反的旋转(x,y和z是技术上的虚部;你也可以将四元数表示为w + x * i + y * j + z * K)。要使用四元数将旋转应用于3D空间中的点p,可以使用p'=(w,x,y,z)*(0,p_x,p_y,p_z)*(w,-x,-y, - z),其中乘法如下所示:http://en.wikipedia.org/wiki/Quaternion#Ordered_list_form

因此,如果您知道新旋转的角度和旋转轴(在世界空间中)是什么,则在给定由四元数表示的已存在旋转的情况下,使用四元数执行世界相对旋转相对简单,如计算的主要补充是将现有四元数的共轭应用于新四元数的旋转轴,以便在局部/对象空间中表示该轴;然后你只需为新的旋转创建四元数并将其应用于现有的旋转(我不确定Unity如何命令四元数组合,但通常如果你应用q1后跟q2,则组合四元数将是q2 * q1 [四元数乘法是非交换的,所以应该是resultQuat = newQuat * prevQuat;)。