使用四元数防止绕某个轴旋转

时间:2017-10-13 21:15:43

标签: c++ math unity3d rotation quaternions

我用鼠标编程相机控件。我希望用户能够向上或向下或向左和向右查看,但不能“倾斜”#34;去旁边。换句话说,我想允许Yaw和Pitch改变,但将Roll限制为0。

如何防止四元数围绕某个轴旋转?当我只允许自己进行x轴旋转或y轴旋转时,一切正常,但是当我由于某种原因同时允许两者时,y旋转受到影响,相机会向侧面倾斜。

1 个答案:

答案 0 :(得分:5)

正如CNuts所解释的那样,连接多个偏航和俯仰旋转可能导致滚转。然而,如果偏航和俯仰旋转在乘法顺序中严格分开,则不会发生这种情况。 E.g。

Yaw1 * Yaw2 * Yaw3 * Pitch1 * Pitch2

只有在末尾添加另一个偏航旋转时才会出现问题。但是您可以轻松地防止这种情况:如果您想要添加偏航旋转,请将其乘以左侧。如果要添加音高旋转,请将其乘以右侧。即如果当前相机旋转为R,则:

R = additionalYaw * R

R = R * additionalPitch

由于所有的偏航旋转都在同一轴上,因此这些变换实际上是通勤的。因此它们出现的顺序无关紧要(同样适用于同一轴的所有其他旋转)。当然,您也可以切换顺序(即首先是俯仰,然后是偏航)。取决于您想要的控制类型。

CNuts还描述了另一种方法。如果您有变换层次结构,则可以为摄像机变换设置两个节点。然后,向其中一个添加偏航旋转并向另一个旋转。这将具有与上述相同的效果,有效地分离围绕不同轴的旋转。