[原]Unity手遊之路 四 3d旋轉-四元數,歐拉角和變幻矩陣

今天咱們來談談關於Unity中的旋轉。主要有三種方式。變換矩陣,四元數和歐拉角。函數


定義學習

  • 變換矩陣

能夠執行任意的3d變換(平移,旋轉,縮放,切邊)而且透視變換使用齊次座標。通常比較少用到。Unity中提供了一個Matrix4x4矩陣類spa

  • 四元數

「四元數是最簡單的超複數。 複數是由實數加上元素 i 組成,其中i^2 = -1。 類似地,四元數都是由實數加上三個元素 i、j、k 組成,並且它們有以下的關係: i^2 = j^2 = k^2 = ijk = -1 , 每一個四元數都是 一、i、j 和 k 的線性組合,便是四元數通常可表示爲a + bi + cj + dk,其中a、b、c 、d是實數」。這些概念很難懂吧。只要先記得Unity中的Quaternion有4個組件(x,y,z,w)3d

  • 歐拉角

「用來肯定定點轉動剛體位置的3個一組獨立角參量,由章動角θ、旋進角(即進動角)ψ和自轉角j組成」
在Unity中,Quaternion.eulerAngles 返回旋轉的角度,繞z軸旋轉euler.z角度,繞x軸旋轉euler.x度,繞y軸旋轉euler.y度

轉換code

  • 1.四元數到變換矩陣
Quaternion q = Quaternion.LookRotation(new Vector3(0,0.5,1));   Matrix4x4 rot = new Matrix4x4();   rot.SetTRS(new Vector3(0,0,0),q,new Vector3(1,1,1));  



  • 2.變換矩陣到四元數
Matrix4x4 rot = new Matrix4x4();   rot.SetTRS(new Vector3(0,0,0),q,new Vector3(1,1,1));              Vector4 vy = rot.GetColumn(1);   Vector4 vz = rot.GetColumn(2);              Quaternion newQ = Quaternion.LookRotation(new Vector3(vz.x,vz.y,vz.z),new Vector3(vy.x,vy.y,vy.z));  

 


經常使用的函數
function ToAngleAxis (out angle : float, out axis : Vector3) : void
繞axis軸旋轉angle,建立一個旋轉


static function Angle (a : Quaternion, b : Quaternion) : float
返回a和b二者之間的角度。


var eulerAngles : Vector3
返回表示旋轉的歐拉角度。表示旋轉的角度,繞z軸旋轉euler.z度,繞x軸旋轉euler.x度,繞y軸旋轉euler.y度(這樣的順序)。


function SetFromToRotation (fromDirection : Vector3, toDirection : Vector3) : void
把物體的fromDirection旋轉到toDirection


function SetLookRotation (view : Vector3, up : Vector3 = Vector3.up) : void
創建一個旋轉使z軸朝向view y軸朝向up


static function Slerp (from : Quaternion, to : Quaternion, t : float) : Quaternion
從from 轉換到to,移動距離爲t


static function Lerp (a : Quaternion, b : Quaternion, t : float) : Quaternion
跟Slerp類似,且比Slerp快,.可是若是旋轉角度相距很遠則會看起來不好

比較內存

  • 變換矩陣

能夠作各類複雜的變換,可是學習曲線比較大,使用的內存也比較多,由於存儲的數據量比較大。it

  • 歐拉角

簡單理解,尤爲是對美術和策劃的同事。運算速度和消耗內存比較少。可能存在萬向鎖的問題(兩個軸的旋轉重合)io

  • 四元數

避免了萬向鎖的問題。理解起來不是那麼直接。

function

相關文章
相關標籤/搜索