原文地址:http://www.3dgep.com/understanding-quaternions/
正文
在这篇文章中我会尝试用简单的方式去解释四元数的概念,即用可视化的方式解释四元数以及几种对四元数的操作。我将把矩阵、欧拉角和四元数放在一起比较,并解释什么时候该用四元数、什么时候该用欧拉角或矩阵。
内容结构
在计算机图形学中,我们使用转换矩阵来表示空间中的一个位置以及朝向。一个转换矩阵还可以表示对一个目标的缩放(scale)或错切(shear)等。 我们可以把转换矩阵想象成一个空间,当你用这个矩阵乘以向量、点(甚至矩阵)后, 你就把向量、点、矩阵转换进这个空间了。
在这篇文章中,我不会讨论转换矩阵的细节。你可以查看我前面的文章,文章中描述了转换矩阵的细节。
在这篇文章中,我想要讨论一个可替代的方案,即用四元数来描述空间里的物体的朝向。
四元数的概念是由爱尔兰数学家Sir William Rowan Hamilton发明的(1843年,都柏林)。Hamilton当时正和他的妻子前往爱尔兰皇家研究院,当他从Brougham桥通过皇家运河时,他领悟到了一个激动人心的东西,并立刻把它刻在桥的一个石头上:
i2=j2=k2=ijk=−1i2=j2=k2=ijk=−1
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,b∈R, 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)=(a1−a2)+(b1−b2)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=(a1a2−b1b2)+(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=(a2−b2)+2abiz2=(a2−b2)+2abi
复数的共轭就是指把复数的虚数部分变成负的。共轭复数的符号是¯zz¯或z∗z∗。
z=(a+bi)z=(a+bi)
z∗=(a−bi)z∗=(a−bi)
复数和它的共轭复数的乘积是:
zz∗=(a+bi)(a−bi)=a2−abi+abi+b2=a2+b2zz∗=(a+bi)(a−bi)=a2−abi+abi+b2=a2+b2
我们使用共轭复数来计算复数的绝对值:
z=(a+bi)z=(a+bi)
|z|=√zz∗=√(a+bi)(a−bi)=√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)(a2−b2i)(a2+b2i)(a2−b2i)z1z2=a1+b1ia2+b2i=(a1+b1i)(a2−b2i)(a2+b2i)(a2−b2i)=a1a2−a1b2i+b1a2i−b1b2i2a22+b22=a1a2−a1b2i+b1a2i−b1b2i2a22+b22
=a1a2+b1b2a22+b22+b1a2−a1b2a22+b22i=a1a2+b1b2a22+b22+b1a2−a1b2a22+b22i
如果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=1i−1=−ii−1=−ii−2=−1i−2=−1i−3=ii−3=ii−4=1i−4=1i−5=−ii−5=−ii−6=−1i−6=−1
你可能已经在数学里头见过类似的模式,但是是以(x,y,-x,-y,x,...)的形式,这是在2D笛卡尔平面对一个点逆时针旋转90度时生成的;(x,-y,-x,y,x,...)则是在2D笛卡尔平面对一个点顺时针旋转90度时生成的。
我们也能够把复数映射到一个2D网格平面——复数平面,只需要把实数映射到横轴、虚数映射到纵轴。
如前面的序列所示,我们可以认为,对一个复数乘以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=−2−ir=qi=(−1+2i)i=−i+2i2=−2−i
r乘以i后得到s:s=ri=(−2−i)i=−2i−i2=1−2is=ri=(−2−i)i=−2i−i2=1−2i
s乘以i后得到t:t=si=(1−2i)i=i−2i2=2+it=si=(1−2i)i=i−2i2=2+i
t刚好是开始的p。如果我们把这些复数放到复数平面上,就得到下面的图:
我们也可以按顺时针方向旋转,只需要把上面的乘数i改成-i。
我们也可以在复数平面上进行任意角度的旋转,只需要定义下面这个复数: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′+b′i=acosθ−bsinθ+(asinθ+bcosθ)ia′+b′i=acosθ−bsinθ+(asinθ+bcosθ)i
也可以写成矩阵的形式:
[a′−b′b′a′]=[cosθ−sinθsinθcosθ][a−bba][a′−b′b′a′]=[cosθ−sinθsinθcosθ][a−bba]
这也是一个在复数平面绕原点逆时针旋转任意点的方法。(译注:这句话应该是在说旋转矩阵)
了解了复数系统和复数平面后,我们可以额外增加2个虚数到我们的复数系统,从而把这些概念拓展到3维空间。
四元数的一般形式:
q=s+xi+yj+zk s,x,y,z∈Rq=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。
(\mathbf i \mathbf j, \mathbf j \mathbf k, \mathbf k \mathbf i这几个性质的可视化)
上图展示了如何用i、j、k作为笛卡尔坐标系的单位向量。
我们可以用有序对的形式,来表示四元数:[s,v] s∈R,v∈R3[s,v] s∈R,v∈R3
其中的v,也可以用它各自独立的3个分量表示:
q=[s,xi+yj+zk] s,x,y,z∈Rq=[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]qa−qb=[sa−sb,a−b]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)=(sasb−xaxb−yayb−zazb)=(sasb−xaxb−yayb−zazb)+(saxb+sbxa+yazb−ybza)i+(saxb+sbxa+yazb−ybza)i+(sayb+sbya+zaxb−zbxa)j+(sayb+sbya+zaxb−zbxa)j+(sazb+sbza+xayb−xbya)k+(sazb+sbza+xayb−xbya)k
可以看到,四元数的乘积依然还是一个四元数。如果我们把虚数i、j、ki、j、k替换成有序对:
i=[0,i] j=[0,j] k=[0,k]i=[0,i] j=[0,j] k=[0,k]
以及还有[1,0] = 1,将它们代入前面的表达式,就得到了:
qaqb=(sasb−xaxb−yayb−zazb)[1,0]qaqb=(sasb−xaxb−yayb−zazb)[1,0]+(saxb+sbxa+yazb−ybza)[0,i]+(saxb+sbxa+yazb−ybza)[0,i]+(sayb+sbya+zaxb−zbxa)[0,j]+(sayb+sbya+zaxb−zbxa)[0,j]+(sazb+sbza+xayb−xby