原文地址: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