为什么四元数用于旋转?

我是一名物理学家,一直在学习一些编程知识,并且遇到了很多使用四元数旋转的人,而不是用matrix/vectorforms写东西。

在物理学中,我们没有使用四元数有很好的理由(尽pipe偶尔讲述关于汉密尔顿/吉布斯等的奇怪故事)。 物理学要求我们的描述具有良好的分析行为(这有一个精确定义的含义,但是在某些技术方面远远超出了正常介绍类的教导,所以我不会详细讨论)。 事实certificate,四元数不具有这种好的行为,所以它们没有用,vector/matrix做,所以我们使用它们。

然而,受限于不使用任何分析结构的刚性旋转和描述,三维旋转可以用任何方式(或其他几种方式)等效描述。

通常,我们只需要一个点X =(x,y,z)到一个新的点X'=(x',y',z')的映射,受X 2 = X'2的限制。 还有很多事情是这样做的。

天真的方法是画出三angular形,并使用三angular函数,或者使用点(x,y,z)和vector(x,y,z)之间的同构和函数f(X)= X'和(x,y,z) T (a,b,c)(x',y',…)的matrixMX = X',或者使用四元数,或者沿着新的vector投影出旧vector的分量。 z')等

从math的angular度来看,这些描述在这个环境中是等价的(作为一个定理)。 他们都有相同数量的自由度,相同数量的限制等等。

那么,为什么四元数似乎更偏向于vector?

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

没有万向节锁的说法似乎很奇怪,因为这只是一个欧拉angular的问题。 这也只是一个坐标问题(就像极坐标中r = 0的奇点(雅可比行列式)),这意味着它只是一个局部问题,可以通过切换坐标,旋转退化,或者使用两个重叠的坐标系。

我对数字问题不太确定,因为我不清楚这些(以及其他方法)是如何实施的。 我已经读过,重新归一化四元数比旋转matrix更容易,但这只适用于一般matrix; 一个旋转具有额外的约束,这个约束(这是四元数定义内置的)(事实上,这是必须的,因为它们具有相同的自由度)。

那么,四元数使用vector或其他select的原因是什么?

万能锁是一个原因,虽然你说这只是一个欧拉angular的问题,很容易解决。 内存是一个问题,因为你只需要存储3个数字,欧拉angular仍然使用。

对于四元数与3×3旋转matrix,四元数在尺寸上(4个标量对9个)和速度(四元数乘法比3×3matrix乘法快得多)具有优势。

请注意, 所有这些旋转的表示都在实践中使用。 欧拉angular使用最less的记忆; matrix使用更多的记忆,但不受万向锁的影响,具有很好的分析性能; 而四元素打击了两者之间的一个很好的平衡,轻量级,但免费万向锁。

在物理学中,我们没有使用四元数有很好的理由(尽pipe偶尔讲述关于汉密尔顿/吉布斯等的奇怪故事)。 物理学要求我们的描述具有良好的分析行为(这有一个精确定义的含义,但是在某些技术方面远远超出了正常介绍类的教导,所以我不会详细讨论)。 事实certificate,四元数不具有这种好的行为,所以它们没有用,vector/matrix做,所以我们使用它们。

那么我也是一个物理学家呢 而有些情况下四元数只是简单的摇滚! 例如球面谐波。 你有两个primefaces散射,交换电子:什么是轨道自旋转移? 对于四元数,它只是乘法,即总结SH基函数的指数表示为四元数。 (把Legendre多项式变成四元数符号虽然有点乏味)。

但我同意,他们不是一个普遍的工具,特别是在刚体力学,他们将是非常麻烦的使用。 然而,引用伯特兰·罗素(Bertrand Russell)的话来回答一个学生,一个物理学家需要知道多lessmath: “尽可能多!”

无论如何:为什么我们喜欢计算机graphics学中的四元数? 因为他们有一些吸引人的属性。 首先可以很好地插入它们,如果是旋转的东西,比如关节周围的肢体,这是非常重要的。 用四元数就是标量乘法和标准化。 用matrix表示需要评估sin和cos,然后build立一个旋转matrix。 然后,将一个向量与一个四元数相乘,在经历一个完整的向量 – matrix乘法时仍然更便宜,如果之后再添加一个平移,它也会更便宜。 如果考虑人类angular色的骨骼animation系统,那么必须为大量的顶点评估大量的平移/旋转,这会产生巨大的影响。

使用四元数的另一个好的副作用是,任何变换本质上是正交的。 对于平移matrix,由于数字舍入误差,必须对每一对animation步骤重新进行正交归一化处理。

没有万向节锁的说法似乎很奇怪,因为这只是一个欧拉angular的问题。 这也只是一个坐标问题(就像极坐标中r = 0的奇点(雅可比行列式)),这意味着它只是一个局部问题,可以通过切换坐标,旋转退化,或使用两个重叠的坐标系统。

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

您还应该意识到,“切换坐标,退出简并,或使用两个重叠的坐标系”等都需要付出努力。 努力意味着代码。 代码意味着性能。 当你不需要的时候丢失性能对许多3D应用来说不是一件好事。 毕竟,所有这些技巧都可以得到,只要使用四元数就可以得到所需的一切。

我对数字问题不太确定,因为我不清楚这些(以及其他方法)是如何实施的。 我已经读过,重新归一化四元数比旋转matrix更容易,但这只适用于一般matrix; 一个旋转具有额外的约束,这个约束(这是四元数定义内置的)(事实上,这是必须的,因为它们具有相同的自由度)。

处理方向的多个连续旋转时出现数字问题。 想象一下你在太空中有一个物体。 而且每一个时间片,你都可以稍稍改变一下偏航。 每次更改后,您都需要重新校准方向; 否则,精度问题将蔓延,并搞砸了。

如果你使用matrix,每次你做matrix乘法,你必须重新正交matrix。 你正在正交化的matrix还不是一个旋转matrix,所以我不太确定这个简单的正交归一化。 不过,我可以肯定这一点:

它不会像四维vector归一化一样快。 这就是四元数在连续旋转后用来正常化的原因。

四元数正常化便宜。 即使专门的旋转matrix标准化也不会那么便宜。 表演很重要。

另外还有一个问题是matrix不容易做到:在两个不同的方向之间进行插值。

处理3Dangular色时,通常会有一系列的变换来定义angular色中每个骨骼的位置。 骨骼层次结构代表特定姿势中的angular色。

在大多数animation系统中,为了在特定时间计算字符的姿态,需要在变换之间进行插值。 这需要插入相应的转换。

内插两个matrix是非平凡的。 至less,如果你想要的东西最后类似于旋转matrix。 毕竟,插值的目的是在两个转换之间产生一个中间的东西。

对于四元数,所有你需要的是一个4D的lerp,然后是normalize。 这就是全部:取两个四元数并线性插入组件。 规范化结果。

如果你想要更好的质量插值(有时你可以),你可以带出球形的lerp 。 这使得插值对于更多不同的方向performance得更好。 这个math比四元数困难得多 ,需要更多的matrix运算。

意见:四元数很好。

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

轴(angular度=轴的长度) 次要优点 :小。 适度的缺点 :乘法和应用向量是缓慢的trig。 中等缺点 :长度方向的北极奇点= 2 * pi,因为所有的轴方向都不起作用。 更多的代码(和debugging),当它接近2pi时自动重新调整它。

一般来说,我们只需要一个点X =(x,y,z)到一个新的点X'=(x',y',z')的映射,受到X ^ 2 = X'^ 2的限制。 还有很多事情是这样做的。

我们绝对不只是想这样做。 有许多人错过了一个非常重要的微妙之处。 你正在讨论的构造(绘制三angular形和使用三angular等)将正确地将一个vector旋转到另一个vector。 但是有无数的旋转会做到这一点。 特别是,我可以在完成旋转之后来到,然后围绕X'向量旋转整个系统。 这根本不会改变X'的位置。 你的旋转和我的组合相当于另一次旋转(因为旋转形成一个组 )。 一般来说,你需要能够代表任何这样的旋转。

事实certificate,你只需要一个vector就可以做到这一点。 (这是旋转的轴angular表示 )。但是,在轴angular表示中组合旋转是困难的。 四元数与其他许多事情一起使得它变得容易。 基本上,四元数具有其他表示的所有优点,并没有任何缺点。 (虽然我承认可能有其他一些代表可能更好的具体应用。)

我看到的常见原因是没有灵活的locking或数字问题。

他们是很好的理由。

正如你已经理解的那样,四元数围绕任意轴编码一个单一的旋转,而不是欧拉三维空间中的三个连续旋转。 这使得四元数对万向节locking免疫 。

此外,一些forms的插值变得很好,很容易做,如SLERP 。

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

从性能angular度来看,为什么你的解决scheme更好?

我可以继续下去,但是四元数只是一个可以使用的工具。 如果他们不适合你的需求,那么不要使用它们。

值得注意的是,与旋转相关的所有属性都不是四元数的真正属性:它们是欧拉 – 罗德里格斯参数化的属性,它是用于描述3D旋转的实际4元素结构。

他们与四元数的关系纯粹是由于Cayley的论文“关于与四元数相关的某些结果”,作者观察到四元数乘法与欧拉 – 罗德里格(Euler-Rodrigues)参数组合的相关性。 这使得四元数理论的方面可以应用于旋转的表示,特别是在它们之间进行插值。

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

实际上,这些公式正好是由M. Olinde Rodrigues Liouville所作的这种转换所提供的,“电视节目”(或“梳理math杂志” iii。第224页[6])。 在这里先看看这些系数的出现,这将是一个有趣的问题。

然而,四元组没有任何内在的东西给旋转带来好处。 四元数不能避免万向锁; 欧拉罗德里格斯参数做。 非常less的执行旋转的计算机程序可能会真正实现四元数types,它们是一stream的复杂math值。 不幸的是,对四元数angular色的误解似乎已经泄漏出去,造成了不less困惑的graphics学生学习了具有多个虚构常量的复杂math的细节,然后又为什么这样解决了旋转的问题而困惑不解。

根据大卫Hestenes物理学家和工程师不知道如何繁殖载体。 我是一名工程师,在他的几何代数(又名克利福德代数)经过多年的经验之后,我必须承认他是对的。 这个代数以自然的方式代替复数,matrix,张量,四元数等。 如果你愿意学习这方面的知识,那就开始阅读吧。 真的,真的很有趣!