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

Prevent rotation around certain axis with Quaternion

本文关键字:旋转 四元数      更新时间:2023-10-16

我正在用鼠标对相机控件进行编程。我希望用户能够上下或左右看,但不能向侧面"倾斜"。换句话说,我想允许偏航和俯仰改变,但将滚转限制为0。

如何防止四元数围绕某个轴旋转?当我只允许x轴旋转或y轴旋转时,一切都很好,但当我出于某种原因同时允许两者时,y轴旋转会受到影响,相机会向一侧倾斜。

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

Yaw1 * Yaw2 * Yaw3 * Pitch1 * Pitch2

只有在末端添加另一个偏航旋转时才会出现问题。但你可以很容易地防止这种情况:如果你想添加偏航旋转,请将其向左相乘。如果要添加俯仰旋转,请将其向右相乘。即,如果当前相机旋转为R,则:

R = additionalYaw * R

R = R * additionalPitch

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

CNuts还介绍了一种替代方法。如果有变换层次,则可以有两个节点用于摄影机变换。然后,将偏航旋转添加到其中一个,将俯仰旋转添加到另一个。这将具有与上述相同的效果,有效地分离围绕不同轴的旋转。