math - 基于四元数的 3D 相机应该累积四元数还是欧拉角?

标签 math 3d quaternions euler-angles

所以我编写了一个面向新程序员的基于四元数的 3D 相机,因此他们非常容易集成和开始使用。

在我开发它时,起初我会将用户输入作为欧拉角,然后根据该帧的输入生成一个四元数。然后我将相机的四元数乘以我们为输入生成的四元数,理论上应该简单地将输入旋转添加到相机旋转的当前状态,一切都会变得有趣和快乐。让我们称之为:累积四元数,因为我们只存储和添加四元数。

但是我注意到这个方法有问题。我使用它越多,即使我只在一个欧拉角上旋转,比如偏航,它会在一些迭代中开始渗入另一个,比如 Pitch。这是轻微的,但相当 Not Acceptable 。

所以我做了一些更多的研究,发现一篇文章说最好累积欧拉角,所以相机将其当前旋转存储为欧拉角,并且每帧简单地将输入添加到它们中。然后我在每一帧中从它们生成一个四元数,这又用于生成我的旋转矩阵。这解决了旋转渗入不正确轴的问题。

那么任何 Stackoverflow 成员对这个问题有任何见解吗?这是做事的正确方式吗?

最佳答案

乘以四元数会遇到浮点舍入问题的累积(即使像 45 度这样的简单角度也不准确)。这是合成旋转的好方法,但每个四元数组件的精度都会随着时间的推移而下降。渗漏是一种副作用,视觉上更糟糕的是您的四元数可能会开始包含比例因子 - 要恢复它,无论如何您都必须重新归一化回欧拉角。定点欧拉角不会累积舍入。

每帧重新计算四元数是最少的。我不会费心去优化它。在重新归一化以恢复准确度之前,您可能允许累积一些四元数,但这确实不值得付出努力。

关于math - 基于四元数的 3D 相机应该累积四元数还是欧拉角?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/319189/

相关文章:

c++ - glm::quat 为什么 x,y,z,w 分量的顺序是混合的

swift - 21如何计算! (21 阶乘)快速?

java - 在 Processing 中绘制 3D 文本

3d - 使用 gnuplot 绘制三角形网格

c# - 3D Delaunay 三角剖分 C# 库?

ios - 全景 View iOS

javascript - 如何在javascript中找到两条切线的交点

algorithm - 解决重复 : Substitution method

C# 划分两个二进制数

3d - SceneKit,沿相机方向投影节点