为什么四元数用于旋转?

JMP*_*JMP 99 3d matrix quaternions rotational-matrices

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

在物理学中,有很好的理由我们不使用四元数(尽管偶尔讲述汉密尔顿/吉布斯/等的奇怪故事).物理学要求我们的描述具有良好的分析行为(这具有精确定义的含义,但是在一些相当技术的方面远远超出了正常介绍类中教导的内容,所以我不会详细讨论).事实证明,四元数没有这种好的行为,所以它们没用,而矢量/矩阵也没用,所以我们使用它们.

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

一般情况下,我们只是想要一个点X =(X,Y,Z)的映射到一个新的点X '=(X',Y",Z ')受约束X 2 = X' 2.并且有很多事情可以做到这一点.

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

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

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

我看到的通常原因是没有云台锁或数字问题.

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

我对数字问题不太确定,因为我不清楚这些(以及任何替代方案)是如何实现的.我已经读过,对四元数进行重新规范化比对旋转矩阵进行重新规范化更容易,但这只适用于一般矩阵; 一个旋转具有额外的约束,使得这些约束变得无足轻重(这些约束被内置到四元数的定义中)(事实上,这必须是真的,因为它们具有相同数量的自由度).

那么使用四元数而不是向量或其他替代方法的原因是什么?

Pet*_*der 55

万向节锁是一个原因,虽然正如你所说它只是欧拉角的一个问题,很容易解决.当内存成为问题时,仍然使用欧拉角,因为您只需要存储3个数字.

对于四元数与3x3旋转矩阵,四元数具有尺寸优势(4个标量与9)和速度(四元数乘法比3x3矩阵乘法快得多).

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

  • @JMP标准矩阵乘法例程需要所有9个值.即使只有3个是独立的,当你去实际进行数学运算时,它仍需要9个数字的内存(再次,如果你实际上在计算机中进行矩阵乘法). (9认同)
  • “四元数乘法比 3x3 矩阵乘法快得多”真的吗?四元数旋转需要 24 次加/乘运算(由于两次叉积和补充运算),3x3 矩阵仅需要 15 次加/乘运算。 (4认同)
  • @JMP:你说得对。很多人会“压缩”矩阵,以便您只存储所需的信息,但压缩的矩阵更难处理,因此会损失性能。这完全是关于内存和性能的权衡。 (2认同)
  • @MaratBuharov据我了解,使用四元数旋转向量比使用矩阵旋转向量更昂贵,但四元数组合旋转链的速度更快(这是相当广泛完成的事情,例如在机器人技术中,当在运动链中的不同链接之间进行转换时) 。例如参见 https://math.stackexchange.com/a/1355206/828555 (2认同)

dat*_*olf 36

在物理学中,有很好的理由我们不使用四元数(尽管偶尔讲述汉密尔顿/吉布斯/等的奇怪故事).物理学要求我们的描述具有良好的分析行为(这具有精确定义的含义,但是在一些相当技术的方面远远超出了正常介绍类中教导的内容,所以我不会详细讨论).事实证明,四元数没有这种好的行为,所以它们没用,而矢量/矩阵也没用,所以我们使用它们.

好吧,我也是一名物理学家.在某些情况下,四元数只是摇滚!例如球形谐波.你有两个原子散射,交换一个电子:轨道自旋转移是什么?对于四元数,它只是乘法,即将SH基函数的指数相加,表示为四元数.(将勒让德多项式转换为四元数符号虽然有点单调乏味).

但我同意,它们不是一种通用工具,特别是在刚体力学中,它们使用起来非常麻烦.然而,引用Bertrand Russell的问题回答一个学生物理学家需要知道多少数学:"尽可能多!"

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

使用四元数的另一个好的副作用是,任何变换本身都是正交的.对于平移矩阵,由于数值舍入误差,必须对每一对动画步骤进行重新正规化.

  • @Mike:出乎我的意料,遗憾的是没有发表.不幸的是,四元数仍然对物理学家来说相当模糊.我只记得它,因为我的量子机械师2的导师做了这个练习,我被它吹走了.我们基本上做的是使用术语exp((a·iω+ b·jθ+ c·kη+ d)r),其中r本身是一个复变量.如果你绘制这个你得到一个三维分布(我们必须首先开发关于四元数变量的指数级数).这允许进行"傅立叶"变换,从而产生可以变成已知SH项的东西. (3认同)

Nic*_*las 27

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

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

您还应该意识到,诸如"切换坐标,旋转退化,或使用两个重叠坐标系"之类的事情都需要付出努力.努力意味着代码.代码意味着性能.失去性能,当你不具备的不是许多3D应用程序是件好事.毕竟,如果只使用四元数,所有这些技巧都可以获得所需的一切.

我对数字问题不太确定,因为我不清楚这些(以及任何替代方案)是如何实现的.我已经读过,对四元数进行重新规范化比对旋转矩阵进行重新规范化更容易,但这只适用于一般矩阵; 一个旋转具有额外的约束,使得这些约束变得无足轻重(这些约束被内置到四元数的定义中)(事实上,这必须是真的,因为它们具有相同数量的自由度).

当处理方向的多个连续旋转时出现数值问题.想象一下,你在太空中有一个物体.每一次,你都会对它进行一点点偏航.每次更改后,您需要重新规范化方向; 否则,精确度问题就会蔓延开来.

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

它不会像4D矢量归一化那么快.这是四元数在连续旋转后用于标准化的内容.

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

还有另一个问题,矩阵不容易做到:两个不同方向之间的插值.

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

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

插值两个矩阵是非平凡的.至少,如果你想要一些类似于旋转矩阵的东西.毕竟,插值的目的是在两个变换之间产生一些中间的东西.

对于四元数,您只需要一个4D lerp,然后进行标准化.这就是全部:取两个四元数并线性插值组件.规范化结果.

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


Sag*_*ard 7

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

他们是很好的理由。

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

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

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

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

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


Kev*_*lan 6

意见:四元数很好.

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

轴(角度=轴的长度) 次要优点:小. 中等缺点:使用trig,乘法和应用于矢量的速度很慢. 中等缺点:北极奇点长度= 2*pi,因为所有轴方向都不起作用.更多代码(和调试),当它接近2pi时自动重新缩放它.


Mar*_*een 6

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

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

您可以在此处阅读该论文:https : //archive.org/details/collmathpapers01caylrich。但当时,四元数和旋转之间没有联系,Cayley 惊讶地发现有:

事实上,这些公式正是 M. Olinde Rodrigues Liouville 为这种变换给出的公式,电视,“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 参数化确实如此。很少有执行旋转的计算机程序可能真正实现作为一流复杂数学值的四元数类型。不幸的是,对四元数的作用的误解似乎已经在某处泄露,导致相当多的图形学生感到困惑,他们学习具有多个虚常数的复杂数学的细节,然后对为什么这可以解决旋转问题感到困惑。


Mik*_*ike 5

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

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

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


小智 5

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

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

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