1

关于 SO 的第一个问题,尽管我已经通过 Google 来过这里很多次。我已经阅读了很多关于使用四元数表示旋转以及寻找有类似问题的人的主题。我还没有找到一个好的解决方案,或者我能理解的解决方案。所以我尝试提出一个足够清晰的问题来产生可靠的答案。

我目前正在使用四元数(特别是 Qt 4.7 四元数/C++)来表示我的相机的方向。在程序的每个步骤中,我都会检查鼠标移动并执行 fromAxisAndAngle(xaxis, x_mouse_movement) 和 fromAxisAndAngle(yaxis, y_mouse_movement)。我将这两个四元数相乘(yaxis * xaxis)。对于初始化,我有一个单位四元数 (w,x,y,z -> 1,0,0,0) 来相乘。我不断累积这些 fromAxisAndAngle 乘法与当前方向的旋转。这会产生一个滚动,称为李群问题(我认为),如果你连续应用俯仰和偏航,你可以产生一个纯滚动,这就是我在当前实现中所拥有的(这对于我的程序来说是正确的我可以告诉)。

我已经实现了另一种方法,其中俯仰、偏航、滚动增加,并且每次从这些值从头开始从 AxisAndAngle 构建四元数。这会产生一个正确的 FPS 风格的相机,但它会受到万向节锁定的影响。我的目标是保持纯四元数表示,同时消除(或补偿)仅由俯仰和偏航产生的滚动效果,这样我就可以将这款通用 6DOF 相机用作 FPS 相机或太空船式相机。我正在寻找更正此卷的建议(特定例程),或者可以满足我需要的替代表示。对不起,文字墙,但我想非常清楚。感谢您的时间和愉快的黑客攻击!

4

1 回答 1

0

目前尚不清楚您要完成什么。考虑:

  1. 从规范方向开始(+x 是正确的,+y 是向上的,-z 是向前的)
  2. 俯仰 90°。(-z 向上,-y 向前)
  3. 向右偏航 90°。(+y 是正确的,+x 是向前的)
  4. 俯仰 90°。(-x 向上,-z 向前)
  5. 您现在再次面向规范前方,但向左滚动了 90°。

你想要发生什么?如果您始终将俯仰和偏航定义为相对于相机/身体参考系,这是正常行为。相反,如果您希望“偏航”始终围绕世界的 y 轴旋转,而“俯仰”始终围绕相机/身体的 x 轴旋转(以便相机的 x 轴始终平行于地平面),然后,如果您向下倾斜 90°,偏航运动在视觉上看起来像是滚动(您正在向下看并转了一圈)。保持该属性的四元数的“z”分量始终为零。您可以简单地对您的四元数强制执行该约束(确保始终重新规范化)。

但是,您单独跟踪俯仰和偏航的方法应该适用于这种情况。如果您一开始只使用两个轴,万向节锁就不是问题。你只需要确保你应用了俯仰然后偏航。

于 2012-04-12T03:48:50.527 回答