向量之間的插值-四元數法VS.旋轉矩陣法的性能比較

問題:
3D空間中,在等長度的兩個交角爲theta的向量v1(x1,y1,z1),v2(x2,y2,z2)之間進行球面線性插值。html

實例:
作一個行星在圍繞太陽等速旋轉的動畫,假設只採樣到旋轉過程當中的兩個位置p1,p2,如今想要用軟件模擬行星是怎麼從p1運動到p2的。函數

思路:
1。通常線性插值:工具

咱們知道通常兩個量之間進行線性插值的方法爲:
v(t) = v1 + t*(v2-v1)(0<=t<=1)(由於t是一次方的,因此是線性的。)

性能

如上圖所示。這裏,考慮v,v1,v2是向量,由幾何學的知識,v2-v1即爲v1,v2組成的三角形的另一條邊。由於|v1| = |v2|,因此v1 + t*(v2-v1)的長度確定小於|v1|或|v2|,當0<t<1時。獲得的插值向量v(t)的端點沿着v2-v1行進。優化

***********************************************
通常線性插值因爲長度發生變化,不能知足案列的要求,咱們須要保持向量長度不變的插值,即球面線性插值。
***********************************************動畫

2。通常球面線性插值:3d


如上圖所示,將通常線性插值獲得的結果乘以放大係數k(t),使其長度放大到|v1|或|v2|,即得保持向量長度不變的插值:
v(t) = k(t)*(v1 + t*(v2-v1))htm

其中k(t) = |v1|/|v(t)|=|v1|/|v1+t*(v2-v1)|.

這樣,插值向量v(t)的端點就會沿着v1,v2端點構成的圓弧行進。由於v1,v2是等長的,這個圓弧其實是位於v1,v2構成的球面上的一段,因此又叫球面線性插值,blog

*****************************************************************
這個插值解決了3D空間中旋轉的插值,在關鍵幀動畫中能夠用來計算兩個關鍵幀之間的動畫。可是,因爲它的插值不是等角速度的,而是變速的。因此若是用來實現案例中的效果的話還需進一步處理。
*****************************************************************get

***************************************
注:通常球面線性插值v(t)與v1的夾角theta(t)不是t的線性函數。

證實:由向量點積可得cos(theta(t)) = (v(t)*v1)/|v(t)|*|v1|,
theta(t) = arcos((v(t)*v1)/|v1|^2),由反證法,假設theat(t)爲線性函數,則 theat(t) = k*t + b,又theta(0) = 0,故 b = 0,theat(t) = k*t,將t'= 2t代入得,theta(2*t) = arcos((v(2*t)*v1)/|v1|^2)並不等於 2*theta(t),因此theat(t)不多是t的線性函數。
***************************************

3。改進的球面線性插值:

要想進行等速的球面線性插值,有幾個方法:

1)。用四元數工具:

變換方法:
---------------------------------------------
構造單位四元數q(cos(theta),sin(theta)*v1'),r(cos(theta),sin(theta)*v2')(v1'和v2'爲單位v1,v2向量),以

及參數t(0<=t<=1),則構造四元數變換:

a.四元數 s(w,v') = r*(q-1)exp(t)*q
即爲球面線性插值變換。其中,s的虛部v'即爲v1'和v2'間的插值向量,乘以長度sqrt(x1^2+y1^2+z1^2)即得v1,v2間插值向量v。

b.另外一種變形形式是對四元數進行插值變換:
s(w,v') = a*q + b*r

其中a = sin(alpha*(1-t))/sin(alpha),b = sin(alpha*t))/sin(alpha), cos(alpha) = x1*y1+y1*y2+z1*z2+w1*w2.
s的虛部v'即爲v1'和v2'間的插值向量,乘以長度sqrt(x1^2+y1^2+z1^2)即得v1,v2間插值向量v。

兩種變換均可以。
----------------------------------------------

複雜度:

以b方法爲例:時間主要花在三角函數上,四元數乘以實數只需4次乘法。cost = 1*Tat + 3*Tt + 2Td + 3*4Tm


2)。利用旋轉矩陣:

變換方法:
--------------------------------------------
v = v1*Trot

其中,Trot即饒任意軸旋轉的矩陣變換矩陣(見上篇:探討:物體繞任意向量的旋轉-四元數法VS.旋轉矩陣法的性能比較),由於v1到v2間的插值能夠當作是v1饒垂直於v1,v2組成的平面的向量的旋轉,因此實際上就是個饒軸旋轉的問題,不過相應參數變成:theta = t*theta,軸q(q1,q2,q3)變成向量v1Xv2/|v1Xv2| = (y1*z2-z1*y2,z1*x2-x1*z2,x1*y2-y1*x2)/sin(theta) -------------------------------------------- 複雜度: 基本和饒任意軸旋轉矩陣的複雜度同樣。主要是多了個向量叉積操做。 cost =2*Tt + 6*Tm + 42*Tm = 2*Tt +48*Tm 綜合來看,未通過優化前,效率應該差很少。

相關文章
相關標籤/搜索