【问题标题】:Prevent rotation around certain axis with Quaternion使用四元数防止围绕某个轴旋转
【发布时间】:2018-03-26 01:48:37
【问题描述】:

我正在用鼠标对相机控件进行编程。我希望用户能够上下或左右看,但不能“倾斜”到一边。换句话说,我想允许 Yaw 和 Pitch 改变,但将 Roll 限制为 0。

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

【问题讨论】:

  • 这是一个常见的问题,它是由于在同一对象上添加了 Yaw 和 Pitch 导致它滚动。我不记得究竟如何解决它,但你需要有一个对象作为父对象并让该对象做例如俯仰,然后将偏航应用于子对象或相反,我不太确定。如果您将 Yaw 和 Pitch 在两个不同的对象上分开,它应该可以工作。
  • 似乎当你有两个四元数并组合它们时,你应该能够获取生成的四元数,将其轴投影到滚动轴上并使用它来移除滚动组件。但这是基于对所涉及的线性代数的直觉的即兴回答。

标签: c++ math unity3d rotation quaternions


【解决方案1】:

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

Yaw1 * Yaw2 * Yaw3 * Pitch1 * Pitch2

只有在末尾添加另一个偏航旋转时才会出现问题。但是你可以很容易地防止这种情况发生:如果你想添加一个偏航旋转,将它乘以左边。如果要添加俯仰旋转,请将其乘以右侧。 IE。如果当前摄像机旋转为R,则:

R = additionalYaw * R

R = R * additionalPitch

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

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

【讨论】:

猜你喜欢
  • 2022-10-25
  • 2019-09-18
  • 2014-04-18
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多