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

相關文章
相關標籤/搜索