我啥时候需要使用四元数?

Posted

技术标签:

【中文标题】我啥时候需要使用四元数?【英文标题】:When do I need to use quaternions?我什么时候需要使用四元数? 【发布时间】:2010-12-22 20:33:29 【问题描述】:

我多年来一直在进行 2D 和 3D 运算,包括图形,并且从未使用过四元数,所以我对它们没有感觉。我知道它们可用于在欧拉角中难以进行的某些操作,并且它们还可用于找到最适合一组坐标所需的旋转(X1,X2...XN,X=(xyz))到另一个(X1',X2'... XN')。

是否有四元数必不可少的地方?他们在哪些地方使解决方案更优雅或更高效?

【问题讨论】:

来自***:四元数的旋转表示比矩阵表示更紧凑,计算速度更快。 对于那些也在寻找点击链接的人:en.wikipedia.org/wiki/Quaternion 【参考方案1】:

它们比旋转矩阵占用更少的内存,并且比矩阵和角度/轴表示更有效。

还有:

在两个四元数之间进行插值非常容易,这对于平滑相机移动等非常有用。 浮点四元数的单位归一化比矩阵表示的舍入缺陷更少。

【讨论】:

【参考方案2】:

四元数比欧拉角有很多优势,并且通常更适合 3D 旋转:

四元数(或:方向)之间的插值更容易(且定义明确):由此产生的运动围绕单个轴具有恒定的角速度,这通常在美学上更令人愉悦。此过程称为“slerp”,对于动画/旋转混合至关重要。此外,四元数插值不会受到万向节锁定的影响。 它们很容易重新规范化。

缺点:

主要缺点是它们需要更多的数学运算并且不如欧拉/卡丹尼角直观。 与仿射变换矩阵相比,四元数只包含旋转,不包含平移和缩放。

【讨论】:

【参考方案3】:

使用四元数,您还可以处理万向节锁定问题。当您想要执行任意旋转时,它们更容易使用。

【讨论】:

云台锁只是欧拉角的一个属性。独立于旋转的表示。【参考方案4】:

四元数的优点

    快速乘法 快速到/从矩阵转换 避免额外(来自计算)噪声(比例、剪切),并表示纯旋转 简单的旋转插值,在自定义情况下实时动画可以使用线性插值。 一些棘手的操作可用,快速旋转集成,扭曲摆动分解

缺点。

    向量的转换不如 3x3 矩阵那么快。 包含 4 个标量,但紧凑的旋转表示只能使用 3 个。

【讨论】:

【参考方案5】:

四元数相对于矩阵的优势不仅在于计算速度更快,而且主要是因为围绕任意角度的连续旋转的矩阵表示最终会导致可怕的浮点舍入误差,并且不再表示正确的仿射旋转。 “恢复”旋转矩阵在计算上比归一化四元数更昂贵。因此,应该选择四元数而不是纯旋转矩阵。

【讨论】:

四元数实际上需要更多的算术,并且连续的四元数会像矩阵一样累积舍入误差。它们的优点是不存在正交矩阵中的冗余。 @DarenW 虽然四元数的成功乘法会出错,但不同之处在于重新规范化它们需要点积和平方根。对矩阵进行正交归一化是一项复杂得多的任务。【参考方案6】:

与欧拉角相比,它们更易于构图,避免了云台锁定的问题。

与旋转矩阵相比,它们在数值上更稳定,表示(4 个数字)更紧凑。

【讨论】:

以上是关于我啥时候需要使用四元数?的主要内容,如果未能解决你的问题,请参考以下文章

3D数学基础四元数和欧拉角

四元数旋转

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

在 1 轴上旋转四元数?

欧拉角到四元数然后四元数到欧拉角

四元数法