使用四元数防止绕特定轴旋转
Prevent rotation around certain axis with Quaternion
我正在用鼠标对相机控件进行编程。我希望用户能够向上和向下或向左和向右看,但不能 "tilt" 到侧面。换句话说,我想允许 Yaw 和 Pitch 改变但将 Roll 限制为 0。
如何防止四元数绕某个轴旋转?当我自己只允许 x 轴旋转或 y 轴旋转时,一切正常,但是当我出于某种原因同时允许两者时,y 轴旋转受到影响并且相机向一侧倾斜。
正如 CNuts 所解释的那样,连接多个偏航和俯仰旋转可以导致滚动旋转。然而,如果偏航和俯仰旋转在乘法顺序中严格分开,则不会发生这种情况。例如
Yaw1 * Yaw2 * Yaw3 * Pitch1 * Pitch2
只有在最后再增加一个yaw rotation才会有问题。但是你可以很容易地避免这种情况:如果你想添加偏航旋转,将它乘以左边。如果要添加俯仰旋转,请将其乘以右侧。 IE。如果当前相机旋转为 R
,则:
R = additionalYaw * R
或
R = R * additionalPitch
由于所有偏航旋转都围绕同一轴,因此这些变换实际上是相互交换的。所以它们出现的顺序无关紧要(同样适用于围绕同一轴的所有其他旋转)。当然,您也可以调换顺序(即先俯仰,再偏航)。取决于你想要什么样的控制。
CNuts 还描述了另一种方法。如果你有一个变换层次结构,你可以有两个节点用于你的相机变换。然后,将偏航旋转添加到其中一个,将俯仰旋转添加到另一个。这将具有与上述相同的效果,有效地分离围绕不同轴的旋转。
我正在用鼠标对相机控件进行编程。我希望用户能够向上和向下或向左和向右看,但不能 "tilt" 到侧面。换句话说,我想允许 Yaw 和 Pitch 改变但将 Roll 限制为 0。
如何防止四元数绕某个轴旋转?当我自己只允许 x 轴旋转或 y 轴旋转时,一切正常,但是当我出于某种原因同时允许两者时,y 轴旋转受到影响并且相机向一侧倾斜。
正如 CNuts 所解释的那样,连接多个偏航和俯仰旋转可以导致滚动旋转。然而,如果偏航和俯仰旋转在乘法顺序中严格分开,则不会发生这种情况。例如
Yaw1 * Yaw2 * Yaw3 * Pitch1 * Pitch2
只有在最后再增加一个yaw rotation才会有问题。但是你可以很容易地避免这种情况:如果你想添加偏航旋转,将它乘以左边。如果要添加俯仰旋转,请将其乘以右侧。 IE。如果当前相机旋转为 R
,则:
R = additionalYaw * R
或
R = R * additionalPitch
由于所有偏航旋转都围绕同一轴,因此这些变换实际上是相互交换的。所以它们出现的顺序无关紧要(同样适用于围绕同一轴的所有其他旋转)。当然,您也可以调换顺序(即先俯仰,再偏航)。取决于你想要什么样的控制。
CNuts 还描述了另一种方法。如果你有一个变换层次结构,你可以有两个节点用于你的相机变换。然后,将偏航旋转添加到其中一个,将俯仰旋转添加到另一个。这将具有与上述相同的效果,有效地分离围绕不同轴的旋转。