所以我写了对新程序员面向基于四元数的3D相机,它是超容易让他们融入并开始使用。

当我显影,在第一我会采取用户输入作为欧拉角,然后基于关闭输入该帧的四元数。然后我会拿相机的四元数,并通过我们的输入产生的一个相乘,理论上应该简单地将输入旋转摄像头的旋转的当前状态,一切都会和所有的脂肪和快乐。让我们称此:积累四元数,因为我们正在存储和添加四元数仅

但是,我注意到,有使用这种方法的一个问题。我越使用它,即使我只是在旋转一个欧拉角,说偏转,它会,在一些迭代,开始出血到另一国,说间距。这是很小的,但是相当不可接受的。

所以,我做了一些调查研究,发现了一个文章称这是更好地积累欧拉角,所以相机存储它的当前旋转的欧拉角,并输入简单地添加到他们每一帧。然后我生成从它们每个帧,其又用于生成我的旋转矩阵四元数。并且该固定旋转出血到不当轴的问题。

所以,做任何成员#1有任何洞察到这个问题?那是一个做事的正确方法?

有帮助吗?

解决方案

四元数乘法会从浮点舍入问题累积(甚至像45度角简单不会是精确的)的困扰。这是一个伟大的方式来组合轮换,但每个四元部件的精度要落客一段时间。泄流通过一个副作用,在视觉上更糟糕的一个,虽然是你的四元数可以开始整合比例因子 - 到恢复,你就必须重新归一化回欧拉在任何情况下角。的固定点欧拉角是不会积累的舍入。

重新计算每帧的四元数是最小的。我不会理会试图优化它。你也许可以让一个四元数积累你重新归一化,以获得准确回来之前,但它确实是不值得的。

其他提示

积累是一种不精确的方法。积累大量的增量旋转的会积累舍入误差是否与四元或矩阵做到这一点。

我想是这样的:你有你的代码运行起来,但发现一定量的航行后,你的相机是在横倾烦人 - 侵犯您事先没有想到的不变。实际上,你已经意识到你没有的需要的累积旋转;相反,你想做些别的事情。

您可以看一下这是不是一个数值的精度问题的详细的接口设计问题。基本上,人们期望的照相机根据俯仰,偏转和滚动导航,因此选择控制和直接表示角度可避免很多问题。

这里的长号在于quaterions似乎成了多余的(对于该特定的使用,至少)。你仍然希望四元,但 - 与原始俯仰/偏航/滚动角插值可以丑。再次,这是一个界面设计的问题:你需要找出其中你需要的四元数,以及如何让他们进出...

我见过双方主张。我想你会不得不面对真正的问题是在你的相机系统的上下行灵活; IMO偏航通常以第三人称视角更有趣的是(因为你要围绕人物的垂直轴)。虽然可以说是“偏航”围绕第一人称视角垂直为好,我不知道它的真正的同样的事情。

不过,我不认为这是一种浪费每帧重新计算你的四元数。也许这将是更好的存储最新的四元数,并将其标记脏,如果你的帧接收输入?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top