我是一名物理学家,并且一直在学习一些编程,并且遇到很多人使用四元数进行旋转而不是以矩阵/向量形式编写东西。
在物理学中,有很好的理由我们不使用四元数(尽管偶尔讲述汉密尔顿/吉布斯/等的奇怪故事)。物理学要求我们的描述具有良好的分析行为(这具有精确定义的含义,但是在一些相当技术的方面远远超出了正常介绍类中教导的内容,所以我不会详细讨论)。事实证明,四元数没有这种好的行为,因此它们没用,而矢量/矩阵也没用,所以我们使用它们。
但是,仅限于刚性旋转和不使用任何分析结构的描述,3D旋转可以用任何方式(或其他一些方式)等效地描述。
一般来说,我们只想要一个点X =(x,y,z)到一个新点X'=(x',y',z')的映射,受X 2 <的约束/ sup> = 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处的奇点(Jacobian松散等级)),这意味着它只是一个局部问题,并且可以通过切换坐标,旋转出简并性来解决,或使用两个重叠的坐标系。
我对数字问题不太确定,因为我不详细知道如何实现这些(以及任何替代方案)。我已经读过,对四元数进行重新规范化比对旋转矩阵进行重新规范化更容易,但这只适用于一般矩阵;一个旋转具有额外的约束,使得这些约束变得无足轻重(这些约束被包含在四元数的定义中)(事实上,这必须是真的,因为它们具有相同数量的自由度)。
那么使用四元数而不是向量或其他替代方法的原因是什么?
答案 0 :(得分:51)
万向节锁是一个原因,虽然你说它只是欧拉角的一个问题,很容易解决。当内存成为问题时,仍然使用欧拉角,因为您只需要存储3个数字。
对于四元数与3x3旋转矩阵,四元数具有大小优势(4个标量与9)和速度(四元数乘法比3x3矩阵乘法快得多)。
请注意,实际使用所有这些旋转表示。欧拉角使用最少的记忆;矩阵使用更多的内存,但不受万向节锁定的影响,并具有良好的分析性能;和四元数在两者之间取得了很好的平衡,轻巧,但没有Gimbal锁。
答案 1 :(得分:33)
在物理学中,有很好的理由我们不使用四元数(尽管偶尔讲述汉密尔顿/吉布斯/等的奇怪故事)。物理学要求我们的描述具有良好的分析行为(这具有精确定义的含义,但是在一些相当技术的方面远远超出了正常介绍类中教导的内容,所以我不会详细讨论)。事实证明,四元数没有这种好的行为,因此它们没用,而矢量/矩阵也没用,所以我们使用它们。
嗯,我也是一名物理学家。在某些情况下,四元数只是摇滚!例如球形谐波。你有两个原子散射,交换一个电子:轨道自旋转移是什么?对于四元数,它只是乘法,即将表示为四元数的SH基函数的指数相加。 (将勒让德多项式转换为四元数符号虽然有点单调乏味。)
但我同意,它们不是一种通用的工具,特别是在刚体力学中,它们使用起来非常麻烦。然而,引用Bertrand Russell的问题回答一个学生物理学家需要知道多少数学:“尽可能多!”
无论如何:为什么我们喜欢计算机图形学中的四元数?因为它们具有许多吸引人的特性。第一个可以很好地插入它们,这对于动画旋转的东西很重要,比如关节周围的肢体。使用四元数时,它只是标量乘法和标准化。用矩阵表示这一点需要评估sin和cos,然后建立一个旋转矩阵。然后将向量与四元数相乘仍然比通过完整的向量矩阵乘法更便宜,如果之后添加翻译,它仍然更便宜。如果你考虑一个人类角色的骨骼动画系统,那里必须为大量顶点评估大量的平移/旋转,这会产生巨大的影响。
使用四元数的另一个好的副作用是,任何变换本身都是正交的。对于翻译矩阵,由于数值舍入误差,必须对每一对动画步骤进行重新正规化。
答案 2 :(得分:23)
无万向节锁定论证似乎很奇怪,因为这只是欧拉角的一个问题。它也只是一个坐标问题(就像极坐标中r = 0处的奇点(Jacobian松散等级)),这意味着它只是一个局部问题,并且可以通过切换坐标,旋转出简并性来解决,或使用两个重叠的坐标系。
许多3D应用程序,例如使用欧拉角定义对象的方向。特别是对于飞行模拟游戏,它们代表了一种理论上有用的方式,可以以易于修改的方式存储方向。
您还应该意识到,诸如“切换坐标,旋转退化,或使用两个重叠坐标系”之类的事情都需要付出努力。努力意味着代码。代码意味着性能。当你没有拥有时失去性能对许多3D应用程序来说不是一件好事。毕竟,如果只使用四元数,所有这些技巧都可以获得所需的一切。
我对数字问题不太确定,因为我不详细知道如何实现这些(以及任何替代方案)。我已经读过,对四元数进行重新规范化比对旋转矩阵进行重新规范化更容易,但这只适用于一般矩阵;一个旋转具有额外的约束,使得这些约束变得无足轻重(这些约束被包含在四元数的定义中)(事实上,这必须是真的,因为它们具有相同数量的自由度)。
在处理方向的多个连续旋转时会出现数值问题。想象一下,你在太空中有一个物体。每一次,你都会对它进行一点点偏航。每次更改后,您需要重新规范化方向;否则,精确度问题就会蔓延并搞砸了。
如果使用矩阵,每次进行矩阵乘法时,必须重新对矩阵进行正交归一化。你正交归一化的矩阵不是还一个旋转矩阵,所以我不太确定那个简单的正交归一化。但是,我可以肯定这一点:
它不会像4D矢量归一化那么快。这就是四元数在连续旋转后用于标准化的原因。
四元数归一化很便宜。即使是专门的旋转矩阵归一化也不会 便宜。再次,性能很重要。
另一个问题是矩阵不容易做到:在两个不同方向之间进行插值。
处理3D角色时,通常会有一系列转换来定义角色中每个骨骼的位置。此骨骼层次结构表示特定姿势中的角色。
在大多数动画系统中,要在特定时间计算角色的姿势,可以在变换之间进行插值。这需要插入相应的变换。
插值两个矩阵是......非平凡的。至少,如果你想要一些类似于旋转矩阵的东西。毕竟,插值的目的是在两个转换之间产生一些分开的东西。
对于四元数,您只需要4D lerp,然后进行标准化。这就是全部:取两个四元数并线性插值组件。规范化结果。
如果你想要更好的插值质量(有时你想做),你可以带出spherical lerp。这使得插值对于更不同的方向表现得更好。这个数学很多更难,并且需要比四元数更多的矩阵运算。
答案 3 :(得分:6)
意见:四元数很好。
旋转矩阵: 次要缺点:矩阵的乘法比四元数慢〜2倍。 次要优势:矩阵向量乘法快〜2倍,大。 巨大 劣势:规范化! Ghram-Shmit是不对称的,在进行微分方程时不会给出更高阶的准确答案。更复杂的方法非常复杂和昂贵。
轴(角度=轴的长度) 次要优势:小。 中等劣势:使用trig,乘法和应用于向量的速度很慢。 中等劣势:长度为2 * pi的北极奇点,因为所有轴方向都不起作用。更多代码(和调试),当它接近2pi时自动重新缩放它。
答案 4 :(得分:5)
通常,我们只想要一个点X =(x,y,z)到一个新点X'=(x',y',z')的映射,受X ^ 2 = X'约束的约束^ 2。并且有很多事情可以做到这一点。
我们绝对不会 。 lots of people miss有一个非常重要的微妙之处。您正在谈论的构造(绘制三角形并使用trig等)将正确地将一个向量旋转到另一个向量中。但是有无限多的旋转可以做到这一点。特别是,我可以在完成旋转之后出现,然后围绕X'向量旋转整个系统。这根本不会改变X'的位置。你的旋转和我的组合相当于另一个旋转(因为旋转form a group)。通常,您需要能够表示任何此类轮换。
事实证明,你可以只用一个向量来做到这一点。 (那是axis-angle representation of rotations。)但是在轴角表示中组合旋转是困难的。四元数很容易,还有很多其他的东西。基本上,四元数具有其他表示的所有优点,并没有任何缺点。 (虽然我承认可能会有一些特定的应用程序,其他一些表示可能会更好。)
答案 5 :(得分:3)
我看到的通常原因是没有灵活锁定或数字问题。
他们是很好的理由。
正如您已经了解的那样,四元数围绕任意轴编码单个旋转,而不是欧拉3空间中的三个顺序旋转。这使得四元数immune to gimbal lock。
此外,某些插值形式变得美观且容易,例如SLERP。
......或使用两个重叠的坐标系。
从性能角度来看,为什么您的解决方案更好?
我可以继续,但四元数只是一种可能的工具。如果它们不符合您的需求,请不要使用它们。
答案 6 :(得分:3)
值得注意的是,与旋转相关的所有属性都不是四元数的真正属性:它们是 Euler-Rodrigues Parameterisations 的属性,它是用于描述的实际4元素结构3D旋转。
他们与四元数的关系纯粹是由于凯利的一篇论文,“关于与四元数相关的某些结果”,其中作者观察了四元数乘法与欧拉 - 罗德里格斯参数组合之间的相关性。这使得四元数理论的各个方面能够应用于旋转的表示,尤其是在它们之间进行插值。
您可以在此处阅读论文:https://archive.org/details/collmathpapers01caylrich。但当时,Quaternions和旋转之间没有任何联系,Cayley对于发现有以下情况感到惊讶:
事实上,这些公式恰恰是M. Olinde对这种转变所给出的公式 Rodrigues Liouville,t。 v。,“Desloisgéométriquesquiégissentlesdéplacements'un systèmesolide[...]“(或Comb.Math.Journal,t.iii。第224页[6])。这将是一个有趣的 这里考虑这些系数的出现,先验问题。
然而,四元数没有任何内在因素可以为旋转带来任何好处。四元数不会避免万向节锁定; Euler-Rodrigues参数确实如此。很少有执行旋转的计算机程序可能真正实现作为一流复杂数学值的四元数类型。不幸的是,对Quaternions角色的误解似乎已经泄露到某个地方,导致相当多的困惑的图形学生学习复杂数学的细节与多个想象常数然后感到困惑,为什么这解决了旋转问题。
答案 7 :(得分:0)
某人可能会读到的答案: 所有表示形式都有乏味的问题。四元数小于矩阵,但四元数乘法不仅是矢量点积之类的东西,而且实际上在计算机上花费的时间比两个3x3矩阵的点积还多。 (计算机非常擅长使用普通矩阵进行操作)
矩阵还有其他令人讨厌的功能。例如,从长远来看,它们不是稳定的生物。在3D空间中对旋转进行建模时,通常通常将旋转彼此叠加到一个Orientation矩阵中,该矩阵只是存储参考框架方向的单个旋转矩阵。 在数百万次加法过程中,此过程将导致O矩阵偏离严格的旋转矩阵形式。 可以通过定期重新配置矩阵来避免此情况,但是在某些情况下这并非不重要。即单位矩阵的不旋转情况。
您可能想要找到旋转的轴角表示(或四元数表示),然后为该矩阵生成矩阵。大多数算法会产生零向量,然后在这种情况下会遇到零除。 在这种情况下,尝试使用“如果为0,则...”类型的解决方案来避免此类情况通常也是一个糟糕的主意,因为a)分叉速度慢,并且b)除奇异并最终导致可怕的错误。
答案 8 :(得分:0)
单位四元数提供了三维正交群 O(3) 的紧凑表示,尤其是它的子群,三维特殊正交群 SO(3)。这有很多用途,但我最了解的是它在使用加速器和陀螺仪的捷联排列的惯性导航系统中的用途。 SO(3) 的一个元素用于表示车辆在地球上的“位置”(或者更确切地说是一个近似地球表面的球体。)另一个用于指定车辆的“姿态”,即关系其车身框架与局部切平面的关系。这两者都通过小的变化(10Hz 或更小的时间增量)“集成”以使用新数据更新它们。 “姿态”和“位置”旋转形成了一个“耦合”的微分系统,因为施加到车辆车身的力在局部切平面中分解以更新车辆的“位置”旋转。
四元数很容易以这种方式集成(四个四元数加法。)“集成”后,结果将不再是 SO(3) 的成员,而是简单的重新规范化将集成的四元数“投影”到 SO(3) 上再次。一个只使用并保留每个四元数的 4 个值。
利用四元数积分来实现惯性导航已经是 1980 年代的行业标准。我所知道的第一篇提出这个的论文发表于 1973 年。当时数学学生只被介绍给四元数作为代数中的“奇数”例子(非交换除法环)。
然而,四元数现在是 SO(3) 在许多应用程序(例如,计算机图形学)中的首选表示。从数学的角度来看,它甚至更有趣,因为它提供了可能的最简单的“流形微积分”示例! (球体是一个简单的流形,SO(3) 是一个李群。)