我目前正在使用四元数(特别是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相机或太空船型相机。我正在寻找纠正此卷的建议(特定例程),或者可以满足我需求的替代表示。对不起文字的墙,但我想非常清楚。谢谢你的时间和快乐的黑客行为!
答案 0 :(得分:0)
目前还不完全清楚你要完成什么。考虑:
你想要发生什么?如果您始终将俯仰和偏航定义为相机/身体参考框架,则这是正常行为。相反,如果您希望“偏航”始终围绕世界的y轴旋转,并且“俯仰”始终围绕摄像机/身体的x轴旋转(以便摄像机的x轴始终与地平面平行),然后,如果你被倾斜了90°,那么偏航运动在视觉上似乎是滚动(你向下看并转了一圈)。维护该属性的四元数将始终具有零的“z”分量。您可以简单地对四元数强制执行该约束(确保始终重新规范化)。
然而,你单独跟踪音高和偏航的方法应该适用于那种情况。如果您首先只使用两个轴,则万向节锁定不是问题。你只需要确保你应用球场然后是偏航。