使用四元数防止绕某个轴旋转
Prevent rotation around certain axis with Quaternion
我正在用鼠标对相机控件进行编程。我希望用户能够上下或左右看,但不能向侧面"倾斜"。换句话说,我想允许偏航和俯仰改变,但将滚转限制为0。
如何防止四元数围绕某个轴旋转?当我只允许x轴旋转或y轴旋转时,一切都很好,但当我出于某种原因同时允许两者时,y轴旋转会受到影响,相机会向一侧倾斜。
正如CNuts所解释的,连接多个偏航和俯仰旋转可能会导致滚转旋转。然而,如果偏航和俯仰旋转按乘法顺序严格分离,则不会发生这种情况。例如
Yaw1 * Yaw2 * Yaw3 * Pitch1 * Pitch2
只有在末端添加另一个偏航旋转时才会出现问题。但你可以很容易地防止这种情况:如果你想添加偏航旋转,请将其向左相乘。如果要添加俯仰旋转,请将其向右相乘。即,如果当前相机旋转为R
,则:
R = additionalYaw * R
或
R = R * additionalPitch
由于所有的偏航旋转都是围绕同一个轴进行的,因此这些变换实际上是通勤的。所以它们以什么顺序出现并不重要(这同样适用于围绕同一轴的所有其他旋转)。当然,您也可以切换顺序(即先俯仰,然后偏航)。取决于您想要的控制类型。
CNuts还介绍了一种替代方法。如果有变换层次,则可以有两个节点用于摄影机变换。然后,将偏航旋转添加到其中一个,将俯仰旋转添加到另一个。这将具有与上述相同的效果,有效地分离围绕不同轴的旋转。
相关文章:
- 将四元数旋转的游戏对象旋转另一个四元数时出现问题
- 在OpenGL(GLM/C++)中使用四元数旋转时出现问题
- 四元数旋转不起作用
- 使用四元数防止绕某个轴旋转
- 如何使用四元数来描述超过360度的旋转角度?
- 四元数旋转错误
- 特征:将矩阵3d旋转转换为四元数
- 用四元数绕轴旋转矢量
- 四元数 -> 欧拉角 -> 旋转矩阵问题 (GLM)
- C++OpenGl相机旋转使用四元数问题
- 将 glm 四元数转换为旋转矩阵并将其与 opengl 一起使用
- 四元数旋转是我瞎了还是只是做错了
- 如何否定GLM四元数在任何单轴上的旋转
- 使用四元数旋转摄影机
- 特征c++ / Matlab四元数与旋转矩阵不匹配
- 如何缩放四元数的旋转
- GLM矩阵的旋转方向,使用四元数
- 提高QVM旋转与四元数
- 小四元数相机bug?(在Z轴上轻微旋转)
- 四元数旋转不太对