Understanding Quaternions 中文翻译《理解四元数》

Tags: mathquaternion

原文地址:http://www.3dgep.com/understanding-quaternions/

正文

在这篇文章中我会尝试用简单的方式去解释四元数的概念,即用可视化的方式解释四元数以及几种对四元数的操作。我将把矩阵、欧拉角和四元数放在一起比较,并解释什么时候该用四元数、什么时候该用欧拉角或矩阵。

内容结构

介绍

在计算机图形学中,我们使用转换矩阵来表示空间中的一个位置以及朝向。一个转换矩阵还可以表示对一个目标的缩放(scale)或错切(shear)等。 我们可以把转换矩阵想象成一个空间,当你用这个矩阵乘以向量、点(甚至矩阵)后, 你就把向量、点、矩阵转换进这个空间了。

在这篇文章中,我不会讨论转换矩阵的细节。你可以查看我前面的文章,文章中描述了转换矩阵的细节。

在这篇文章中,我想要讨论一个可替代的方案,即用四元数来描述空间里的物体的朝向。

四元数的概念是由爱尔兰数学家Sir William Rowan Hamilton发明的(1843年,都柏林)。Hamilton当时正和他的妻子前往爱尔兰皇家研究院,当他从Brougham桥通过皇家运河时,他领悟到了一个激动人心的东西,并立刻把它刻在桥的一个石头上:

i2=j2=k2=ijk=1i2=j2=k2=ijk=−1

2.jpg

William Rowan Hamilton Plaque on Broome Bridge on the Royal Canal commemorating his discovery of the fundamental formula for quaternion multiplication.

复数

在我们能够完全理解四元数之前,我们必须先知道四元数是怎么来的。四元数的根源其实是复数

除了知名的数集(自然数、整数、实数、分数)之外,复数系统引入了一个新的数集——虚数。虚数的发明是为了解决一些特定的无解的方程,例如:x2+1=0x2+1=0要解决这个等式,必须让x2=1x2=−1,这当然是不行的,因为任意实数的平方都是非负数。

一般而言,数学家是不能忍受一个等式是无解的。于是,一个新的术语被发明了,它就是虚数,一个可以解决上面这个等式的数。

虚数有这样的形式:

i2=1i2=−1

不要为这个术语较真,因为逻辑上这个数是不存在的。只要知道i是一个平方等于-1的东西即可。

虚数的集合可以用II来表示。

复数的集合CC是一个实数和一个虚数的和,形式如下:

z=a+bi a,bR, i2=1z=a+bi a,b∈R, i2=−1

可以认为所有实数都是b=0的复数、所有虚数都是a=0的复数。

复数的加减

加法:

(a1+b1i)+(a2+b2i)=(a1+a2)+(b1+b2)i(a1+b1i)+(a2+b2i)=(a1+a2)+(b1+b2)i

减法:

(a1+b1i)(a2+b2i)=(a1a2)+(b1b2)i(a1+b1i)−(a2+b2i)=(a1−a2)+(b1−b2)i

复数的系数缩放

λ(a1+b1i)=λa1+λb1iλ(a1+b1i)=λa1+λb1i

复数的积

z1=(a1+b1i)z1=(a1+b1i)z2=(a2+b2i)z2=(a2+b2i)z1z2=(a1+b1i)(a2+b2i)=a1a2+a1b2i+b1a2i+b1b2i2z1z2=(a1+b1i)(a2+b2i)=a1a2+a1b2i+b1a2i+b1b2i2z1z2=(a1a2b1b2)+(a1b2+b1a2)iz1z2=(a1a2−b1b2)+(a1b2+b1a2)i

复数的平方

z=(a+bi)z=(a+bi)z2=(a+bi)(a+bi)z2=(a+bi)(a+bi)z2=(a2b2)+2abiz2=(a2−b2)+2abi

共轭复数

复数的共轭就是指把复数的虚数部分变成负的。共轭复数的符号是¯zzz∗

z=(a+bi)z=(a+bi)

z=(abi)z∗=(a−bi)

复数和它的共轭复数的乘积是:

zz=(a+bi)(abi)=a2abi+abi+b2=a2+b2zz∗=(a+bi)(a−bi)=a2−abi+abi+b2=a2+b2

复数的绝对值

我们使用共轭复数来计算复数的绝对值:

z=(a+bi)z=(a+bi)

|z|=zz=(a+bi)(abi)=a2+b2|z|=zz∗=(a+bi)(a−bi)=a2+b2

两复数的商

z1=(a1+b1i)z1=(a1+b1i)z2=(a2+b2i)z2=(a2+b2i)z1z2=a1+b1ia2+b2i=(a1+b1i)(a2b2i)(a2+b2i)(a2b2i)z1z2=a1+b1ia2+b2i=(a1+b1i)(a2−b2i)(a2+b2i)(a2−b2i)=a1a2a1b2i+b1a2ib1b2i2a22+b22=a1a2−a1b2i+b1a2i−b1b2i2a22+b22

=a1a2+b1b2a22+b22+b1a2a1b2a22+b22i=a1a2+b1b2a22+b22+b1a2−a1b2a22+b22i

i的幂

如果ii的平方等于-1,那么ii的n次幂也应该存在:

i0=1i0=1i1=ii1=ii2=1i2=−1i3=ii2=ii3=ii2=−ii4=i2i2=1i4=i2i2=1i5=ii4=ii5=ii4=ii6=ii5=i2=1i6=ii5=i2=−1

如果按照这个顺序写下去,会出现这样一个模式: (1,\mathbf i,-1,-\mathbf i,1,...)

一个类似的模式也出现在递增的负数幂:

i0=1i0=1i1=ii−1=−ii2=1i−2=−1i3=ii−3=ii4=1i−4=1i5=ii−5=−ii6=1i−6=−1

你可能已经在数学里头见过类似的模式,但是是以(x,y,-x,-y,x,...)的形式,这是在2D笛卡尔平面对一个点逆时针旋转90度时生成的;(x,-y,-x,y,x,...)则是在2D笛卡尔平面对一个点顺时针旋转90度时生成的。

3.png

复数平面

我们也能够把复数映射到一个2D网格平面——复数平面,只需要把实数映射到横轴、虚数映射到纵轴。

4.png

如前面的序列所示,我们可以认为,对一个复数乘以i,这个复数就在复数平面上旋转了90度。

让我们看看这是不是真的。我们随机地在复数平面上取一个点:

p=2+ip=2+i

p乘以i后得到q:q=pi=(2+i)i=2i+i2=1+2iq=pi=(2+i)i=2i+i2=−1+2i

q乘以i后得到r:r=qi=(1+2i)i=i+2i2=2ir=qi=(−1+2i)i=−i+2i2=−2−i

r乘以i后得到s:s=ri=(2i)i=2ii2=12is=ri=(−2−i)i=−2i−i2=1−2i

s乘以i后得到t:t=si=(12i)i=i2i2=2+it=si=(1−2i)i=i−2i2=2+i

t刚好是开始的p。如果我们把这些复数放到复数平面上,就得到下面的图:

5.png

我们也可以按顺时针方向旋转,只需要把上面的乘数i改成-i。

旋转数(Rotors)

我们也可以在复数平面上进行任意角度的旋转,只需要定义下面这个复数:q=cosθ+isinθq=cosθ+isinθ

任意的复数乘以q:

p=a+bip=a+biq=cosθ+isinθq=cosθ+isinθpq=(a+bi)(cosθ+isinθ)pq=(a+bi)(cosθ+isinθ)a+bi=acosθbsinθ+(asinθ+bcosθ)ia′+b′i=acosθ−bsinθ+(asinθ+bcosθ)i

也可以写成矩阵的形式:

[abba]=[cosθsinθsinθcosθ][abba][a′−b′b′a′]=[cosθ−sinθsinθcosθ][a−bba]

这也是一个在复数平面绕原点逆时针旋转任意点的方法。(译注:这句话应该是在说旋转矩阵)

四元数

了解了复数系统和复数平面后,我们可以额外增加2个虚数到我们的复数系统,从而把这些概念拓展到3维空间。

四元数的一般形式:

q=s+xi+yj+zk   s,x,y,zRq=s+xi+yj+zk   s,x,y,z∈R

上面的公式是根据Hamilton的著名的表达式得到的:

i2=j2=k2=ijk=1i2=j2=k2=ijk=−1

以及:

ij=k   jk=i   ki=jij=k   jk=i   ki=jji=k   kj=i   ik=jji=−k   kj=−i   ik=−j

你可能已经注意到了,i、j、k之间的关系非常像笛卡尔坐标系下单位向量的叉积规则:

x×y=z   y×z=x   z×x=yx×y=z   y×z=x   z×x=yy×x=z   z×y=x   x×z=yy×x=−z   z×y=−x   x×z=−y

Hamilton自己也发现i、j、k虚数可以被用来表达3个笛卡尔坐标系单位向量i、j、k,并且仍然保持有虚数的性质,也即i2=j2=k2=1i2=j2=k2=−1

6.png(\mathbf i \mathbf j, \mathbf j \mathbf k, \mathbf k \mathbf i这几个性质的可视化)

上图展示了如何用i、j、k作为笛卡尔坐标系的单位向量。

作为有序数的四元数

我们可以用有序对的形式,来表示四元数:[s,v]   sR,vR3[s,v]   s∈R,v∈R3

其中的v,也可以用它各自独立的3个分量表示:

q=[s,xi+yj+zk]   s,x,y,zRq=[s,xi+yj+zk]   s,x,y,z∈R

使用这种表示法,我们可以更容易地展示四元数和复数之间的相似性。

四元数的加减

和复数类似,四元数也可以被加减:

qa=[sa,a]qa=[sa,a]qb=[sb,b]qb=[sb,b]qa+qb=[sa+sb,a+b]qa+qb=[sa+sb,a+b]qaqb=[sasb,ab]qa−qb=[sa−sb,a−b]

四元数的积

我们也可以表示四元数的乘积:

qaqb=[sa,a][sb,b]qaqb=[sa,a][sb,b]=(sa+xai+yaj+zak)(sb+xbi+ybj+zbk)=(sa+xai+yaj+zak)(sb+xbi+ybj+zbk)=(sasbxaxbyaybzazb)=(sasb−xaxb−yayb−zazb)+(saxb+sbxa+yazbybza)i+(saxb+sbxa+yazb−ybza)i+(sayb+sbya+zaxbzbxa)j+(sayb+sbya+zaxb−zbxa)j+(sazb+sbza+xaybxbya)k+(sazb+sbza+xayb−xbya)k

可以看到,四元数的乘积依然还是一个四元数。如果我们把虚数ijki、j、k替换成有序对:

i=[0,i]   j=[0,j]   k=[0,k]i=[0,i]   j=[0,j]   k=[0,k]

以及还有[1,0] = 1,将它们代入前面的表达式,就得到了:

qaqb=(sasbxaxbyaybzazb)[1,0]qaqb=(sasb−xaxb−yayb−zazb)[1,0]+(saxb+sbxa+yazbybza)[0,i]+(saxb+sbxa+yazb−ybza)[0,i]+(sayb+sbya+zaxbzbxa)[0,j]+(sayb+sbya+zaxb−zbxa)[0,j]+(sazb+sbza+xaybxby

相关文章
相关标签/搜索