有关四元数及其益处的信息


译者的话:正是在175年零三天前,才发明了四元数。 为了纪念这一回合,我决定选择用清晰的语言解释这一概念的材料。

四元数的概念由爱尔兰数学家William Rowan Hamilton爵士于1843年10月16日星期一在爱尔兰都柏林发明。 汉密尔顿和他的妻子去了皇家爱尔兰学院 ,并在布鲁姆大桥上越过了皇家运河 ,他做了一个了不起的发现,他立即在桥的石头上刮了一下。

i2=j2=k2=ijk=1




皇家运河布鲁姆大桥上的纪念牌匾,以纪念发现四元数乘法的基本公式。

在本文中,我将尝试以一种易于理解的方式来解释四元数的概念。 我将说明如何可视化四元数,并讨论四元数可以执行的不同操作。 此外,我将比较矩阵,欧拉角和四元数的使用,然后尝试解释何时使用四元数代替欧拉角或矩阵,以及何时没有必要。

目录内容


  • 1.简介
  • 2.复数
    • 2.1。 复数的加减法
    • 2.2。 复数乘以标量值
    • 2.3。 复数的乘积
    • 2.4。 复数的平方
    • 2.5。 共轭复数
    • 2.6。 复数的绝对值
    • 2.7。 两个复数的商
  • 3.学位
  • 4.复杂平面
    • 4.1。 转子
  • 5.四元数
    • 5.1。 四元数作为有序对
    • 5.2。 四元数加减法
    • 5.3。 四元数积
    • 5.4。 实四元数
    • 5.5。 标量四元数乘法
    • 5.6。 纯四元数
    • 5.7。 四元数加法形式
    • 5.8。 单四元数
    • 5.9。 四元数二进制形式
    • 5.10。 共轭四元数
    • 5.11。 四元数范数
    • 5.12。 四元数归一化
    • 5.13。 反向四元数
    • 5.14。 四元数标量积
  • 6.转
  • 7.四元数的插值
    • 7.1。 斯勒普
      • 7.1.1。 四元数差异
      • 7.1.2。 将四元数提升为幂
      • 7.1.3。 四元数的分数差
      • 7.1.4。 要考虑的因素
    • 7.2。 小队
  • 8.结论
  • 9.下载演示
  • 10.参考

在45分钟内不可能完全理解四元数。

本文有很多数学知识,因此不适合w夫。

引言


在计算机图形学中,矩阵用于描述空间中的位置(位移)以及空间中的方向(旋转)。 您还可以使用单个转换矩阵来描述对象的比例。 该矩阵可以被认为是“基础空间”。 如果我们将一个矢量或一个点(或什至另一个矩阵)乘以转换矩阵,则可以将该矢量,一个点或矩阵“转换”到该矩阵表示的空间中。

在本文中,我不会详细讨论转换矩阵。 有关转换矩阵的详细信息,请参见我的矩阵文章。

在本文中,我想讨论一种使用四元数描述空间中物体(旋转)方向的替代方法。

复数


为了完全理解四元数,我们首先需要了解它们的来源。 四元数原理基于复数系统的概念。

除了众所周知的数字集( 自然整数实数有理数 ),复数系统还添加了一组新的数字,称为虚数。 发明了虚数来求解某些没有解的方程,例如:

x2+1=0


为了解决这个表达式,我们需要声明 x2=1 ,正如您所知,这是不可能的,因为任何数字(正数或负数)的平方始终为正。

数学家不能接受表达式没有解的事实,于是发明了一个新概念-一个可以用来求解此类方程的虚数

虚数如下:

i2=1


不要尝试去理解这个假设,因为没有逻辑上的理由来假设它的存在。 我们只需要接受 -只是一定数量的平方 1

虚数集可以表示为  mathbbI

复数集(用  mathbbC 是以下形式的实数和虚数之和:

z=a+bi  ab in mathbbR  i2=1


也可以说所有实数都是复杂的 b=0 ,并且所有虚数都与 a=0

复数的加减法


可以通过对实部和虚部进行相减来对复数进行相减。

加法:

a1+b1i+a2+b2i=a1+a2+b1+b2i


减法:

a1+b1ia2+b2i=a1a2+b1b2i


复数乘以标量值


通过将复数的每个成员乘以标量,将复数乘以标量:

 lambdaa+bi= lambdaa+ lambdabi


复数的乘积


另外,复数也可以使用普通的代数规则相乘。

 beginarrayrclz1=a1+b1iz2=a2+b2iz1z2=a1+b1ia2+b2i=a1a2+a1b2i+b1a2i+b1b2i2=a1a2b1b2+a1b2+b1a2i endarray


复数的平方


同样,复数可以乘以平方来求平方:

 beginarrayrclz=a+biz2=a+bia+bi=a2b2+2abi endarray


共轭复数


复数的共轭值是虚部的符号改变的复数,表示为  barz 或如何 z

\开arrayrclz=a+biz=abi endarray


将复数与其共轭值相乘会得出有趣的结果。

 beginarrayrclz=a+biz=abizz=a+biabi \&=a2abi+abi+b2=a2+b2 endarray


复数的绝对值


我们可以使用复数的共轭数来计算复数的绝对值(或范数大小 )。 复数的绝对值是复数的平方根乘以其共轭 。 表示为 |z|

 beginarrayrclz=a+bi|z|= sqrtzz= sqrta+biabi= sqrta2+b2 endarray


两个复数的商


为了计算两个复数的商,我们将分子和分母乘以分母的共轭数。

 beginarrayrclz1=a1+b1iz2=a2+b2i cfracz1z2= cfraca1+b1ia2+b2i= cfraca1+b1ia2b2ia2+b2ia2b2i= cfraca1a2a1b2i+b1a2ibi2a22+b22= cfraca1a2+b1b2a22+b22+ cfracb1a2a1b2a22+b22\结array


学位


如果我们声称 i2=1 那么应该有架设的可能性 和其他程度。

 beginarrayrrrrrrri0=1i1=ii2=1i3=ii2=ii4=i2i2=1i5=ii4=ii6=ii5=i2=1 endarray


如果我们继续记录这个系列,我们会注意到一个模式 1i1i1\点

随着负度的增加,也会出现类似的模式。

\开arrayrcri0=1i1=ii2=1i3=ii4=1i5=ii6=1 endarray


也许您已经在数学中看到了这种模式,但是形式如下 xyxyx\点 通过在二维笛卡尔平面上将点逆时针旋转90°获得; 排 xyxyx\点 通过将点在二维笛卡尔平面上旋转90°来创建。


笛卡尔平面

复杂飞机


我们可以类似地将复数应用于二维网格(称为复平面) ,将部链接到水平轴,将虚部链接到垂直轴。


复杂飞机

从上一行可以看到,如果我们将复数乘以 ,则我们可以在复平面上以90°的增量旋转复数。

让我们检查这是否正确。 我们在复平面上取任意点 p

p=2+


并乘以 已经收到 q

 beginarrayrclp=2+iq=pi=2+ii=2i+i2=1+2i endarray


相乘 q 我们得到

 beginarrayrclq=1+2ir=qi=1+2ii=i+2i2=2i endarray


并相乘 我们得到 s

 beginarrayrclr=2is=ri=2ii=2ii2=12i endarray


并相乘 s 我们得到 t

 beginarrayrcls=12it=si=12ii=i2i2=2+i endarray


而我们得到的正是( p ) 如果将这些复数放在复数平面上,则会得到以下结果。


复平面上的复数

现在我们可以在复平面上顺时针旋转,将复数乘以 i

转子


我们还可以在复平面上执行任意转弯,以以下形式设置复数:

q= cos theta+i sin theta


用转子将任何复数相乘时 q 我们得到以下一般公式:

 beginarrayrclp=a+biq= cos theta+i sin thetapq=a+bi cos theta+i  sin thetaa prime+b primei=a cos thetab sin theta+a sin theta+b cos thetai\结array


也可以用矩阵形式编写:

\开bmatrixa primeb primeb primea prime endbmatrix= beginbmatrix cos theta sin theta sin theta cos theta endbmatrix beginbmatrixabba endbmatrix


在复杂平面上相对于原点逆时针旋转任意点的方法是什么。

四元数


了解了复数系统和复平面之后,我们可以将它们带入三维空间,并在其中添加数字 还有两个虚数。

四元数具有以下广义形式

q=s+xi+yj+zk  sxyz in mathbbR


根据汉密尔顿的著名表达:

i2=j2=k2=ijk=1



\开arraycccij=kjk=iki=jji=kkj=iik=j endarray


您可能会注意到, jk 与单位笛卡尔向量的向量乘法规则非常相似:

 beginarrayccc mathbfx times mathbfy= mathbfz mathbfy times mathbfz= mathbfx mathbfz times mathbfx= mathbfy mathbfy times mathbfx= mathbfz mathbfz times mathbfy= mathbfx mathbfx times mathbfz= mathbfy endarray


汉密尔顿也注意到虚数 jk 可以用来表示三个笛卡尔单位向量  mathbfi mathbfj mathbfk 具有虚数数的相同属性,所以  mathbfi2= mathbfj2= mathbfk2=1


属性的图形表示  mathbfij  mathbfjk  mathbfki

上图以图形形式显示了笛卡尔单位向量之间的关系,形式为  mathbfi mathbfj mathbfk

四元数作为有序对


我们还可以将四元数表示为有序对:

q=[s mathbfv]  s in mathbbR mathbfv in mathbbR3


哪里  mathbfv 也可以表示为其单独的组成部分:

q=[sx mathbfi+y mathbfj+z mathbfk]  sxyz in mathbbR


使用此项,我们可以更轻松地表示四元数和复数的共同特征。

四元数加减法


四元数可与复数类似地进行加减:

 beginarrayrclqa=[sa mathbfa]qb=[sb mathbfb]qa+qb=[sa+sb  mathbfa+ mathbfb]qaqb=[sasb mathbfa mathbfb] endarray


四元数工程


我们还可以表示两个四元数的乘积:

\开arrayrclqa=[sa mathbfa]qb=[sb mathbfb]qaqb=[sa mathbfa][sb mathbfb]=sa+xai+yaj+zaksb+xbi+ybj+zbk=sasbxaxbyaybzazb+saxb+sbxa+yazbybzai+sayb+sbya+zaxbzbxaj+sazb+sbza+xaybxbyak endarray


这给了我们另一个四元数。 如果我们替换上一个表达式中的虚数 jk 有序对(也称为四元数单位),那么我们得到

i=[0 mathbfi]j=[0 mathbfj]k=[0 mathbfk]


并用替换为原始表达式 [1 mathbf0]=1 我们得到:

\开arrayrcl[sa mathbfa][sb mathbfb]=sasbxaxbyaybzazb[1 mathbf0]+saxb+sbxa+yazbybza[0 mathbfi]+sayb+sbya+zaxbzbxa[0 mathbfj]+sazb+sbza+xaybxbya[0 mathbfk] endarray


通过将该表达式扩展为有序对的总和,我们得到:

\开arrayrcl[sa mathbfa][sb mathbfb]=[sasbxaxbyaybzazb mathbf0]+[0saxb+sbxa+yazbybza mathbfi]+[0sayb+sbya+zaxbzbxa mathbfj]+[0sazb+sbza+xaybxbya mathbfk] endarray


如果我们将一个四元离子单位乘以并提取公共矢量分量,则可以按如下方式重写此等式:

\开arrayrcl[sa mathbfa][sb mathbfb]=[sasbxaxbyaybzazb mathbf0]+[0saxb mathbfi+yb mathbfj+zb mathbfk+sbxa mathbfi+ya mathbfj+za mathbfkyazbybza mathbfi+zaxbzbxa mathbfj+xaybxbya mathbfk] endarray


这个方程式给我们两个有序对的总和。 第一个有序对是物质四元数 ,第二个是四元数。 这两个有序对可以组合为一个有序对:

\开arrayrcl[sa mathbfa][sb mathbfb]=[sasbxaxbyaybzazbsaxb mathbfi+yb mathbfj+zb mathbfk+sbxa mathbfi+ya mathbfj+za mathbfk+yazbybza mathbfi+zaxbzbxa mathbfj+xaybxbya mathbfk] endarray


如果我们替代,那么我们得到

\开arrayrcl mathbfa=xa mathbfi+ya mathbfj+za mathbfk mathbfb=xb mathbfi+yb mathbfj+zb mathbfk mathbfa cdot mathbfb=xaxb+yayb+zazb mathbfa times mathbfb=yazbybza mathbfi+zaxbzbxa mathbfj+xaybxbya mathbfk endarray


我们得到:

[sa mathbfa][sb mathbfb]=[sasb mathbfa cdot mathbfbsa mathbfb+sb mathbfa+ mathbfa times mathbfb]


这是四元数乘积的一般方程。

实四元数


真正的四元数是一个四元数  mathbf0

q=[s mathbf0]


两个物质四元数的乘积是另一个物质四元数:

\开arrayrclqa=[sa mathbf0]qb=[sb mathbf0]qaqb=[sa mathbf0][sb mathbf0]=[sasb mathbf0] endarray


这类似于包含零虚项的两个复数的乘积。

 beginarrayrclz1=a1+0iz2=a2+0iz1z2=a1+0ia2+0i=a1a2 endarray


标量四元数乘法


我们还可以将四元数乘以标量,同时遵守以下规则:

 beginarrayrclq=[s mathbfv] lambdaq= lambda[s mathbfv]=[ lambdas lambda mathbfv] endarray


我们可以使用上面显示的四元数的乘积来验证这一点,方法是将四元数乘以标量作为四元数:

 beginarrayrclq=[s mathbfv] lambda=[ lambda mathbf0] lambdaq=[ lambda mathbf0][s mathbfv]=[ lambdas lambda mathbfv] endarray


纯四元数


除了材料四元数,汉密尔顿还将四元数定义为标量项为零的四元数:

q=[0 mathbfv]


或者,如果您写下这些组件:

q=xi+yj+zk


同样,我们可以得出两个四元数的乘积:

\开arrayrclqa=[0 mathbfa]qb=[0 mathbfb]qaqb=[0 mathbfa][0 mathbfb]=[ mathbfa cdot mathbfb mathbfa times mathbfb] endarray


根据上述四元数乘积规则

四元数加法形式


另外,我们可以将四元数表示为四元数的实部部的和:

\开arrayrclq=[s mathbfv]=[s mathbf0]+[0 mathbfv] endarray


单四元数


取任意向量  mathbfv ,此向量可以按其标量值及其方向表示,如下所示:

 mathbfv=v mathbf hatv textwherev=| mathbfv| textand| mathbf hatv|=1


将该定义与纯四元数的定义结合起来,我们得到:

 beginarrayrclq=[0 mathbfv]=[0v mathbf hatv]=v[0 mathbf hatv] endarray


我们还可以描述具有零标量和单位矢量的单位四元数:

 hatq=[0 mathbf hatv]


四元数二进制形式


现在,我们可以将单个四元数的定义与四元数的加法形式结合起来,以获得类似于复数描述中所用符号的四元数形式:

 beginarrayrclq=[s mathbfv]=[s mathbf0]+[0 mathbfv]=[s mathbf0]+v[0 mathbf hatv]=s+v hatq endarray


这为我们提供了一种以与复数非常相似的形式表示四元数的方法:

\开arrayrclz=a+biq=s+v hatq endarray


四元数的共轭数


四元数的共轭数可以通过取与符号相反的四元数的向量部分来计算:

\开arrayrclq=[s mathbfv]q=[s mathbfv] endarray


四元数的乘积及其共轭数为我们提供:

 beginarrayrclqq=[s mathbfv][s mathbfv]=[s2 mathbfv cdot mathbfvs mathbfv+s mathbfv+ mathbfv times mathbfv]=[s2+ mathbfv cdot mathbfv mathbf0]=[s2+v2 mathbf0] endarray


四元数率


回想一下复数范数的定义:

\开arrayrcl|z|= sqrta2+b2zz=|z|2 endarray


同样,四元数的范数(或大小)定义为:

 beginarrayrclq=[s mathbfv]|q|= sqrts2+v2 endarray


这使我们可以如下表示四元数范数:

qq=|q|2


四元数归一化


有了四元数范数的定义,我们可以使用它来对四元数进行规范化。 四元数除以 |q|

q prime= fracq sqrts2+v2


例如,让我们标准化四元数:

q=[1,4 mathbfi+4 mathbfj4 mathbfk]


首先,我们需要计算四元数比率

\开arrayrcl|q|= sqrt12+42+42+42= sqrt49=7 endarray


然后,必须将四元数除以四元数的范数,以计算归一化的四元数:

 beginarrayrclq prime= cfracq|q|[1.0em]= cfrac1+4 mathbfi+4 mathbfj4 mathbfk7[1.0em]= cfrac17+ cfrac47 mathbfi+ cfrac47 mathbfj cfrac47 mathbfk endarray


反向四元数


反向四元数表示为 q1 。 要计算逆四元数,我们将四元数的共轭数除以范数的平方:

q1= fracq|q|2


为了说明这一点,我们可以使用反定义:

qq1=[1 mathbf0]=1


并将两边乘以四元数的共轭数,将得到:

qqq1=q


通过替换,我们得到:

 beginarrayrcl|q|2q1=qq1= cfracq|q|2\结array


对于范数为1的单四元数范数,我们可以这样写:

q1=q


四元数标量积


与向量的标量积类似,我们可以通过将相应的标量部分相乘并将结果相加来计算两个四元数的标量积:

 beginarrayrclq1=[s1x1 mathbfi+y1 mathbfj+z1 mathbfk]q2=[s2x2 mathbfi+y2 mathbfj+z2 mathbfk]q1 cdotq2=s1s2+x1x2+y1y2+z1z2\结array


我们还可以使用四元数的标量积来计算四元数之间的角度差:

 cos theta= fracs1s2+x1x2+y1y2+z1z2|q1||q2|


对于单四元数范数,我们可以简化等式:

 cos theta=s1s2+x1x2+y1y2+z1z2


转弯


让我提醒您,我们已经确定了复数的一种特殊形式,称为“ 转子” ,该形式可用于旋转二维平面上的点,如下所示:

q= cos theta+i sin theta


由于复数与四元数的相似性,应该有可能表示可用​​于旋转三维空间中的点的四元数:

q=[ cos theta sin theta mathbfv]


让我们通过计算四元数乘积来检验该理论是否成立 q 和向量  mathbfp 。 首先,我们可以表达  mathbfp 纯四元数如下:

p=[0 mathbfp]


q 是一个四元数范数,形式为:

q=[s lambda mathbf hatv]


然后

 beginarrayrclp prime=qp=[s lambda mathbf hatv][0 mathbfp]=[ lambda mathbf hatv cdot mathbfps mathbfp+ lambda mathbf hatv times mathbfp] endarray


我们看到结果是具有标量和矢量部分的常见四元数。

让我们先来看一个“特殊”情况  mathbfp 垂直的  mathbf\帽v 。 在这种情况下,标量积的成员  lambda mathbf hatv cdot mathbfp=0 结果变成四元数:

p prime=[0s mathbfp+ lambda mathbf hatv times mathbfp]


在这种情况下  mathbfp 关于  mathbf\帽v 我们只是替代 s= cos theta lambda= sin theta

p prime=[0 cos theta mathbfp+ sin theta mathbf hatv times mathbfp]


例如,让我们旋转向量  mathbfp 相对于Z轴45°; 然后我们的四元数 q 将等于:

 beginarrayrclq=[ cos theta sin theta mathbfk]= left[ frac sqrt22 frac sqrt22 mathbfk right] endarray


让我们取一个向量  mathbfp 与特殊情况有关  mathbfp 垂直的  mathbfk

p=[0.2 mathbfi]


现在找一块

qp



 beginarrayrclp prime=qp= left[ frac sqrt22 frac sqrt22 mathbfk right][0.2 mathbfi]= left[0.2 frac sqrt22 mathbfi+2 frac sqrt22 mathbfk times mathbfi right]=[0 sqrt2 mathbfi+ sqrt2 mathbfj] endarray


是什么让我们形成了绕轴旋转45°的干净四元数  mathbfk 。 我们还可以确保保留最终向量的值:

\开arrayrcl| mathbfp prime|= sqrt sqrt22+ sqrt22=2 endarray


正是我们所期望的!

我们可以使用以下图像以图形方式显示它:


旋转四元数(1)

现在让我们看一个不正交于 。 如果我们取四元数的向量部分,则与 然后我们得到:


然后乘以我们的向量 我们得到:


替换后 我们得到:


也就是说,它不再是四元数,也不旋转45°,并且向量的范数不再等于2(它减小为

该结果可以图形方式显示。


四元数转(2)

严格来说,代表四元数是不正确的 在三维空间中,因为实际上它是一个二维矢量! 为了简单起见,我将仅显示四元数的向量分量。

但是,并非一切都丢失了。 汉密尔顿发现(但未发表),然后乘以结果 到相反的值 ,则结果将是四元数,并且将保留矢量分量的范数。 让我们看看是否可以在我们的示例中应用它。

首先,让我们计算一下


我们得到:


合并先前的值 我们得到:


这是四元数,结果的范数是:


等于 ,即向量的范数被保留。

下图显示了旋转的结果。


四元数转(3)

我们看到结果是一个纯四元数,并且保留了原始向量的范数,但是向量旋转了90°,而不是45°,这是需要的两倍! 因此,为了使向量正确旋转 在拐角处 相对于任意轴 我们需要取半角并创建以下四元数:


四元数转向的一般观点是什么!

四元数插值


在计算机图形学中使用四元数的最重要原因之一是四元数很好地描述了空间中的旋转。 四元数消除了3D空间中其他转折点方式(例如折叠框架)的负担,在折叠方式中,问题在于欧拉角的旋转。

使用四元数,我们可以定义几种表示3D空间中旋转插值的方法。 我正在考虑的第一种方法称为SLERP 。 用于平滑插入两个方向之间的点。 第二种方法是SLERP的开发,称为SQUAD 。 它用于沿着指定路径的一系列方向进行插值。

斯勒普


SLERP代表球面线性插值(球面线性插值)。 SLERP提供了在两个方向之间平滑内插点的功能。

我将第一个方向指定为 ,第二个为 。 插值点用 ,插值点用 。 插值参数 将插值 来自 之前

标准线性插值公式为:


以下是应用此方程式的基本步骤:

  • 我们计算出
  • 取这个差异的小数部分。
  • 通过两点之间的分数差来校正初始值。

我们可以使用相同的基本原理在四元数的两个方向之间进行插值。

四元数差异


第一步意味着我们需要计算 。 在四元数的情况下,这类似于计算两个四元数之间的角度差。


将四元数提升为幂


下一步是采取这种差异的小部分。 我们可以通过将四元数的小数部分提高到其值在范围内的幂来计算

将四元数提升为幂的一般公式具有以下形式:


四元数的指数函数如下所示:


四元数的对数具有以下形式:


我们有以下内容:


当什么时候 我们有


四元数的分数差


要计算插值的角度旋转,我们更改初始方向 到之间的差异的小数部分


四元数的球面线性插值的一般视图是什么。 但是,这不是实践中常用的SLERP方程。

我们可以应用类似的公式将向量球面插值成四元数。 向量的球面插值的一般形式定义如下:


以图形方式,可以在下图中显示。


四元数插值

此公式可以应用于四元数而无需更改:


我们可以得到角度 计算标量积


要考虑的因素


使用此实现时,有两个问题需要考虑。

首先,如果四元数的标量积变为负值,则插值将在四维球体上走很长的路,这并不总是可取的。 , , , . , , , «» .

, , 0. , .

SQUAD


, SLERP , SQUAD ( S pherical and Quad rangle — ) .

:


«» ( ), :


:


t :



, .

  • SLERP SQUAD .
  • , , .
  • - . , ( , ).
  • , .
  • 4 (3, . ), 9 .

.

  • - ; « » .
  • , — . , , .

, , . GLM (OpenGL Math Library). , .


, . Unity 3.5.2, . zip Windows, Unity Mac.

Understanding Quaternions.zip


Quaternions for Computer Graphics

Vince, J (2011). Quaternions for Computer Graphics. 1st. ed. London: Springer.



Dunn, F. and Parberry, I. (2002). 3D Math Primer for Graphics and Game Development. 1st. ed. Plano, Texas: Wordware Publishing, Inc.

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


All Articles