120

我是一名物理学家,并且一直在学习一些编程,并且遇到过很多人使用四元数进行旋转而不是以矩阵/向量形式编写东西。

在物理学中,我们不使用四元数有很好的理由(尽管偶尔会讲述关于汉密尔顿/吉布斯等的离奇故事)。物理学要求我们的描述具有良好的分析行为(这具有精确定义的含义,但在某些相当技术性的方面,远远超出了普通入门课程中所教的内容,因此我不会详细介绍)。事实证明,四元数没有这种好的行为,所以它们没有用,而向量/矩阵有,所以我们使用它们。

然而,仅限于刚性旋转和不使用任何解析结构的描述,3D 旋转可以等效地描述任何一种方式(或其他几种方式)。

通常,我们只需要一个点 X = (x, y, z) 到一个新点 X' = (x', y', z') 的映射,并受到 X 2 = X' 2的约束。有很多事情可以做到这一点。

天真的方法是只绘制这个定义的三角形并使用三角学,或者使用点 (x, y, z) 和向量 (x, y, z) 之间的同构以及函数 f(X) = X' 和矩阵 MX = X',或使用四元数,或使用其他方法将旧向量的分量沿新向量投影出 (x, y, z) T .(a,b,c) (x',y', z') 等。

从数学的角度来看,这些描述在这个设置中都是等价的(作为一个定理)。它们都具有相同数量的自由度、相同数量的约束等。

那么为什么四元数似乎比向量更受欢迎呢?

我看到的通常原因是没有万向节锁或数字问题。

没有万向节锁的说法似乎很奇怪,因为这只是欧拉角的问题。它也只是一个坐标问题(就像极坐标中 r=0 处的奇点(雅可比失去秩)),这意味着它只是一个局部问题,可以通过切换坐标,旋转出简并来解决,或使用两个重叠的坐标系。

我对数字问题不太确定,因为我不详细了解这两个(以及任何替代方案)将如何实现。我读过重新归一化四元数比对旋转矩阵进行归一化更容易,但这仅适用于一般矩阵;旋转有额外的约束,使其变得微不足道(这些约束内置在四元数的定义中)(事实上,这必须是真的,因为它们具有相同数量的自由度)。

那么在向量或其他替代方案上使用四元数的原因是什么?

4

9 回答 9

72

万向节锁定是原因之一,尽管正如您所说,这只是欧拉角的问题并且很容易解决。当您只需要存储 3 个数字时,仍然会使用欧拉角。

对于四元数与 3x3 旋转矩阵,四元数在大小(4 个标量对 9 个)和速度(四元数乘法比 3x3 矩阵乘法快得多)方面具有优势。

请注意,所有这些旋转表示都在实践中使用。欧拉角使用最少的内存;矩阵使用更多内存,但不受万向节锁定的影响,并且具有良好的分析特性;和四元数在两者之间取得了很好的平衡,重量轻,但没有万向节锁。

于 2012-01-18T23:38:21.883 回答
43

在物理学中,我们不使用四元数有很好的理由(尽管偶尔会讲述关于汉密尔顿/吉布斯等的离奇故事)。物理学要求我们的描述具有良好的分析行为(这具有精确定义的含义,但在某些相当技术性的方面,远远超出了普通入门课程中所教的内容,因此我不会详细介绍)。事实证明,四元数没有这种好的行为,所以它们没有用,而向量/矩阵有,所以我们使用它们。

嗯,我也是物理学家。在某些情况下,四元数只是摇摆不定!例如球面谐波。你有两个原子散射,交换一个电子:什么是轨道自旋转移?对于四元数,它只是乘法,即对表示为四元数的 SH 基函数的指数求和。(不过,将勒让德多项式转换为四元数表示法有点乏味)。

但我同意,它们不是通用工具,尤其是在刚体力学中,它们使用起来非常麻烦。然而,要引用伯特兰·罗素(Bertrand Russell)对一个学生的回答,即物理学家需要知道多少数学:“尽可能多!”

不管怎样:为什么我们喜欢计算机图形学中的四元数?因为它们有许多吸引人的特性。第一个可以很好地对它们进行插值,如果要为旋转物体设置动画,例如关节周围的四肢,这一点很重要。对于四元数,它只是标量乘法和归一化。用矩阵表达这一点需要评估 sin 和 cos,然后构建旋转矩阵。然后将向量与四元数相乘仍然比通过完整的向量矩阵乘法更便宜,如果之后添加平移也更便宜。如果你考虑一个人类角色的骨骼动画系统,必须评估大量顶点的大量平移/旋转,这会产生巨大的影响。

使用四元数的另一个很好的副作用是,任何变换本质上都是正交的。对于平移矩阵,由于数值舍入误差,必须每隔几个动画步骤重新正交归一化。

于 2012-01-19T10:20:34.687 回答
37

没有万向节锁的说法似乎很奇怪,因为这只是欧拉角的问题。它也只是一个坐标问题(就像极坐标中 r=0 处的奇点(雅可比失去秩)),这意味着它只是一个局部问题,可以通过切换坐标,旋转出简并来解决,或使用两个重叠的坐标系。

许多 3D 应用程序都喜欢使用欧拉角来定义对象的方向。特别是对于飞行模拟,它们代表了一种理论上有用的方式,以一种易于修改的方式存储方向。

您还应该知道,诸如“切换坐标、旋转出简并度或使用两个重叠的坐标系”之类的事情都需要付出努力。努力意味着代码。代码意味着性能。对于许多 3D 应用程序而言,在不必要的情况下损失性能并不是一件好事。毕竟,如果仅使用四元数就能获得所需的一切,那么所有这些技巧将获得什么。

我对数字问题不太确定,因为我不详细了解这两个(以及任何替代方案)将如何实现。我读过重新归一化四元数比对旋转矩阵进行归一化更容易,但这仅适用于一般矩阵;旋转有额外的约束,使其变得微不足道(这些约束内置在四元数的定义中)(事实上,这必须是真的,因为它们具有相同数量的自由度)。

处理方向的多个连续旋转时会出现数值问题。想象你在太空中有一个物体。并且每个时间片,你都会对其应用一个小的偏航变化。每次更改后,都需要重新归一化方向;否则,精度问题将蔓延并搞砸。

如果使用矩阵,则每次进行矩阵乘法时,都必须重新正交化矩阵。您正在正交归一化的矩阵还不是旋转矩阵,所以我不太确定那个简单的正交归一化。但是,我可以确定这一点:

它不会像 4D 矢量归一化那样快。这就是四元数在连续旋转后用来归一化的方法。

四元数归一化很便宜。即使是专门的旋转矩阵归一化也不会那么便宜。再次,性能很重要。

还有一个矩阵不容易解决的问题:两个不同方向之间的插值。

在处理 3D 角色时,您通常需要进行一系列变换来定义角色中每个骨骼的位置。这种骨骼层次结构代表了特定姿势中的角色。

在大多数动画系统中,为了计算角色在特定时间的姿势,需要在变换之间进行插值。这需要对相应的变换进行插值。

对两个矩阵进行插值是……非常重要的。至少,如果你想要最后类似于旋转矩阵的东西。毕竟,插值的目的是在两个转换之间产生一些东西。

对于四元数,您只需要一个 4D lerp 和一个归一化。就是这样:取两个四元数并线性插值组件。标准化结果。

如果你想要更好的插值质量(有时你会这样做),你可以带出球形 lerp。这使得插值对于更多不同的方向表现更好。这种数学运算要困难得多,并且需要比四元数更多的矩阵运算。

于 2012-01-19T00:24:57.450 回答
11

意见:四元数很好。

旋转矩阵: 次要缺点:矩阵的乘法比四元数慢约 2 倍。 次要优势:矩阵向量乘法速度快约 2 倍,而且很大。 巨大的 缺点:标准化!Ghram-Shmit 是不对称的,在做微分方程时不会给出更高阶的准确答案。更复杂的方法非常复杂且昂贵。

轴(角度 = 轴的长度) 次要优势:小。 中等缺点:使用 trig 时,乘法和应用于向量很慢。 中等缺点:长度为 2*pi 的北极奇点,因为所有轴方向均无任何作用。更多代码(和调试)以在接近 2pi 时自动重新调整它。

于 2013-04-26T23:47:40.197 回答
7

我看到的通常原因是没有万向节锁或数字问题。

他们是很好的理由。

正如您似乎已经理解的那样,四元数编码围绕任意轴的单个旋转,而不是欧拉 3 空间中的三个连续旋转。这使得四元数不受万向节锁定的影响。

此外,某些形式的插值变得很好且易于执行,例如SLERP

...或使用两个重叠的坐标系。

从性能的角度来看,为什么您的解决方案更好?

我可以继续,但四元数只是一种可能的工具。如果它们不适合您的需求,请不要使用它们。

于 2012-01-19T00:04:00.890 回答
6

通常,我们只需要一个点 X=(x,y,z) 到一个新点 X'=(x',y',z') 的映射,并受到 X^2 = X'^2 的约束。有很多事情可以做到这一点。

我们绝对不只是想要那样。很多人都忽略了一个非常重要的微妙之处。您正在谈论的构造(绘制三角形并使用三角等)将正确地将一个向量旋转到另一个向量。但是有无数次旋转可以做到这一点。特别是,我可以在你完成旋转之后出现,然后围绕 X' 向量旋转整个系统。这根本不会改变 X' 的位置。你的轮换和我的轮换的组合相当于另一个单一的轮换(因为轮换形成一个组)。通常,您需要能够表示任何此类旋转。

事实证明,你可以只用一个向量来做到这一点。(这是旋转的轴角表示。)但是在轴角表示中组合旋转是困难的。四元数使它变得容易,还有很多其他的东西。基本上,四元数具有其他表示的所有优点,而没有任何缺点。(虽然我承认可能有一些特定的应用程序可能会更好的一些其他表示。)

于 2013-02-14T01:45:31.563 回答
6

值得记住的是,所有与旋转相关的属性并不是四元数的真正属性:它们是Euler-Rodrigues 参数化的属性,这是用于描述 3D 旋转的实际 4 元素结构。

它们与四元数的关系纯粹是由于 Cayley 的一篇论文“关于与四元数相关的某些结果”,其中作者观察到四元数乘法与欧拉-罗德里格斯参数化组合之间的相关性。这使得四元数理论的各个方面能够应用于旋转的表示,尤其是它们之间的插值。

你可以在这里阅读这篇论文:https ://archive.org/details/collmathpapers01caylrich 。但当时,四元数和旋转之间没有任何联系,Cayley 相当惊讶地发现:

事实上,这些公式正是 M. Olinde Rodrigues Liouville, tv, "Des lois géométriques qui régissent les déplacements d'un système solide [...]" (或 Comb. Math. Journal, t. iii. 第 224 页 [6])。先验地解释这些系数在这里的出现将是一个有趣的问题。

然而,四元数没有任何内在的东西可以给旋转带来任何好处。四元数不避免万向节锁定;Euler-Rodrigues 参数化可以。很少有执行旋转的计算机程序可能真正实现作为一流复杂数学值的四元数类型。不幸的是,对四元数作用的误解似乎已经泄露到某个地方,导致不少困惑的图形学生学习具有多个虚常数的复杂数学的细节,然后对为什么这解决了旋转问题感到困惑。

于 2015-07-13T19:08:59.910 回答
3

有人可能会读到的答案:所有表示都存在乏味的问题。四元数比矩阵小,但四元数乘法不仅仅是矢量点积等,实际上在计算机上花费的时间比两个 3x3 矩阵的点积要多。(计算机非常擅长操作普通矩阵)

矩阵虽然有其他烦人的特性。例如,从长远来看,它们不是稳定的生物。在 3D 空间中对旋转进行建模时,通常将旋转彼此叠加到一个方向矩阵中,即存储参考框架方向的单个旋转矩阵。这个过程将在数百万次加法的过程中导致 O 矩阵偏离严格的旋转矩阵形式。这可以通过定期重新配置矩阵来规避,但在某些情况下这是不平凡的。即单位矩阵不旋转的情况。

您可能希望找到旋转的轴角表示(或四元数表示),然后为此重新生成一个矩阵。大多数算法产生一个零向量,然后在这种情况下遇到零除。在这种情况下,尝试使用“if 0 then...”类型的解决方案来避免这种情况通常也是一个糟糕的主意,因为 a) 分叉很慢,b) 除了机器 epsilon 之外,您仍然可以奇点并以可怕的错误告终。

于 2019-11-21T07:30:03.777 回答
0

单位四元数提供了三个维度的正交群 O(3) 的紧凑表示,尤其是它的子群,三个维度的特殊正交群 SO(3)。这有很多用途,但我知道最好的一个是它在惯性导航系统中的用途,使用加速器和陀螺仪的捷联排列。SO(3) 的一个元素用于表示车辆在地球上的“位置”(或者更确切地说是一个接近地球表面的球体)。另一个用于指定车辆的“姿态”,即关系它的 bodyframe 与局部切平面。这两者都“集成”了微小的变化(10Hz 或更小的时间增量),以用新数据更新它们。“姿态”和“位置”旋转形成“耦合”差分系统,

四元数很容易以这种方式集成(四个四元数加法)。“集成”后,结果将不再是 SO(3) 的成员,而是简单的重新归一化再次将集成的四元数“投影”到 SO(3) 上。每个四元数只使用并保留 4 个值。

在 1980 年代,利用四元数积分来实现惯性导航已经是行业标准。我知道的第一篇论文发表于 1973 年。当时数学学生只是被介绍给四元数作为代数中的一个“奇怪”示例(非交换除法环)。

然而,四元数现在是许多应用程序(例如计算机图形学)中 SO(3) 的首选表示。从数学的角度来看,它甚至更有趣,因为它提供了“流形上的微积分”的可能最简单的例子!(球体是一个简单的流形,SO(3) 是一个李群。)

于 2021-06-06T10:15:59.153 回答