从 Geometric Algebra 交互式入门 Rotors:告别四元数
让我们从每个 3D 引擎中移除 Quaternions
(从 Geometric Algebra 交互式入门 Rotors) Marc ten Bosch
目前为止,我见过的关于 3D geometric algebra 最清晰的 15 分钟解释 —BrokenSymmetry 我被说服了。虽然我可以理解 Quaternions,但这种思考方式是一种更直观、更优雅的方法。 —Jack Rasksilver 这为教育材料树立了高标准,并且是利用当今技术改进教育的一个光辉典范。 —Sebastien Pierre 当我在大学时,我问一位数学教授,为什么两个向量的叉积会产生一个垂直向量,其大小等于这两个向量形成的平行四边形的面积。比如……什么?为什么?2D 呢?他们敷衍了我,这也是我停止在大学学习数学的一个重要原因。[...] 不管怎样,我几乎放弃了真正理解所有看似无关的叉积类型的混乱。但后来我看到了这个:哇。仅仅 15 分钟,很多东西突然变得更有意义了,而不仅仅是叉积。 —Mason Remaley
为了表示 3D 旋转,图形程序员使用 Quaternions。 然而,Quaternions 是按表面价值教授的。 我们只是接受它们奇怪的乘法表和其他神秘的定义,并将它们用作黑盒子,以我们想要的方式旋转向量。 为什么 i2=j2=k2=−1 且 ij=k? 为什么我们要将一个向量升级为一个“虚”向量来转换它,比如 q(xi+yj+zk)q∗? 只要它以正确的方式旋转向量,谁在乎呢,对吧?
就我个人而言,我一直觉得真正理解我正在使用的东西非常重要。 我记得学习叉积和 Quaternions 时,我对它们为什么这样工作感到困惑,但没有人谈论它。 后来,我了解了 Geometric Algebra,突然我明白了,我提出的问题是合理的,一切都变得清晰多了。
在 Geometric Algebra 中,有一种表示旋转的方法称为 Rotor,它推广了 Quaternions(在 3D 中)和复数(在 2D 中),甚至适用于任意数量的维度。
在某种意义上,3D Rotors 是 Quaternions 的真实形式,或者换句话说,Quaternions 是 Rotors 的混淆版本。 它们是等效的,因为:
- 它们具有相同数量的组件,
- 它们的 API 相同,
- 它们同样高效,
- 它们擅长插值并避免万向节锁等等……
- 事实上,它们是同构的,
因此,可以进行一些数学运算将 Rotor 转换为 Quaternion,但这样做会使它们不那么通用且不那么直观(并失去额外的功能)。
但是,与其凭空定义 Quaternions 并试图追溯性地解释它们的工作原理,不如几乎从头开始解释 Rotors。 显然,这需要更多时间,但我发现这非常值得,因为它使它们更容易理解!
例如,Quaternions 被介绍为这种神秘的四维对象,但是为什么要引入第四个空间维度来可视化一个 3D 概念呢? 相比之下,3D Rotors 不需要使用第四个空间维度即可可视化。
试图将 Quaternions 可视化为在 4D 中操作,只是为了解释 3D 旋转,有点像试图从以地球为中心的角度理解行星运动,即过于复杂,因为您是从错误的视角看待它的。
如果我们能开始逐步淘汰 Quaternions 的使用和教学,并用 Rotors 替换它们,那就太好了。 这种改变很简单,并且代码几乎保持不变,但理解会大大提高。
顺便说一句,Geometric Algebra 包含的不仅仅是 Rotors,它也是一个非常有用的工具。 本文也可以作为对它的介绍。
(在下面的文章中,每个图表都是交互式的。视频紧随文章之后,您可以按下 按钮来播放视频的相关部分。 相反,您可以按下
按钮转到文章中与视频当前播放时刻对应的部分。 您可以最大化您的窗口以获得更多视频空间,或者您可以按下
按钮将其设置为固定大小。)
旋转平面
旋转发生在 2D 平面中 
在 3D 中,我们通常认为旋转是围绕轴发生的,就像轮子绕着它的轴旋转一样,但是与其考虑轴,不如更正确的方式是考虑轮子所在的平面,该平面垂直于轴。
这位老妇人正在 xz 平面内旋转轮子,该平面垂直于 y 轴。
这是因为如果我们把一个向量分成两部分,一部分位于平面内 (v∥),另一部分位于平面外 (v⊥),则旋转会旋转内部部分,同时保持外部部分不变。
在 yx 平面内的旋转 [拖动任意位置以移动相机]
在 2D 中,只有一个平面可以旋转(没有外部部分)。 因此,认为旋转是围绕第三个轴(垂直于 2D 平面)发生的,从技术上讲是不正确的,因为我们不应该需要引入另一个维度来执行旋转。
如果您告诉一个 2D“平面人”(他生活在一个 2D 平面内,并且只经历过 2D)关于垂直旋转轴,他们会看着你并问:“轴沿哪个方向指向?我无法想象!”
[旁注] 并且在更高的维度(4D 及以上)中,不可能为 2D 平面定义单个法向量(例如,在 4D 中,2D 平面有两个法线方向,在 5D 中有三个法线方向,在 nD 中有 n−2 个法线方向)
显式旋转方向 
此外,当考虑围绕轴旋转时,旋转方向是未定义的,因此需要通过约定来定义(通过所谓的“右手规则”)。
但是,如果我们认为旋转发生在平面内,则方向很明确:在 xy 平面内的旋转意味着将(单位)向量 x 旋转到(单位)向量 y 的旋转,它们在平面内一起形成。 在 yx 平面内的旋转是相反的旋转:它将向量 y 旋转到向量 x。
[旁注] 当我第一次学习沿正交平面的三个 3D 旋转矩阵时,我记得在想,为什么 Ry 矩阵的符号相反? 这是因为“右手规则”,我们必须将绕 y 轴的旋转定义为从 z 到 x 而不是从 x 到 z,以保持一致的右手旋转方向。 当我们直接谈论平面本身时,该约定变得不必要。
RX(θ)=[1000cos(θ)−sin(θ)0sin(θ)cos(θ)]RY(θ)=[cos(θ)0sin(θ)010−sin(θ)0cos(θ)]RZ(θ)=[cos(θ)−sin(θ)0sin(θ)cos(θ)0001]
Bivectors
外积 
为了计算旋转轴以将一个向量 a 旋转到另一个向量 b,我们取这两个向量的叉积以获得一个垂直于两者的向量。 但是为什么要“离开”平面,因为旋转本质上是 2D 的东西?
相反,我们采用所谓的 外积(也称为 exterior 或 wedge product)这两个向量,构建一个名为 bivector(或 2-vector)B 的新元素,该元素表示两个向量共同形成的平面。 如果叉积创建平面的法向量,则外积创建平面本身。 取平面的法线是多余的。
B=a∧b
B 可以表示为由向量 a 和 b 构建的平行四边形,位于它们共同形成的平面中。
bivector 的概念起初可能看起来有点奇怪,但它们几乎与向量一样基本,我们将会看到。 如果向量像一条线,那么 bivector 就像一个平面……外积的属性适合捕捉平面的属性。
Bivectors 的基 
Bivectors 具有分量,就像向量一样。 但它们是根据基平面而不是像向量一样的基线定义的。
三个正交的基平面是 x∧y、x∧z 和 y∧z,如右图所示。
但首先让我们看一下更简单的 2D 情况……
2D Bivectors 
在 2D 中,只有一个平面,即 xy 平面。 因此,2D bivector 只有一个分量。 对于由向量 a 和 b 构建的 bivector,该数字 Bxy 等于两个向量共同形成的平行四边形的(有符号)面积。
B=a∧b=Bxy(x∧y)
您可以通过调整它所组成的(单位)向量,在以下交互式图表中玩转 2D bivector:
您可以看到,通过改变向量之间的角度,平行四边形的面积会发生变化(根据角度的正弦)。
如果向量相同或平行,则它们不会形成一个合适的平面,结果为零。 这个简单的属性定义了 bivector 是什么:
a∧a=0
通过查看两个向量的和,我们可以看到此属性意味着以下内容:
(a+b)∧(a+b)=0a∧a+b∧a+a∧b+b∧b=0b∧a+a∧b=0
因此:
a∧b=−b∧a
就像旋转的方向很重要一样,外积的参数顺序也很重要。 交换参数会更改结果的符号(这称为“反对称”)。
在图中,符号用颜色表示,颜色从蓝色变为绿色。 每当从 a 到 b 的旋转从顺时针变为逆时针时(即,如果它与(x 到 y)方向或(y 到 x)方向匹配),符号就会改变。
您可以看到外积的属性如何适合捕捉平面和旋转的属性。
来自非单位向量的 2D Bivectors 
向量显然不必是单位长度,在此图中,限制已删除:
平行四边形的有符号面积与两个向量的长度成正比:Bxy=sin(α)‖a‖‖b‖,其中 α 是 a 和 b 之间的角度。 因此,例如,将一个向量的长度加倍会使面积加倍。
我们可以通过以分量形式插入向量来获得实际值:
a∧b=(axx+ayy)∧(bxx+byy)=axbx(x∧x)+axby(x∧y)+aybx(y∧x)+ayby(y∧y)=axby(x∧y)+aybx(y∧x)=axby(x∧y)−aybx(x∧y)=(axby−aybx)(x∧y)
Bxy=axby−bxay
3D Bivectors 
就像向量 v 的坐标可以被认为是向量在三个正交基轴(x、y、z)上的投影一样,bivector B 的坐标可以被认为是小平面在三个正交基平面上的投影。
向量的投影是向量沿每个基向量的长度,而 bivector 的投影是平面在每个基平面上的面积。
对于一个向量:
v=vxx+vyy+vzz
对于一个 bivector:
B=Bxy(x∧y)+Bxz(x∧z)+Byz(y∧z)
其中 Bxy,Bxz,Byz 只是像 vx,vy,vz 这样的数字(它们被加下划线以匹配图表的颜色)。
3D bivector 的分量只是 bivector 在 2D 基平面上的三个 2D 投影。
使用与之前相同的方法,我们发现分量的实际值看起来很像 2D 情况下的 XY 分量,但应用于所有三个平面:
Bxy=axby−bxay Bxz=axbz−bxaz Byz=aybz−byaz
您可以在以下交互式图表中玩转 3D bivector:
外积是否让您想起任何东西? 在 3D 中,外积的定义与叉积的定义非常相似。 事实上,在 3D 中,来自叉积的向量(例如法向量)将具有三个分量,这些分量等于 bivector 的分量(数字相同,但基不同)。
a∧b=(axby−bxay)(x∧y)+(axbz−bxaz)(x∧z)+(aybz−byaz)(y∧z)a×b=(axby−bxay)z−(axbz−bxaz)y+(aybz−byaz)x
[旁注] 我为基选择了字典顺序,但是选择 z∧x 而不是 x∧z 会使符号相同,并且也会使 bivector 基 方向一致。 这就是右手规则,除了可以理解的非任意版本 :)。
另一方面,在 4D 中没有等效的排序(这些应该翻转哪些? xy、xz、xw、yz、yw、zw),所以我更喜欢字典顺序,因为它更通用且更易于记住。 我从不看数学代码,反正我都是自动生成它的,所以符号细节对我来说并不重要!
因此,对于任何一种排序都有很好的理由。
bivector 定义在几何上是有意义的,而不是凭空出现的。 我记得当我学习叉积时,我当时在想,它为什么会返回一个长度等于两个向量形成的平行四边形面积的向量? 这感觉太随意了。 为什么允许您将平行四边形的面积转换为向量的长度?
向量和 Bivectors 的语义 
在 3D 中,bivector 有三个坐标,每个平面一个:(xy、xz 和 yz)。 向量也有三个坐标,每个轴一个(x、y 和 z)。 每个平面都垂直于一个轴。 这是一种巧合,仅发生在三维**(*)中,这就是历史上我们将 bivectors 与向量混淆的原因**。
[旁注] (*) 在 2D 中只有一个基 bivector (xy),在 3D 中有 3 个基 bivector (xy,xz,yz),在 4D 中有 6 个基 bivector (xy,xz,xw,yz,yw,zw) 等等……
用编程术语来说,它们都具有相同的内存布局,但操作不同。 使用 3D 向量代替 3D bivector 就像“类型转换” bivector。
这是一个例子:您可能已经看到法向量的变换方式与常规向量不同,使用矩阵的“逆转置”(MT)−1 而不是矩阵本身。 这是因为它们实际上不是向量,而是实际上是 bivector,我们已将其“类型转换为”向量。 在物理学中,有一种称为“轴向向量”的技巧,该技巧的引入是为了区分来自叉积的向量与常规向量。 Bivector 是对象的实际“类型”,应该这样考虑和操作它。
[旁注] Trivectors 
我们可以继续采用外积,不仅构建定向 2D 区域,还构建定向 3D 体积。 可以通过两次采用外积来构建 trivector T:
T=a∧b∧c
在 3D 中,它会在那里停止。 就像在 2D 中只有一个平面填充所有 2D 空间一样,在 3D 中只有一个体积填充所有 3D 空间。
[但是在 nD 中,我们可以继续构建更多向量的外积,直到达到第 n 个维度。 例如,在 4D 中,我们有四个基 tri-vectors (xyz,xyw,xwz,yzw) 和一个基 4-vector xyzw]
在 3D 中,trivector 只有一个基分量 (Txyz),等于由三个向量生成的平行六面体的体积。 三重外积是标量三重积 ((a×b)⋅c) 的更好版本,因为它只涉及一种运算,返回正确的类型(体积而不是标量),并且适用于任意数量的维度。
T=Txyzx∧y∧z
几何积
将向量相乘 
几何积 ab(用无符号表示)是可以在向量上执行的另一种运算。 几何积的定义是,向量具有逆(即 aa−1=1,其中 1 只是数字 1!)并且具有良好的属性,例如结合律 (a(bc)=(ab)c)。 目标是能够将向量相乘,以便像矩阵一样,乘法对应于几何运算。
[旁注] 具有逆很有用,这样无论对象 aa−1 是什么,它都不会对向量产生影响,即它只会像乘以数字 1 一样起作用
为了定义乘积,首先注意可以将乘积(或任何采用两个参数的函数)拆分为两部分之和,一部分在交换参数时不会改变,而另一部分会改变,方法如下:
ab=12(ab+ab+ba−ba)=12(ab+ba)+12(ab−ba)
第一项不再依赖于参数 a 和 b 的顺序(它被称为“对称”部分),而第二项在交换参数时会改变符号(它被称为“反对称”部分)。
两个向量的点积(也称为内积)是对称的,并且是距离的度量 (a⋅a=‖a‖2),因此在几何上将其设置为等于对称部分听起来很有用:
12(ab+ba)=a⋅b
相似地,两个向量的外积是反对称的,因此在几何上将其设置为等于反对称部分听起来很有用:
12(ab−ba)=a∧b
此外,点积包含两个向量之间角度的余弦 (a⋅b=‖a‖‖b‖cos(α)),而外积包含角度的正弦。 它们共同完整地描述了向量之间的角度以及它们形成的平面。
[旁注] 描述的完整性使得乘积可逆,因为我们可以使用其乘积中包含的信息从一个向量获得另一个向量。 如果我给你 a 和 ab,你可以得到 b。 这不能仅用余弦或仅用正弦/平面来完成。
因此,几何积是:
ab=a⋅b+a∧b
这很奇怪,因为将两个向量相乘会得到两个不同事物的总和:标量和 bivector。 然而,这类似于复数是标量和“虚”数之和,因此您可能已经习惯了它。 在这里,bivector 部分对应于复数的“虚”部。 除了它不是“虚构的”,它只是一个 bivector,我们有一个具体的画面!
基本上,通过将两个向量相乘,我们计算出关于它们的有用属性(“它们在彼此上的投影的长度”/“角度的余弦” (a⋅b),以及“它们共同形成的平面”/“角度的正弦” (a∧b)),我们通过“加号”将它们捆绑在一起。 几何积还为这些“属性包”提供了可以应用于它们的运算,并且这些运算具有几何解释(例如:旋转和反射向量),正如我们现在将看到的。
[旁注] 可以用正弦和余弦表示几何积:ab=‖a‖‖b‖(cos(α)+sin(α)B),其中 B 是由两个单位垂直向量制成的,在两个向量平面上的 bivector。
乘法表 
乘法表有助于使该乘积更具体:让我们看看如果我们取基向量 (x,y,z) 的乘积会发生什么。
对于任何基向量,例如 x 轴,结果为 1:
xx=x⋅x+x∧x=1
对于任何一对基向量,例如 x 和 y 轴,结果只是它们共同形成的 bivector:
xy=x⋅y+x∧y=x∧y
(所以我们可以简单地将 x∧y 称为 xy,因为它们是同一件事!对于基向量,以及垂直的向量(即点积等于零的向量)来说,这是正确的)
这给出了下表:
ab | b ---|--- x | y | z a | x | 1 | xy | xz y | −xy | 1 | yz z | −xz | −yz | 1
它基本上是微不足道的,不像 quaternion 表格。
[旁注] 例如,将两个向量 (5,3,0) 和 (2,0,1) 相乘: (5x+3y)(2x+1z)=52xx+51xz+32yx+31yz=10+5xz−6xy+3yz
反射公式(传统版本) 
向量反射 [您可以移动每个向量]
如果我们有一个单位向量 a 和一个向量 v,我们可以通过垂直于 a 的平面反射 v。
这是以通常的方式完成的:我们将 v 分解为垂直于平面的部分 v⊥=(v⋅a)a,以及平行于平面的部分 v∥=v−v⊥=v−(v⋅a)a。
然后,为了反射向量,翻转垂直部分,同时保持平行部分不变:
Ra(v)=v∥−v⊥=(v−(v⋅a)a)−((v⋅a)a)=v−2(v⋅a)a
反射公式(几何积版本) 
此时,我们可以用它的几何积版本 12(va+av) 替换点积 v⋅a,以获得以下内容:
Ra(v)=v−2(12(va+av))a=v−va2−ava=−ava
(a2=a⋅a=1 因为 a 是一个单位向量)
这说的是完全相同的事情,但使用不同的符号。 使用简单的乘积符号而不是公式来编码基本运算(例如反射)将被证明非常有用!
[旁注] 如果您想知道多次采用几何积如何工作,只需查看基向量并使用结合律即可。 只有四种可能的情况: x(xx)=x1=xx(xy)=(xx)y=yx(xz)=(xx)z=zx(yz)=xyz
结果是:向量、向量、向量、trivector。 但是最后一种情况只有在三个向量都是独立的时才会发生,−ava 永远不会发生这种情况
您也可以交换一对元素。 这会翻转符号,因为元素对是 bivectors。 您可以这样做,直到获得可以组合为 1 的对: y(xy)=yxy=−xyy=−x
这给出了以下向量和 bivector 相乘的表格:
aB | B ---|--- xy | xz | yz a | x | y | z | xyz y | −x | −xyz | z z | xyz | −x | −y
[旁注] 对于那些好奇的人来说,可以在几何积方面查看 −ava 的每个步骤发生了什么。
- 第一步是:
va=v⋅a+v∧a
如果像之前一样,我们将 v 分成垂直于平面的部分 (v⊥) 和平行于平面的部分 (v∥),我们得到: (v⊥+v∥)a=(v⊥+v∥)⋅a+(v⊥+v∥)∧a=v⊥⋅a+v∥⋅a+v⊥∧a+v∥∧a v∥⋅a=0 因为这些向量是垂直的,而 v⊥∧a=0 因为这些向量是平行的。 va=v⊥⋅a+v∥∧a
第一项只是 v 在 a 上的投影的长度,即第一项只是 v⊥ 的长度。
让我们称 ^v∥ 为 v∥ 的归一化版本,使得 v∥=^v∥‖v∥‖。 那么第二项只是一个 bivector B=^v∥∧a 乘以 v∥ 的长度。
这个 bivector B 是由两个垂直单位向量制成的,所以它是向量 a 和 v 的平面的一种非常纯粹的表示。 它不包含关于它们的相对角度或长度的信息,只包含平面的方向。
因此,这两个项只是将 v 分解为两个正交投影(v∥ 和 v⊥),以及它们形成的的平面 (B): ‖v⊥‖+‖v∥‖B
在继续下一步之前,我们可以用几何积替换外积,因为 a 和 v∥ 是垂直的,所以它们的外积和几何积是等效的(因为它们几何积的点积部分为零)。
v⊥⋅a+v∥∧a=v⊥⋅a+v∥a
- 第二步是:
ava=a(v⊥⋅a)+av∥a
第一项只是 v 沿 a 的分量,即 v 垂直于平面的分量。 换句话说,第一项只是 v⊥。
ava=v⊥+av∥a
由于(再次)a 和 v∥ 是垂直的,所以它们的几何积只是它们的外积,所以我们可以交换它们并否定符号。
\begin{eqnarray}\mathbf{a} \mathbf{v} \mathbf{a} &=& \mathbf{v}\perp - \mathbf{v}\parallel \mathbf{a} \mathbf{a} \\ &=& \mathbf{v}\perp - \mathbf{v}\parallel\end{eqnarray}
- 最后一步翻转符号:
-\mathbf{a} \mathbf{v} \mathbf{a} = -\mathbf{v}\perp + \mathbf{v}\parallel
所以我们看到,\mathbf{v} 垂直于平面的分量被翻转了,而平行部分保持不变!
[旁注] \mathbf{a} 的长度不是很重要,所以以下内容忽略了它,但如果 \mathbf{a} 不是一个单位向量,我们必须除以它的长度,公式变为 - \mathbf{a} \mathbf{v} \mathbf{a}^{-1},这看起来更像您可能习惯的“Sandwich Product”。
两次反射是一次旋转:2D 情况 
事实证明,如果我们对 \mathbf{v} 应用两次连续的反射(使用向量 \mathbf{a},然后使用向量 \mathbf{b}),我们得到一次旋转,旋转角度是向量 \mathbf{a} 和 \mathbf{b} 之间角度的两倍。
您可以在下图应用每个连续的反射步骤:
您还可以更改向量 \mathbf{a}、\mathbf{b} 和 \mathbf{v},但是图表中向量的初始配置(单击“重置向量位置”按钮)应该特别清楚为什么旋转最终是角度的两倍。 另一个不错的配置是将 \mathbf{a} 和 \mathbf{b} 设置为 \mathbf{x} 和 \mathbf{y} 轴。
两次反射是一次旋转:3D 情况 
在 3D 情况下,向量 \mathbf{v} 可以分成两个不同的部分,一个部分位于由 \mathbf{a} 和 \mathbf{b} 定义的平面内,另一部分位于平面外(垂直于平面)。 如下图所示,当向量被每个平面反射时,它的外部部分保持不变。 因此,对于内部部分,我们回到了 2D 情况,它只是旋转了两倍的角度!
Rotors 
就几何积而言,两次反射只是对应于:
R_{\mathbf{b}}(R_{\mathbf{a}}(\mathbf{v})) = - \mathbf{b} (-\mathbf{a} \mathbf{v} \mathbf{a}) \mathbf{b} = \mathbf{b} \mathbf{a} : \mathbf{v} : \mathbf{a} \mathbf{b}
我们称 \mathbf{a} \mathbf{b} = \mathbf{a} \cdot \mathbf{b} + \mathbf{a} \wedge \mathbf{b} 为 Rotor,因为通过在向量的两侧乘以 \mathbf{a} \mathbf{b},我们执行旋转(\mathbf{b} \mathbf{a} 与 \mathbf{a} \mathbf{b} 相同,只是 bivector 部分被翻转了)。
在向量的两侧应用 Rotor \mathbf{a} \mathbf{b} 会使该向量在向量 \mathbf{a} 和 \mathbf{b} 的平面内旋转,旋转角度是 \mathbf{a} 和 \mathbf{b} 之间角度的两倍。
✨⭐💖 这就是全部! 💖⭐✨
3D Rotors 与 Quaternions 
我们可以注意到,3D Rotors 看起来很像 Quaternions:
a + B_{xy} \ \mathbf{x} \wedge \mathbf{y} + B_{xz} \ \mathbf{x} \wedge \mathbf{z} + B_{yz} \ \mathbf{y} \wedge \mathbf{z}
a + b \ \mathbf{i} + c \ \mathbf{j} + d \ \mathbf{k}
事实上,代码/数学基本上是一样的! 主要区别在于 \mathbf{i}、\mathbf{j} 和 \mathbf{k} 被替换为 \mathbf{y} \wedge \mathbf{z}、\mathbf{x} \wedge \mathbf{z} 和 \mathbf{x} \wedge \mathbf{y},但它们的工作方式大致相同。 这是 代码比较。 我没有包括所有内容,例如用于插值的 log/exp,但它们很容易制作。
但是,正如我们所见,3D Rotors 是一个 3D 概念,不需要使用“4D 双旋转”或“立体投影”来可视化。 试图将 Quaternions 可视化为在 4D 中操作,只是为了解释 3D 旋转,有点像试图从以地球为中心的角度理解行星运动,即过于复杂,因为您是从错误的视角看待它的。
正如我们所见,将旋转表示为在平面内而不是围绕向量进行操作会有很大帮助。 例如,基 bivectors 的平方为 -1,就像基 quaternions 一样 (\mathbf{i}^2=\mathbf{j}^2=\mathbf{k}^2 = -1) :
(\mathbf{x} \mathbf{y})^2 = (\mathbf{x} \mathbf{y}) (\mathbf{x} \mathbf{y}) = - (\mathbf{y} \mathbf{x}) (\mathbf{x} \mathbf{y}) = -\mathbf{y} (\mathbf{x} \mathbf{x}) \mathbf{y} = - \mathbf{y} \mathbf{y} = -1
将两个 bivectors 相乘会得到第三个 bivector,但这基本上是微不足道的,我们不必记住如何 \mathbf{i} \mathbf{j} = \mathbf{k}:
(\mathbf{x} \mathbf{y}) (\mathbf{y} \mathbf{z}) = \mathbf{x} (\mathbf{y} \mathbf{y}) \mathbf{z} = \mathbf{x} \mathbf{z}
(注意我们使用了 \mathbf{x} \wedge \mathbf{y} = \mathbf{x} \mathbf{y})
这些属性是几何积的结果,而不是凭空出现的!
进一步阅读
(顺便说一句,Geometric Algebra 包含的比 rotors 酷得多的东西!)
- Linear and Geometric Algebra by Macdonald (2011) [Amazon Link] 清晰简洁,但更像是一本经典的数学教科书。 旨在取代本科线性代数教科书。
- Geometric Algebra For Computer Science by Dorst et al. (2007) [[Amazon Link](https://marctenbosch.com/quaternions/<http:/www.amazon.com/gp/product/0123749425/ref=as_li_tf_tl?ie=UTF8&camp=