让我们从所有3D引擎中删除四元数

图片

图形程序员使用四元数记录三维转弯。 但是, 四元数很难理解,因为对它们进行了肤浅的研究 。 我们只是对信念采用奇怪的乘法表和其他隐式定义,并将它们用作“黑匣子”,根据需要旋转矢量。 为何  米一吨ħ b ˚F 我 2 = 中号一吨ħ b ˚F Ĵ 2 = 中号一吨ħ b ˚F ķ 2 = - 1   和  米一吨ħ b ˚F 我中号一吨ħ b ˚F Ĵ = 中号一吨ħ b ˚F ķ   ? 我们为什么要采用向量并将其转换为“虚构”向量以对其进行转换,例如  mathbfq(x mathbfi+y mathbfj+z mathbfk) mathbfq∗ ? 但是谁在乎一切是否正常呢?

有一种描述旋转的方法称为“ 转子” ,它指的是复数(在2D中)和四元数(在3D中)领域,甚至可以概括为任意数量的尺寸。

我们几乎可以完全从头开始创建转子,而不是从零开始定义四元数,并试图解释它们的追溯作用 。 这需要花费更多时间,但是在我看来,这是值得的,因为它们更容易理解!

另外,为了可视化和理解三维转子,没有必要使用第四空间维度。

如果他们开始取代四元数并用转子代替四元数,那就太好了。 替换它们非常简单,但是代码将几乎保持不变 。 四元数可以完成的所有操作,例如插补和拆卸轴锁(云台锁),都可以使用转子完成。 但是我们开始了解更多。

(在原始文章中,所有图形都是交互式的,并且文章后面是视频。单击播放按钮,可以启动视频的相应部分。也可以单击视频下的过渡按钮,转到文章的相应部分。可以扩展窗口,以便为视频提供更多空间,或为其设置恒定大小。)

1.转弯飞机


1.1。 转弯在二维平面上执行。


在三维空间中,我们通常将转弯感知为围绕轴发生,就像轮在轴上旋转一样,但是代表轮所在的平面会更正确。 该平面垂直于轴。


这个老女人在飞机上旋转轮子  mathbfxz 垂直于轴  mathbfy 。

发生这种情况是因为,如果我们将向量分为两部分,其中一部分位于平面上(  米一吨ħ b ˚F v  p 一个ř 一升升ë 升 ),另一个在(  中号一吨ħ b ˚F v  p ë [R p ),然后旋转使内部旋转,而外部保持不变。


飞机旋转 ÿ X [ 在原始文章中,此动画和相机可以移动 ]

在二维空间中,只有一个平面可以旋转( 没有外部零件 )。 因此,严格来讲,假设绕第三轴(垂直于2D平面)发生旋转是错误的,因为要完成旋转,我们不应添加其他尺寸。

如果我们围绕旋转的垂直轴告诉二维“平坦的土地所有者”(他生活在2D平面内并且从未离开二维空间),那么他会问:“该轴指向哪个方向? 我无法想象她!”

注意事项
而在更高的尺寸(4D和更高尺寸)中,无法确定2D平面的一个法向矢量(例如,在4D中2D平面具有两个法线方向,在5D中则具有三个法线方向,而在 ñ d 他们的 n−2 )

1.2。 确切的转弯方向


另外,当我们考虑绕轴旋转时,旋转方向没有定义,因此必须通过规则(所谓的“右手规则”)来确定。

但是,如果我们假设转弯发生在平面内,则方向变得清晰:在平面内旋转  米一吨ħ b ˚F X ÿ 表示旋转(单位)矢量的旋转  中号一吨ħ b ˚F X 到(单位)向量  中号一吨ħ b ˚F ÿ 在飞机内部,它们一起形成。 飞机旋转  中号一吨ħ b ˚F ÿ X 沿相反方向旋转:它移动矢量  中号一吨ħ b ˚F ÿ 到矢量  中号一吨ħ b ˚F X 。

注意事项
我记得当我第一次了解沿正交平面的三个3D旋转矩阵时,我首先想到:到底什么是矩阵  mathbfRy 有相反的标志吗? 这是由于右手法则,根据该法则我们必须确定绕轴的旋转  mathbfy 这样它从  mathbfz 到  mathbfx 不是来自  mathbfx 到  mathbfz 保持恒定的“右旋”旋转方向。 当我们开始直接谈论飞机本身时,此规则变得不必要。

R_X(\ theta)= \开始{bmatrix} 1&0&0 \\ 0&cos(\ theta)&-sin(\ theta)\\ 0&sin(\ theta)&cos(\ theta)\ end {bmatrix} \:\:\:R_Y(\ theta)= \开始{bmatrix} cos(\ theta)&0&\ bbox [5px,边框底部:2px实心红色] {\ \} sin(\ theta) \\ 0&1&0 \\ \ bbox [5像素,边框底部:2像素纯红色] {-} sin(\ theta)&0&cos(\ theta)\ end {bmatrix} \:\:\:R_Z (\ theta)= \开始{bmatrix} cos(\ theta)&-sin(\ theta)&0 \\ sin(\ theta)&cos(\ theta)&0 \\ 0&0&1 \ end {bmatrix }


2.双向量



2.1。 外部工作


旋转一个矢量时计算旋转轴  mathbfa 到另一个向量  mathbfb 我们取两个向量的向量积,得到一个垂直于两个向量的向量。 但是,如果旋转本质上是二维操作,为什么我们需要“离开”平面?

取而代之的是,我们采用所谓的外部乘积 (也称为二维向量积),两个向量,从而创建了一个称为“双向量”(或2-向量)的新元素。  mathbfB 表示两个向量一起形成的平面。 如果向量乘积创建平面的法线向量 ,则外部乘积将创建平面本身 。 平面法线的计算无关紧要。

 mathbfB= mathbfa\楔子 mathbfb


 mathbfB 可以表示为由向量构成的平行四边形  mathbfa 和  mathbfb 在它们共同形成的平面上。

起初,双向量的概念可能看起来很奇怪,但是很快我们将看到它们几乎与向量本身一样基本 。 如果可以将向量与直线进行比较,则双向量类似于平面。外部产品的属性捕获了平面的重要属性。

2.2。 双向量的基础



双向量与向量一样,具有分量。 但是它们是根据平面而不是像矢量这样的直线来确定的。

三个正交基面是  mathbfx\楔形 mathbfy ,  mathbfx\楔子 mathbfz 和  mathbfy\楔形 mathbfz 正如我们从图中看到的。

但首先,让我们看一个更简单的二维案例...

2.3。 二维双向量


在2D模式中,只有一个平面,即  mathbfxy 。 即,二维双矢量仅具有一个分量。 对于由向量组成的双向量  mathbfa 和  mathbfb 是数字 Bxy 等于两个向量形成的平行四边形的面积(带符号)。

 mathbfB= mathbfa\楔 mathbfb=Bxy( mathbfx\楔 mathbfy)


在带有二维双矢量的原始文章中,您可以通过更改组成其的(单个)矢量来对交互式图进行实验:


您可以看到,向量之间的角度发生变化时,平行四边形区域也会发生变化(根据角度的正弦值)。

如果向量相同或平行,则它们不形成规则平面,结果将为零。 这个简单的属性定义了bivector是什么:

 mathbfa\楔子 mathbfa=0


查看两个向量的总和,可以看到该属性如下:

 begineqnarray( mathbfa+ mathbfb)\楔子( mathbfa+ mathbfb)&=&0 mathbfa\楔子 mathbfa+ mathbfb\楔 mathbfa+ mathbfa\楔 mathbfb+ mathbfb\楔 mathbfb&=&0 mathbfb\楔 mathbfa+ mathbfa\楔 mathbfb&=&0\结束eqnarray


因此:

 mathbfa\楔形 mathbfb=− mathbfb\楔形 mathbfa


就像旋转方向一样,外部工作中参数的顺序也很重要。 重新排列参数会更改结果的符号(这称为“反对称”)。

在图表上,符号由从蓝色变为绿色的颜色指示。 转向时符号改变  mathbfa 在  mathbfb 从顺时针方向移到逆时针方向(即,如果它与方向匹配(从  mathbfx 到  mathbfy )或方向(从  mathbfy 到  mathbfx ))。

您会看到,外部产品的属性进行了排列,以便它们传达平面和转弯的属性。

2.4。 非单位向量的二维双向量


显然,向量不必一定是单位长度,并且此限制已在此图中删除:


带有符号的平行四边形的面积与两个向量的长度成正比: Bxy=sin( alpha) |a | |b | 在哪里  alpha 是之间的角度  mathbfa 和  mathbfb 。 即,例如,当将一个向量的长度加倍时,面积加倍。

我们可以通过将向量替换为分量来获得真实值:

\ begin {eqnarray} \ mathbf {a} \楔子\ mathbf {b}&=&(a_x \ mathbf {x} + a_y \ mathbf {y})\楔子(b_x \ mathbf {x} + b_y \ mathbf { y}} \\&=&a_x b_x(\ mathbf {x} \楔\ mathbf {x})+ a_x b_y(\ mathbf {x} \楔\ Mathbf {y})+ a_y b_x(\ mathbf {y} \ \楔\ mathbf {x})+ a_y b_y(\ mathbf {y} \楔\ mathbf {y})\\&=&a_x b_y(\ mathbf {x} \楔\ mathbf {y})+ a_y b_x( \ \ mathbf {y} \楔\ mathbf {x})\\&=&a_x b_y(\ mathbf {x} \楔\ mathbf {y})-a_y b_x(\ mathbf {x} \楔\ mathbf {y} )\\&=&(a_x b_y-a_y b_x)(\ mathbf {x} \楔子\ mathbf {y})\ end {eqnarray}


Bxy=axby−bxay


2.5。 3D双向量



与向量座标相同  mathbfv 可以认为是向量在三个正交基轴上的投影 (  mathbfx ,  mathbfy ,  mathbfz ),bivector的坐标  mathbfB 可以认为投影小于三个正交基平面上的平面。

向量的投影是此向量沿每个基本向量的长度 ,而bivector的投影是该平面在每个基本平面上的面积 。

对于矢量:

 mathbfv= bbox[5px,边框底部:2px实心红色]vx mathbfx+ bbox[5px,边框底部:2px实心绿色]vy mathbfy+ bbox[5像素,下边框:2像素纯蓝色]vz mathbfz


对于bivector:

 mathbfB= bbox[5px,边框底部:2px实心珊瑚]Bxy( mathbfx\楔子 mathbfy)+ bbox[5px,边框底部:2像素纯金]Bxz( mathbfx\楔 mathbfz)+ bbox[5px,边框底部:2px固体DarkViolet]Byz( mathbfy \楔子 mathbfz)


哪里 Bxy , Bxz , Byz 只是像 vx , vy , vz (它们用与图表上的颜色相对应的颜色加下划线)。

3D双矢量的分量只是双矢量在基本2D平面上的三个2D投影。

使用与之前相同的方法,我们发现分量的真实值在二维情况下看起来很像XY分量,但应用于所有三个平面:

Bxy=axby−bxay


Bxz=axbz−bxaz


Byz=aybz−byaz


您可以在原始文章中的交互式图表上尝试3D双矢量:


注意事项
Bivector的规范  | mathbfB |= | mathbfa\楔形 mathbfb | 与向量的范数(分量的平方和的平方根)相似地确定。 这等于形成的平行四边形的面积  mathbfa 和  mathbfb ,即  | mathbfa\楔形 mathbfb |= midsin( alpha) mid | mathbfa | | mathbfb | 在哪里  alpha -之间的角度  mathbfa 和  mathbfb 。

如果我们将bivector除以其范数,则我们将减小矢量的两个长度以及该角度的正弦值的(绝对)值,即,将得到bivector \帽子 mathbfB ,这将被构造为好像两个向量最初都是垂直的,并且具有单位长度。 这是包含两个向量的平面的非常清晰的表示。 因此:

 mathbfB=| mathbfa | ||mathbfb | midsin( alpha) mid hat mathbfB


有什么让您想起外部工作的吗? 在3D中,外部作品的定义与矢量作品的定义非常相似。 实际上,从矢量乘积中获得的3D矢量(例如法向矢量)将具有与双矢量的分量相等的三个分量(数量相同,但基础不同)。

$$显示$$ \开始{eqnarray} \ mathbf {a} \楔形\ mathbf {b}&=&&(a_x b_y-b_x a_y)(\ mathbf {x} \楔形\ mathbf {y})\\& &+&(a_x b_z-b_x a_z)(\ mathbf {x} \楔形\ mathbf {z})\\&&+&(a_y b_z-b_y a_z)(\ mathbf {y} \楔子\ mathbf {z} )\\ \\ \ mathbf {a} \ times \ mathbf {b}&=&&(a_x b_y-b_x a_y)\ \ mathbf {z} \\&&--(a_x b_z-b_x a_z)\ \ mathbf {y} \\&&+&(a_y b_z-b_y a_z)\ \ mathbf {x} \ end {eqnarray} $$显示$$


Bivector的定义具有几何意义,而且并非一无是处。 我记得当我研究矢量积时,我想:“它到底返回什么矢量,该矢量的长度等于这两个矢量形成的平行四边形的面积? 似乎太随意了。 为什么我们将平行四边形面积变成矢量的长度 ?”

2.6。 向量和双向量的语义


在3D中,双向量具有三个坐标,每个平面一个:  mathbfxy ,  mathbfxz 和  mathbfyz ) 向量还具有三个坐标,每个轴一个(  mathbfx ,  mathbfy 和  mathbfz ) 每个平面垂直于一个轴。 这种巧合仅在三个维度(*)中出现 ,这就是为什么我们不断将bivector与vector混淆 。

(*)
在2D模式下,只有一个基本的双向量(  mathbfxy ),而在3D模式中有3个基本双向量(  mathbfxy ,  mathbfxz ,  mathbfyz ),在4D中有6个基本双向量(  mathbfxy ,  mathbfxz ,  mathbfxw ,  mathbfyz ,  mathbfyw ,  mathbfzw )等...

在编程中,它们都具有相同的内存布局,但操作不同。 使用3D向量代替3D双向量类似于双向量的“类型转换”。

这是一个示例:您可以看到,使用“反向传递”矩阵对法向矢量的变换与对普通矢量的变换不同 ( mathbfMT)−1 ,而不是矩阵本身。 这是因为,实际上,它们实际上不是矢量,而是双矢量,通过“类型转换”将其转换为矢量。 在物理学中,有一种被称为“轴向向量”的技巧,其目的是将向量乘积获得的向量与普通向量区分开。 双矢量是对象的真正“类型”,必须对其进行相应的感知和处理。

三向量

我们可以继续使用外部产品,不仅获得定向的2D区域,而且获得定向的3D体积。 三向量 T 可以通过做两次外部产品来获得:

 mathbfT= mathbfa\楔形 mathbfb\楔形 mathbfc


在三维空间中,一切都在此结束。 与在2D中一样,只有一个平面填充整个2D空间,而在3D中,只有一个体积填充整个3D空间。

[但是在nD中,我们可以继续创建更大的外部乘积矢量,直到达到第n维为止。 例如,在4D中,我们有四个基本trivctor(3-向量)(  mathbfxyz ,  mathbfxyw ,  mathbfxwz ,  mathbfyzw )和一个基本的4向量  mathbfxyzw ]

在3D中,三向量只有一个基本成分( Txyz )等于三个向量形成的平行六面体的体积。 三重外部乘积是标量三重乘积( ( mathbfa times mathbfb) cdot mathbfc ),因为它仅涉及一种类型的操作,因此它会返回正确的类型(体积而不是标量),并且可以在任意数量的维度上使用。

 mathbfT=Txyz mathbfx\楔子 mathbfy\楔子 mathbfz


3.几何积


3.1。 向量彼此相乘


几何积  mathbfab (没有符号表示)是可以用向量执行的另一种操作。 定义了几何积,以使向量为反量(例如  mathbfa mathbfa−1=1 ,其中1只是数字1!),并具有方便的属性,例如,关联性(  mathbfa( mathbfb mathbfc)=( mathbfa mathbfb) mathbfc ) 这样做的目的是能够对向量进行乘法运算,以使乘法运算(与矩阵一样)对应于几何运算。

注意事项
取反值很有用,因为无论对象是什么  mathbfa mathbfa−1 ,则不会影响向量,也就是说,其行为与将数字乘以1时的行为相同。

要定义乘积,我们首先要注意的是,可以将乘积(或带有两个参数的任何函数)划分为如果我们交换参数时不变的部分和变化的部分之和,如下所示:

\开始eqnarray mathbfa mathbfb&=& frac12( mathbfa mathbfb+ mathbfa mathbfb+ Mathbfb mathbfa− mathbfb mathbfa)&=& frac12( mathbfa mathbfb+ mathbfb mathbfa)+ frac12( mathbfa mathbfb− mathbfb mathbfa) endeqnarray


第一项不再取决于参数的顺序  mathbfa 和  mathbfb (称为“对称”部分),并且第二项在更改参数的位置时会更改符号(称为“反对称”部分)。

两个向量的标量积(也称为内积)是对称的,是距离(  mathbfa cdot mathbfa= | mathbfa |2 ),因此,从几何角度来看,使它等于对称部分似乎很有用:

 frac12( mathbfa mathbfb+ mathbfb mathbfa)= mathbfa cdot mathbfb


同样,两个向量的外部乘积是反对称的,因此将其等同于反对称部分将很有用:

 frac12( mathbfa mathbfb− mathbfb mathbfa)= mathbfa\楔子 mathbfb


此外,标量积还包含两个向量之间的夹角余弦 (  mathbfa cdot mathbfb= | mathbfa | | mathbfb |cos( alpha) ),而外部乘积包含角度的正弦 。 它们一起完整地描述了矢量之间的角度以及它们形成的平面。

注意事项
说明书的完整性使工作具有可逆性,因为我们可以借助其工作中包含的信息从一个向量转到另一个向量。 如果我给你  mathbfa 和  mathbfa mathbfb 那么你可以得到  mathbfb 。 仅了解余弦或仅了解正弦/平面,这是不可能做到的。

即,几何乘积等于:

 mathbfa mathbfb= mathbfa cdot mathbfb+ mathbfa\楔子 mathbfb


这很奇怪,因为将两个向量相乘会得到两个不同的东西的总和:标量和双向量。 但是,这类似于复数是标量和“虚数”之和的方式,因此您已经习惯了。 在此,双向量部分对应于复数的“虚数”部分。 只是这不是一个“虚构的”值,它只是一个我们可以真正用图形显示的双向量!

实际上,将两个向量相乘,我们就可以计算出它们的有用属性(“彼此投影的长度” /“角度余弦”(  mathbfa cdot mathbfb )和“它们共同形成的平面” /“角度的正弦”(  mathbfa\楔形 mathbfb )),将其与加号连接在一起。 几何乘积还提供可以应用于它们的“属性组”的操作,并且这些操作具有几何解释(例如:向量的旋转和反射)。 这将很快看到。

您可以用正弦和余弦来表示几何积:  mathbfa mathbfb= | mathbfa | | mathbfb |(cos( alpha)+sin( alpha) mathbfB) 在哪里  mathbfB 是平面上两个向量的双向量,由两个单位垂直向量组成。

3.2。 乘法表


乘法表使我们可以使乘积更具体:让我们看看如果得到基向量的乘积会发生什么(  mathbfx ,  mathbfy ,  mathbfz )

对于任何基向量,例如轴  mathbfx ,结果将相等 1 :

 mathbfx mathbfx= mathbfx cdot mathbfx+ mathbfx\楔 Mathbfx=1


例如,对于任何一对基础向量  mathbfx 和  mathbfy ,结果将是一个双向量,它们共同形成:

 mathbfx mathbfy= mathbfx cdot mathbfy+ mathbfx\楔 mathbfy= mathbfx\楔 mathbfy


(即我们可以命名  mathbfx\楔形 mathbfy 只是  mathbfx mathbfy ,因为这是相同的!)

这给我们下表:
 mathbfa mathbfb mathbfb
 mathbfx mathbfy mathbfz
 mathbfa mathbfx1 mathbfx mathbfy mathbfx mathbfz
 mathbfy− mathbfx mathbfy1 mathbfy mathbfz
 mathbfz− mathbfx mathbfz− mathbfy mathbfz1

实际上,例如,与四元数表相比,该表是微不足道的。

注意事项
例如,这是两个向量的乘法 (5,3,0) 和 (2,0,1) :

 begineqnarray(5 mathbfx+3 mathbfy)(2 mathbfx+1 mathbfz)&=&5 2  mathbfx mathbfx+5 1  mathbfx mathbfz+3 2  mathbfy mathbfx+3 1  mathbfy mathbfz&=&10+5  mathbfx mathbfz−6  mathbfx mathbfy+3  mathbfy mathbfz endeqnarray


3.3。 反射公式(传统外观)



对向量的反思[在原始文章中,每个向量都可以移动]

如果我们有单位向量  mathbfa 和向量  mathbfv 我们可以反映  mathbfv 通过垂直的平面  mathbfa 。

这是通过常规方式完成的:我们分享  mathbfv 在垂直于平面的部分上:  mathbfv perp=( mathbfv cdot mathbfa) mathbfa ,以及与平面平行的部分:  mathbfv parallel= mathbfv− mathbfv perp= mathbfv−( mathbfv cdot mathbfa) mathbfa 。

然后,为了反映矢量,我们翻转垂直部分,并保持平行部分不变:

\开始eqnarrayR mathbfa( mathbfv)&=& mathbfv parallel− mathbfv perp&=&( Mathbfv−( mathbfv cdot mathbfa) mathbfa)−((mathbfv cdot mathbfa) mathbfa)&=& mathbfv−2( mathbfv cdot mathbfa) mathbfa endeqnarray


3.4。 反射公式(查看几何积)


在这个阶段,我们可以更换标量产品  mathbfv cdot mathbfa 以几何产品的形式在其版本上  frac12( mathbfv mathbfa+ mathbfa mathbfv) ,并获得以下信息:

\开始eqnarrayR mathbfa( mathbfv)&=& mathbfv−2( frac12( mathbfv mathbfa+ mathbfa mathbfv)) mathbfa&=& mathbfv− mathbfv mathbfa2− mathbfa mathbfv mathbfa&=&−− mathbfa mathbfv mathbfa endeqnarray


(  mathbfa2= mathbfa cdot mathbfa=1 从  mathbfa 是单位向量)

这给了我们完全相同的东西,只是条目不同。 使用简单产品形式的记录而不是公式来对诸如反射之类的基本操作进行编码将非常有用!

多个几何积如何工作?
如果您不了解几何乘积的多次取值如何工作,则只需查看基本向量即可。 只有三种可能的情况:

 begineqnarray mathbfx( mathbfx mathbfx)&=& mathbfx1= mathbfx mathbfx( mathbfx mathbfy)&=& mathbfx( mathbfx cdot mathbfy+ mathbfx\楔子 mathbfy)= mathbfx( mathbfx cdot mathbfy)+ mathbfx mathbfx mathbfy= mathbfx( mathbfx cdot mathbfy)+ mathbfy mathbfx( mathbfy mathbfz)&=& mathbfx( mathbfy cdot mathbfz)+ mathbfx mathbfy mathbfz endeqnarray


结果将是:向量,向量,向量+三向量。 但是,只有当所有三个向量都独立时,才会发生后一种情况,这对于 − mathbfava

详细资料
好奇的人可以看看每个阶段会发生什么。 − mathbfa mathbfv mathbfa 就几何积而言。

  1. 第一阶段:

     mathbfv mathbfa= mathbfv cdot mathbfa+ mathbfv\楔 Mathbfa


    如果像以前一样,我们除以  mathbfv 垂直于平面的部分(  mathbfv perp ),以及与之平行的部分(  mathbfv parallel ),那么我们得到:

     begineqnarray( mathbfv perp+ mathbfv parallel) mathbfa&=&( mathbfv perp+ mathbfv\平行) cdot mathbfa+( mathbfv perp+ mathbfv parallel)\楔 mathbfacdot mathbfa+ mathbfv parallel cdot mathbfa+ mathbfv perp\楔子 mathbfa+ mathbfv parallel\楔形 mathbfa\结束eqnarray


     mathbfv parallel cdot mathbfa=0 ,因为这些向量是垂直的,并且  mathbfv perp\楔子 mathbfa=0 因为这些向量是平行的。

     mathbfv mathbfa= mathbfv perp cdot mathbfa+ mathbfv parallel\楔形 mathbfa


    第一项只是投影的长度  mathbfv 在  mathbfa ,即 第一项只是长度  mathbfv perp 。

    打电话给 \帽子 mathbfv parallel 规范化版本  mathbfv parallel 那就是  mathbfv parallel=\帽子 mathbfv parallel | mathbfv parallel | 。 然后第二项只是一个双向量  mathbfB=\帽子 mathbfv parallel\楔形 mathbfa 乘以长度  mathbfv parallel 。

    这个双向量  mathbfB 由两个垂直单位向量组成,即这是向量平面的非常清晰的表示  mathbfa 和  mathbfv 。 它不包含有关它们的相对角度或长度的信息,仅包含平面的方向。

    也就是说,两个术语都只是分解  mathbfv 在两个正交投影上(  mathbfv parallel 和  mathbfv perp ),以及它们形成的平面(  mathbfB ):

     | mathbfv perp |+ | mathbfv parallel | mathbfB


    在继续下一步之前,我们可以将外部产品替换为几何产品,因为  mathbfa 和  mathbfv parallel 是垂直的,因此它们的外部和几何乘积将是等效的(因为具有与其几何乘积的标量积的部分等于零)。

     mathbfv perp cdot mathbfa+ mathbfv parallel\楔子 mathbfa= mathbfv perp cdot mathbfa+ mathbfv\并行 mathbfa

  2. 第二阶段如下:

     mathbfa mathbfv mathbfa= mathbfa( mathbfv perp cdot mathbfa)+ mathbfa mathbfv parallel mathbfa


    第一个成员只是一个组件  mathbfv 沿  mathbfa ,即 组成部分  mathbfv 垂直于平面。 换句话说,第一项只是  mathbfv perp 。

     mathbfa mathbfv mathbfa= mathbfv perp+ mathbfa mathbfv parallel mathbfa


    由于  mathbfa 和  mathbfv parallel (再次)垂直,它们的几何乘积只是它们的外部乘积,也就是说,您可以交换它们并更改符号。

    \开始eqnarray mathbfa mathbfv mathbfa&=& mathbfv perp− mathbfv parallel mathbfa mathbfa&=& mathbfv perp− mathbfv parallel endeqnarray

  3. 最后,最后一个阶段将标志翻转:

    − mathbfa mathbfv mathbfa=− mathbfv perp+ mathbfv parallel


    也就是说,我们看到该组件  mathbfv 垂直于飞机,倒置,但平行部分保持不变!

注意事项
长度  mathbfa 不是很重要,因此下面我们将其忽略,但是如果  mathbfa 不是单位向量,那么我们必须除以它的长度,公式变为 − mathbfa mathbfv mathbfa−1 ,它更像是您应该已经习惯的“分层产品”。

3.5。 有两点反思:二维情况


事实证明,如果我们申请  mathbfv 两次连续反射(首先是矢量  mathbfa 然后用向量  mathbfb ),然后我们以两个向量之间的角度的两倍旋转  mathbfa 和  mathbfb 。

我们可以在下图中显示每个后续反射阶段:


您也可以在原始文章中更改向量。  mathbfa ,  mathbfb 和  mathbfv ,但是图形上矢量的初始配置(单击“重置矢量位置”按钮)特别清楚地说明了为什么旋转结果是双角度发生的。 另一个好的配置是将  mathbfa 和  mathbfb 轴数  mathbfx 和  mathbfy 。

3.6。 有两点反思:3D形势


在3D矢量的情况下  mathbfv 可以分为两部分,其中一部分位于给定的平面上  mathbfa 和  mathbfb ,另一个位于飞机外部(垂直于飞机)。 如下图所示,当矢量被每个平面反射时,其外部保持不变。 至于内部,我们回到2D模式,它只是旋转两倍的角度!


3.7。 转子


从几何乘积的角度来看,两个反射仅对应于以下内容:

R mathbfb(R mathbfa( mathbfv))=− mathbfb(− mathbfa mathbfv mathbfa) mathbfb= mathbfb mathbfa\: mathbfv\: mathbfa mathbfb


我们打电话  mathbfa mathbfb= mathbfa cdot mathbfb+ mathbfa\楔子 mathbfb 转子,因为乘以  mathbfa mathbfb 在向量的两边,我们进行旋转(  mathbfb mathbfa 与...相同  mathbfa mathbfb ,仅在倒置的部分bivector中)。

转子应用  mathbfa mathbfb 向向量的两侧旋转此向量在向量的平面中  mathbfa 和  mathbfb 两次之间的角度  mathbfa 和  mathbfb 。

仅此而已!

3D转子和四元数的比较


您会看到3D转子看起来很像四元数:

a+Bxy  mathbfx\楔 mathbfy+Bxz  mathbfx\楔 mathbfz+Byz  mathbfy\楔 Mathbfz


a+b  mathbfi+c  mathbfj+d  mathbfk


实际上,代码/数学几乎相同! 主要区别在于  mathbfi ,  mathbfj 和  mathbfk 替换为  mathbfy\楔形 mathbfz ,  mathbfx\楔子 mathbfz 和  mathbfx\楔形 mathbfy 但它们的工作原理基本相同。 代码比较可以在这里找到。 我没有实现所有内容,例如用于插值的log / exp,但是创建起来非常简单。


但是,正如我们所看到的,3D转子是一个三维概念,不需要使用“三维双转”或“立体投影”进行可视化。 试图可视化以4D模式运行的四元数以解释3D旋转有点像试图从地心角度理解行星运动。 即 这种方法太复杂了,因为我们从错误的角度看待它。

正如我们所看到的,将旋转建模为发生在平面内而不是向量周围,这对我们有很大帮助。 例如,基本双向量的平方给出 −1 ,就像基本的四元数(  mathbfi2= mathbfj2= mathbfk2=−1 ):

(mathbfx mathbfy)2=( mathbfx mathbfy)( mathbfx mathbfy)=−(mathbfy mathbfx)( mathbfx mathbfy)=− mathbfy( mathbfx mathbfx) mathbfy=− mathbfy mathbfy=−1


将两个双向量彼此相乘得到第三个双向量,但实际上这是微不足道的,我们无需记住  mathbfi mathbfj= mathbfk :

( mathbfx mathbfy)( mathbfy mathbfz)= mathbfx( mathbfy mathbfy) mathbfz= mathbfx mathbfz



(请注意,我们使用了  mathbfx\楔形 mathbfy= mathbfx mathbfy )

这些属性是几何积的结果,并非一无是处!

补充阅读


(顺便说一下,在几何代数中,不仅有转子,而且还有其他很酷的东西!)

  • Macdonald的线性和几何代数 [ 链接到亚马逊 ]

    一个很好的资料,非常清楚和可以理解,因为它暗示它将代替学生的线性代数教科书。
  • 计算机科学的几何代数(Dorst等人)。 [ 链接到亚马逊 ]

    很好的资料来源,因为编程有时可以使您更好地理解该主题。
    注意:在本书中,作者明确指出几何代数比四元数(等等)慢。 实际上,它应该具有几乎相同的代码(即,您不应该为几何代数编写代码,而是创建一个可以包含所有可能类型的k向量的通用结构,如有必要,只需为每种类型的k向量编写一个结构也就是说,要替换四元数,可以编写一个Bivector结构和一个Rotor结构(标量+ Bivector)。

Source: https://habr.com/ru/post/zh-CN429640/


All Articles