Camera 六自由度四元数相机表示法-避开固有滚动

Camera 六自由度四元数相机表示法-避开固有滚动,camera,quaternions,Camera,Quaternions,第一个问题是,尽管我已经通过谷歌来过这里很多次了。关于使用四元数来表示旋转以及发现有类似问题的人,我读了很多。我还没有找到一个好的解决办法,或者一个我能理解的办法。。因此,我尝试提出一个足够清晰的问题,以得到可靠的答案 我目前正在使用一个四元数(特别是Qt4.7四元数/C++)来表示相机的方向。在程序的每一步中,我都会检查鼠标移动情况,并执行fromAxisAndAngle(x轴,x_鼠标移动)和fromAxisAndAngle(y轴,y_鼠标移动)。我把这两个四元数相乘(yaxis*xaxis

第一个问题是,尽管我已经通过谷歌来过这里很多次了。关于使用四元数来表示旋转以及发现有类似问题的人,我读了很多。我还没有找到一个好的解决办法,或者一个我能理解的办法。。因此,我尝试提出一个足够清晰的问题,以得到可靠的答案

我目前正在使用一个四元数(特别是Qt4.7四元数/C++)来表示相机的方向。在程序的每一步中,我都会检查鼠标移动情况,并执行fromAxisAndAngle(x轴,x_鼠标移动)和fromAxisAndAngle(y轴,y_鼠标移动)。我把这两个四元数相乘(yaxis*xaxis)。对于初始化,我有一个单位四元数(w,x,y,z->1,0,0)要与之相乘。我不断累积轴上的旋转和当前方向的角乘。这产生了一个横滚,称为李群问题(我认为),如果你持续地应用俯仰和偏航,你可以产生一个纯横滚,这就是我目前的实现(据我所知,这对于我的程序是正确的)


我已经实现了另一种方法,其中俯仰、偏航和横摇都是递增的,四元数是从轴和角度开始构建的,每次都是从这些值开始的。这会产生一个正确的FPS样式的相机,但它会受到万向节锁定的影响。我的目标是保持纯四元数表示,同时消除(或补偿)仅由俯仰和偏航产生的滚动效果,因此我可以将此通用六自由度摄影机用作FPS摄影机或太空船样式的摄影机。我正在寻找更正此卷的建议(特定例程),或适合我需要的替代表示。对不起,这里有很多文字,但我想说得很清楚。感谢您的时间和愉快的黑客

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

  • 从标准方向开始(+x为右,+y为上,-z为前)
  • 俯仰90°。(-z向上,-y向前)
  • 向右偏航90°。(+y是正确的,+x是向前的)
  • 向上倾斜90°。(-x向上,-z向前)
  • 现在,您再次面对标准向前,但向左滚动90°
  • 你希望发生什么?如果始终将俯仰和偏航定义为相对于相机/车身参照系,则这是正常行为。相反,如果您希望“偏航”始终围绕世界的y轴旋转,“俯仰”始终围绕相机/身体的x轴旋转(以便相机的x轴始终平行于地平面),那么,如果您向下俯仰90°,偏航运动将在视觉上看起来是滚动的(您向下看并在一个圆中旋转)。保持该属性的四元数的“z”分量始终为零。您可以简单地对四元数强制执行该约束(确保始终重新规范化)


    然而,在这种情况下,简单地分别跟踪俯仰和偏航的方法应该可以很好地工作。如果一开始只使用两个轴,万向节锁就不是问题。您只需要确保应用俯仰,然后应用偏航

    你有关于这个“谎言群问题”的参考资料吗?我在谷歌上很难找到任何相关的参考资料。我的理解是,四元数用于允许增量方法,因为它避免了舍入错误,这个问题对我来说是新问题。