为什么四元数用于旋转?


107

我是物理学家,已经学习了一些编程知识,并且遇到了很多使用四元数旋转而不是以矩阵/矢量形式编写事物的人。

在物理学中,我们不使用四元数是有很好的理由的(尽管偶尔会有关于Hamilton / Gibbs / etc的怪诞故事)。物理要求我们的描述必须具有良好的分析行为(这具有精确定义的含义,但是以某种相当技术性的方式,远远超出了普通入门班所教的内容,因此我将不做任何详细介绍)。事实证明,四元数没有这种良好的行为,因此它们无用,向量/矩阵也有,因此我们使用它们。

但是,由于限于刚性旋转和不使用任何分析结构的描述,因此可以等效地描述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处的奇点(雅可比松散秩)一样),这意味着它只是一个局部问题,可以通过切换坐标,从简并转出来解决,或使用两个重叠的坐标系。

我不太确定数值问题,因为我不知道如何同时实现这两种方法(以及其他方法)。我已经读过,对四元数进行重新归一化比对旋转矩阵进行归一化更容易,但这仅适用于一般矩阵。旋转具有附加的约束,可以使此变得微不足道(这些约束内置于四元数的定义中)(实际上,这必须成立,因为它们具有相同数量的自由度)。

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


2
无论如何,“没有万向节锁”是骗人的。如果对四元数使用两个正交旋转,则会遇到与欧拉角相同的万向架锁定问题。您只需一次旋转就不会有问题,因为它是1次操作,而不是3次
。– Damon

2
@Damon这不是完全正确。参见mathoverflow.net/a/95908/97344
–plasmacel

Answers:


61

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

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

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


但是旋转矩阵并没有那么多独立的组成部分,它是受约束的。二维旋转由三个维度的三个坐标指定,与表示方式无关。通常,矩阵具有更多的分量,因为它们可以做的比旋转更多。但是在旋转的情况下,额外的组件是根据其他组件确定的。
JMP 2012年

1
@JMP:你是对的。很多人会“压缩”矩阵,因此您只能存储所需的信息,但是压缩矩阵更难处理,因此会损失性能。这都是关于内存和性能的折衷。
彼得·亚历山大

10
@JMP标准矩阵乘法例程需要全部9个值。即使它们中只有3个是独立的,但当您实际进行数学运算时(同样,如果您实际上是在计算机中进行矩阵乘法),仍然需要9个数字的内存。
David Z

1
“四元数乘法比3x3矩阵乘法快得多”真的吗?四元数旋转需要24个add / mul运算(由于两次叉积运算和补充运算),3x3矩阵仅需要15个add / mul运算。
马拉·布哈罗夫

可以仅使用2个向量(6个浮点数)来完全表示3D方向,第3个向量只是一个十字。矩阵的一个优点是它们已经处于可以用于许多应用程序的形式。Euler和Quats都需要打包(从矩阵)和解包(到矩阵),这需要额外的处理。Euler和Quats可用于紧凑的长期存储。
user3015682

39

在物理学中,我们不使用四元数是有很好的理由的(尽管偶尔会有关于Hamilton / Gibbs / etc的怪诞故事)。物理要求我们的描述必须具有良好的分析行为(这具有精确定义的含义,但是以某种相当技术性的方式,远远超出了普通入门班所教的内容,因此我将不做任何详细介绍)。事实证明,四元数没有这种良好的行为,因此它们无用,向量/矩阵也有,因此我们使用它们。

好吧,我也是物理学家。在某些情况下,四元数会摇动!例如,球谐函数。您有两个原子散射,交换一个电子:什么是轨道自旋转移?对于四元数,它只是乘法,即对表示为四元数的SH基函数的指数求和。(尽管让勒让德多项式变成四元数表示有点繁琐)。

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

无论如何:为什么我们喜欢计算机图形学中的四元数?因为它们具有许多吸引人的特性。首先,可以很好地对它们进行插值,如果要对旋转的物体进行动画处理(例如关节周围的四肢),则这一点很重要。对于四元数,它只是标量乘法和归一化。用矩阵表示这一点需要评估sin和cos,然后建立一个旋转矩阵。然后,将向量与四元数相乘仍然比通过完整的向量矩阵乘法便宜,如果随后再添加翻译,则仍然便宜。如果您考虑一个用于人类角色的骨骼动画系统,则必须评估大量顶点的许多平移/旋转,这将产生巨大的影响。

使用四元数的另一个不错的副作用是,任何转换本质上都是正交的。对于转换矩阵,由于数字舍入误差,必须对每两个动画步骤重新进行正交化。


1
您是否具有四元数的球谐/勒让德多项式的参考?我将要提交一篇涉及相关主题的论文,并希望看到(能够引用)与此相关的其他工作。
Mike

4
@Mike:不幸的是,什么都没发表。不幸的是,四元数对物理学家来说仍然相当晦涩。我只记得它,因为我的量子力学2导师将其作为练习,但让我震惊。我们实质上所做的是使用术语exp((a·iω+ b·jθ+ c·kη+ d)r),其中r本身是一个复变量。如果绘制此图,您将获得3维分布(我们必须首先针对四元数变量开发指数级数)。这样就可以进行“傅立叶”变换,从而可以将某些东西变成已知的SH项。
datenwolf

31

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

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

您还应该意识到,诸如“切换坐标,从简并旋转出来或使用两个重叠的坐标系”之类的事情都需要付出努力。努力就是代码。代码就是性能。失去,当你不表现到不是许多3D应用程序是件好事。毕竟,如果仅使用四元数就能为您提供所需的一切,那么所有这些技巧都将带来什么。

我不太确定数值问题,因为我不知道如何同时实现这两种方法(以及其他方法)。我已经读过,对四元数进行重新归一化比对旋转矩阵进行归一化更容易,但这仅适用于一般矩阵。旋转具有附加的约束,可以使此变得微不足道(这些约束内置于四元数的定义中)(实际上,这必须成立,因为它们具有相同数量的自由度)。

当处理一个方向的多个连续旋转时,就会出现数值问题。假设您在太空中有一个物体。而每个时间片,您都会对其应用少量的偏航。每次更改后,您都需要重新调整方向。否则,精度问题将蔓延并弄糟。

如果使用矩阵,则每次进行矩阵乘法时,都必须对矩阵重新进行正交化。正正交化的矩阵还不是旋转矩阵,因此对于这种简单的正正交化,我不太确定。但是,我可以确定这一点:

它不会像4D向量归一化那样快。这就是四元数在连续旋转后用于规范化的东西。

四元数归一化很便宜。即使是专门的旋转矩阵正常化不会因为便宜。同样,性能很重要。

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

处理3D角色时,通常会进行一系列转换,以定义角色中每个骨骼的位置。这种骨骼层次表示特定姿势中的角色。

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

内插两个矩阵是不平凡的。至少,如果您想要的是最后类似于旋转矩阵的东西。毕竟,插值的目的是在两次转换之间产生一部分。

对于四元数,您只需要一个4D lerp,然后进行规格化即可。就是这样:取两个四元数并线性内插这些分量。归一化结果。

如果您想要更好的质量插值(有时需要),可以带出球形lerp。这使得插值在不同的方向上表现更好。与四元数相比,此数学困难得多,并且需要更多的矩阵运算。


7

意见:四元数很好。

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

轴(角度=轴的长度) 次要优势:小。 中等缺点:trig对乘法和应用于向量的速度很慢。 中等缺点:长度= 2 * pi时的北极奇异点,因为所有轴方向都不起作用。更多代码(和调试代码)可在2pi附近自动调整其缩放比例。


5

通常,我们只希望将点X =(x,y,z)映射到新点X'=(x',y',z'),但要遵守X ^ 2 = X'^ 2的约束。有很多事情可以做到这一点。

我们绝对不只是想要那样。许多人想念的是一个非常重要的微妙之处。您正在讨论的构造(绘制三角形并使用Trig等)将正确地将一个向量旋转到另一个向量。但是可以无限次旋转。特别是,我可以在您完成旋转之后出现,然后围绕X'向量旋转整个系统。那根本不会改变X'的位置。您的旋转和我的旋转的组合等效于另一个旋转(因为旋转形成一个组)。通常,您需要能够表示任何这样的旋转。

事实证明,您仅需向量即可完成此操作。(这是旋转轴角表示。)但是在轴角表示中组合旋转是困难的。四元数使它变得容易,以及许多其他事情。基本上,四元数具有其他表示形式的所有优点,而没有缺点。(尽管我承认某些应用程序可能会有其他更好的代表。)


4

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

这是很好的理由。

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

而且,某些形式的插值变得很好而容易实现,例如SLERP

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

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

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


然而,旋转矩阵也是如此,并且具有可以整齐使用的更多代数性质。最重要的是,矩阵处理是计算机特别擅长的事情之一。
paul23 '18 / 12/24

3

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

它们与四元数的关系完全归因于Cayley的论文“关于与四元数有关的某些结果”,作者观察到四元数乘法与Euler-Rodrigues参数化组合之间的相关性。这使得四元数理论的各个方面可以应用于旋转的表示,尤其是在它们之间的内插。

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

实际上,这些公式正是M. Olinde Rodrigues Liouville,tv所提出的公式,“系统的固体置换”(或Comb。Math。Journal,t。 iii。第224 [6]页)。先验地考虑这些系数在这里的出现将是一个有趣的问题。

但是,四元数没有任何内在因素可以使旋转受益。四元数不能避免万向节锁定;Euler-Rodrigues参数化可以做到。很少有执行旋转的计算机程序可能真正实现四元数类型,而四元数类型是一类复杂的数学值。不幸的是,对四元数的作用的误解似乎在某处泄漏了,导致相当多困惑的图形学生学习具有多个虚数常量的复杂数学的细节,然后困惑于为什么这解决了旋转问题。


1

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

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

您可能想要找到旋转的轴角表示(或四元数表示),然后为该矩阵重现矩阵。大多数算法会产生零向量,然后在这种情况下会遇到零除。在这种情况下,尝试使用“如果为0,则...”类型的解决方案来避免此类情况,通常也是一个糟糕的主意,因为a)分叉很慢,并且b)仍然可以使机器epsilon除奇异并最终导致可怕的错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.