3D游戲與計算機圖形學中的數學方法-四元數


說實話關於四元數這一節真的是不好懂,因為里面涉及到好多數學知識,單說推出來的公式就有很多。不怕大家笑話,對於四元數的學習我足足花了兩天的時間,包括整理出這篇文章。在前面一章我寫到了“變換”,這也是總結的學習筆記。我發現,寫博客真是的是一個好多學習方法,加上之前一個博士師兄告訴我,要想好好的學習一本書或者一門技術,那么以此將學習筆記或者經驗寫成博客專欄是一種有效的方法。現在我要堅持這種方式,給自己留下學習過程中的足跡,也給大家分享一下。歡迎大家指出其中的不足,謝謝!

四元數是表示旋轉的另一種數學形式,使用四元數可以節省存儲空間,其之間的連接運算需要的算術運算更少,在產生平滑的三維動畫時,用四元數更容易進行修改。

四元數集合,在數學上被稱為哈密頓四元數環(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,這樣也可以保證以最短路徑的方式進行插值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM