1. 程式人生 > >3D數學基礎(四)四元數和歐拉角

3D數學基礎(四)四元數和歐拉角

transform 推薦 中間 應該 它的 轉變 編輯器 最簡 組件

一、四元數

  四元數本質上是個高階復數,可視為復數的擴展,表達式為y=a+bi+cj+dk。在說矩陣旋轉的時候提到了它,當然四元數在Unity裏面主要作用也在於此。在Unity編輯器中的Transform組件,包括這位置(Position)、旋轉(Rotation)和縮放(Scale).Rotation就是一個四元數,但是不能直接對Quaterian.Rotation賦值。可以使用函數Quaterian.Eular(Vector3 angle)獲取四元數,該函數返回的就是四元數。

  歐拉角表示為Quaterion.eulerAngles,歐拉角可以對其進行賦值,例如

  Quaterion.eulerAngles=new Vector3(0,30,0);

  四元數可以用來進行旋轉,它的表達式為Quaterion.AngleAxis(float angle,Vector3 axis),調用這個函數可以對物體進行旋轉,當然還需要調用函數Quaternion.Lerp()在旋轉時進行插值計算,這些函數都是在編寫邏輯時調用的。

  如果對於四元數理解的不夠清楚,推薦閱讀這篇文章Understanding Quaternion中文翻譯  http://www.qiujiawei.com/understanding-quaternions/

二、歐拉角

  歐拉角也是用於旋轉的,但是它有一個致命的缺點,就是萬向節死鎖,歐拉角旋轉我們在Unity開發中通常使用的函數是transform.Rotate(Vector3 angle)

  萬向節死鎖就是在3D空間中某兩個軸在旋轉時重疊了,不論你如何旋轉,三個軸就變成了兩個軸。舉個例子:

  transform.Rotate(new Vector3(0,0,40));

  transform.Rotate(new Vector3(0,90,0));

  transform.Rotate(new Vector3(80,0,0));

  我們只需要固定中間一句代碼,即使y軸的旋轉角度始終為90°,那麽你會發現無論怎麽樣調整x軸和z軸的旋轉角度,它們會總是在同一個平面上運動。萬向節鎖實際上並沒有鎖住任何一個旋轉軸,知識在這種情況下會感覺喪失了一個維度。以上面的例子還說,盡管固定了第二個旋轉軸的角度為90°,但我們原以為依靠改變其他兩個州的旋轉角度是可以得到任意旋轉位置的(因為按照我們的理解,兩個周應該控制兩個空間維度),而事實是它被鎖在一個平面上了,即只有一個維度了,缺失了一個維度。而只要第二個旋轉軸不是正負90°,我們就可以依靠改變其他兩個軸的旋轉角度來的到任意旋轉位置。

  從最簡單的理解,還是用x,y,z的旋轉順序。當y軸的旋轉角度為90°時,會得到下面的矩陣。

  技術分享

  技術分享

  在改變第一次和第三次的旋轉角度時,同樣的效果,不會改變第一行和第三列的數值,從而缺失了一個維度。究其出現的本質原因,是因為從歐拉角到旋轉的映射並不是一個覆蓋映射,即不同的歐拉角可以表示同一個旋轉方向,而且並不是每一個旋轉變化都可以用歐拉角來表示的。

3D數學基礎(四)四元數和歐拉角