說實話關於四元數這一節真的是不好懂,因為里面涉及到好多數學知識,單說推出來的公式就有很多。不怕大家笑話,對於四元數的學習我足足花了兩天的時間,包括整理出這篇文章。在前面一章我寫到了“變換”,這也是總結的學習筆記。我發現,寫博客真是的是一個好多學習方法,加上之前一個博士師兄告訴我,要想好好的學習一本書或者一門技術,那么以此將學習筆記或者經驗寫成博客專欄是一種有效的方法。現在我要堅持這種方式,給自己留下學習過程中的足跡,也給大家分享一下。歡迎大家指出其中的不足,謝謝!
四元數是表示旋轉的另一種數學形式,使用四元數可以節省存儲空間,其之間的連接運算需要的算術運算更少,在產生平滑的三維動畫時,用四元數更容易進行修改。
四元數集合,在數學上被稱為哈密頓四元數環(ring of Hamiltonian quaternions),用H表示,可以理解為四維空間向量,空間中的元素q可以表示為:
q = (x,y,z,w) = w + xi +yj + zk;
也可以用實數和向量的形式進行表示,即:
q = w + v;其中w是實數部分,v是v(x,y,z)。
四元數集合是復數集合的自然擴展。四元數的乘法服從分配率,並且虛部i,j,k之間滿足一下關系:
四元數式的乘法不滿足交換律,因此在進行乘法運算時要注意順序。兩個四元數q1 = w1 + x1i + y1j + z1k和q2 = w2 + x2i + y2j+z2k的乘積q1q2為:
用數量-向量的形式,則q1=s1+v1和q2=s2+v2的乘積表達式為:
四元數也有共軛,比如一個四元數為 q = s+v,那么它的共軛為q’ = s-v。而qq’=||q||2 = q2.
非零的四元數的逆,記作q-1,所以。
重點來了,下面;來說一下四元數的旋轉
三維空間的旋轉可以理解為R3到自身的映射函數φ。由於φ代表旋轉,所以它必須包含長度,角度,旋轉方向等信息。
如果有則長度保持不變。
如果對任意兩個點p1和p2有
則從原點到兩個點p1和p2的連線所形成 夾角保持不變。
如果
則手向性也保持不變。
如果滿足條件φ(s+v) = s+φ(v),則函數φ可以擴展為H到自身的映射,這樣就將(4)式改寫為
如果將p1和p2看做是數量部分為零的四元數,根據,就可以將(5),(6)式合並成一個等式,在該等式中可以保持角度和手向性不變,等式如下:
滿足(7)是的函數φ稱為是同態的。
該類函數φ可以用公式(8)表示:
其中q為一個非零的四元數,且滿足和
,因此可以表示旋轉的集合。證明過程如下:
首先證明φq的長度保持不變,因為
其次,φq是同態的,因為
四元數與旋轉的關系
假設向量P繞一任意旋轉軸的單位向量A(xa,ya,za)旋轉θ角,如下圖所示:
我們可以將P看作為沒有實數部分的四元數xi+yj+zk,設q = s+v,則q-1 = s-v。
那么φq(P) = qPq-1就等於(s+v)P(s-v)。即計算過程如下所示:
由於則(11)等於:
設v = tA,則上式可以改寫為:
將(13)與繞任意軸旋轉的公式P’ = PcosΘ + (A x P)sinΘ + A(A.P)(1-cosΘ),可以推出
則可以得到:
,
帶入q = s+v得到:
推廣一下來講:
對於四元數q的任意數量乘積表示的都是相同的旋轉,因為:
兩個四元數q1和q2的乘積也可以表示一個旋轉。乘積q1q2表示現已q2,后以q1進行旋轉。因為:
可以將多個四元數結合起來,形成一系列旋轉的一個四元數。將兩個四元數相乘需要做16次乘法和加法運算,而兩個3×3矩陣相乘就需要做27次類似的操作。因此對物體進行多次旋轉時,應用四元數可以獲得較高的計算效率。
如何將一個四元數變換成等價的3×3旋轉矩陣的形式呢?
首先將改寫成矩陣的形式
將四元數q改寫成四維向量q = (w,x,y,z),那么w = s,x = tAx,y = tAy,z = tAz。因為A是單位向量,所以x2+y2+z2 = t2A2 = t2。
則上式等價於:
因為q是單位四元數,滿足w2+ x2+y2+z2 =1,所以可以得到:
則四元數的旋轉矩陣Rq的公式如下:
球型線性插值
因為四元數是用向量表示的,所以很適合做插值運算。在產生一個物體動畫過程中,在產生位於兩個預先計算的關鍵幀之間的中間過渡定位時,插值非常有用。
最簡單的差值類型是線性插值。對於兩個四元數q1和q2,線性插值后得到的四元數q(t)為:
當t在[0,1]范圍內取值時,函數q(t)在連接q1和q2的線段上平滑變化。如下圖所示:
q(t)並不保持q1和q2的單位長度,但可以使用下面的函數在任意點位置對q(t)進行重新規格化:
這樣就可以用該函數描繪位於q1和q2間的過渡弧線。在上圖中,它將弧描繪成四維單位超球面的二維截面。
盡管線性插值很有效,但是q(t)並沒有以恆定的速率描繪q1和q2間的過渡弧線,這就是線性插值的弊端。下圖關於cos-1(q(t).q1)的圖形表明,q1和q2之間的角度變化速率在端點t = 0 和 t = 1時相對較慢,而在t = 1/2時最快。
我們希望找到一個函數q(t),用它對四元數q1和q2進行插值時,會保持其單位長度不變並且以恆定的速率掃過位於q1和q2之間的夾角。如果q1和q2的夾角為θ,那么這個函數將會產生一個四元數,該四元數在q(t)和q1的形成一個夾角θt,這里t在0到1之間取值。
如下圖(a),(b):四元數q(t)位於連接q1和q2的弧上,與q1的形成一個夾角θt,與q2構成夾角θ(1-t)。可以將q(t)寫成:
其中a(t)和b(t)分別表示q(t)在q1和q2方向上的分量的長度。
我們可以構造相似三角形來確定長度a(t),q1到以原點和q2為端點的線段的垂直距離為||q1||sinθ,而q(t)到該線段的垂直距離為||q1||sinθ(1-t)。根據相似三角形,可以得到以下關系式:
由於||q1|| = 1,||q(t)|| = 1,可以將上式化簡為:
同理可以得到:
這時可以將球型線性插值函數q(t)定義為:
θ角為
因為四元數q和-q表示相同的旋轉,所以在旋轉四元數q1和q2的正負號時一般要滿足q1.q2>=0,這樣也可以保證以最短路徑的方式進行插值。