基于四元数的三维相机应该积累四元数还是欧拉角?
所以我写了一个基于四元数的3D相机,面向新的程序员,所以他们很容易整合并开始使用。
在我开发它时,首先我会将用户输入视为欧拉角,然后根据该帧的输入生成四元数。 然后,我将拍摄相机的四元数,然后将其乘以我们为输入生成的数据,理论上应该简单地将输入旋转添加到相机旋转的当前状态,而且事情会变得很胖并且很快乐。 让我们称之为:积累四元数,因为我们只存储和添加四元数。
但我注意到这种方法存在问题。 我用得越多,即使我只在一个欧拉角上旋转,也就是说偏航,它会在一些迭代中开始渗入另一个,比如说Pitch。 这是轻微的,但相当令人无法接受。
所以我做了一些更多的研究,发现一篇文章指出最好是积累欧拉角,所以相机将它当前的旋转存储为欧拉角,并且输入只是添加到它们的每一帧中。 然后我从它们的每个帧中生成一个四元数,然后用它来生成我的旋转矩阵。 这就解决了旋转渗漏到不适当的轴上的问题。
那么,任何Stackoverflow成员都可以深入了解这个问题吗? 这是一种正确的做事方式吗?
乘四元数会遭受浮点舍入问题的累积(即使像45度这样简单的角度也不准确)。 这是组合旋转的好方法,但是每个四元数组件的精度都会随着时间的推移而下降。 流血是一种副作用,视觉上更糟糕的一个,虽然你的四元数可以开始合并一个比例因子 - 为了恢复它,在任何情况下你都必须重新归一化回欧拉角。 定点欧拉角不会累积舍入。
重新计算每帧四元数是最小的。 我不打算试图优化它。 在重新标准化之前,您可能允许一些四元数累加以获得精确度,但实际上这并不值得。
积累是一个不精确的过程。 不管是用四元数还是矩阵来累积大量增量旋转都会累积舍入误差。
我想像这样:你的代码已经启动并运行了,但是注意到在一定数量的导航之后,你的摄像头恼人地陷入了沉思 - 违反了你之前没有想到的不变量。 实际上,你已经意识到你不想积累旋转; 相反,你想做别的事情。
你可以把它看作是一个接口设计问题,而不是数值准确性问题。 基本上,人们希望摄像机根据俯仰,偏航和滚动进行导航,因此选择直接控制和表示角度可以避免很多问题。
这里令人沮丧的是,quaterions似乎已经变得多余(至少对于这个特定的用法)。 然而,你仍然想要四元数 - 插入的原始音高/偏转/滚动角度可能会很难看。 再次,这是一个界面设计问题:你需要找出你需要四元数的地方,以及如何让它们进出...
我已经看到两者都争辩。 我认为你需要处理的真正问题是相机系统的灵活性, 在第三人称视角中,IMO偏航通常更有趣(因为您要围绕角色的垂直轴旋转)。 虽然你可以在第一人称视角中对纵向进行“偏袒”,但我不确定这是否是同一件事。
不过,我认为重新计算每帧四元数是一种浪费。 也许最好是存储最新的四元数,并且如果你的框架接收到输入,则将它们标记为脏的。
链接地址: http://www.djcxy.com/p/81771.html上一篇: Should Quaternion based 3D Cameras accumulate Quaternions or Euler angles?