6DOF中的四元数相机表示 - 抵御固有滚动

时间:2012-04-10 02:49:07

标签: camera quaternions

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

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

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

1 个答案:

答案 0 :(得分:0)

目前还不完全清楚你要完成什么。考虑:

  1. 以规范方向开始(+ x为正确,+ y为向上,-z为向前)
  2. 向下倾斜90°。 (-z向上,-y向前)
  3. 向右偏90°。 (+ y是对的,+ x是向前的)
  4. 俯仰90°。 (-x向上,-z向前)
  5. 您现在再次面向规范的前锋,但向左侧滚动了90°。
  6. 你想要发生什么?如果您始终将俯仰和偏航定义为相机/身体参考框架,则这是正常行为。相反,如果您希望“偏航”始终围绕世界的y轴旋转,并且“俯仰”始终围绕摄像机/身体的x轴旋转(以便摄像机的x轴始终与地平面平行),然后,如果你被倾斜了90°,那么偏航运动在视觉上似乎是滚动(你向下看并转了一圈)。维护该属性的四元数将始终具有零的“z”分量。您可以简单地对四元数强制执行该约束(确保始终重新规范化)。

    然而,你单独跟踪音高和偏航的方法应该适用于那种情况。如果您首先只使用两个轴,则万向节锁定不是问题。你只需要确保你应用球场然后是偏航。