個人分類: unity3d遊戲開發
所屬專欄: unity學習筆記
在unity中,所有物體即使是空物體,也至少繫結transform這個元件,這個元件有三個屬性:position、rotation、scale,它們分別用於控制物體的平移、旋轉和縮放三種變化,而其中最為複雜的一種就是旋轉,它就對應於transform元件中的rotation屬性,這個屬性的型別其實就是四元數。
引言:
常用的控制旋轉的方法有:矩陣旋轉和尤拉旋轉,還有本篇要介紹的重點四元數,它也是實現旋轉的方式之一。下面簡單介紹一下前面的兩種實現方式:
1.矩陣旋轉:使用乙個4*4的矩陣來表示繞任意軸旋轉時的變換矩陣,這個矩陣具有的特點:乘以乙個向量的時候只改變向量的方向而不會改變向量的大小;
優點:旋轉軸可以是任意向量;
缺點:進行旋轉其實我們只需要知道乙個向量和乙個角度,4個值的資訊,而旋轉變換矩陣使用了4*4=16個元素;
變換過程增加乘法運算量,耗時;
2.尤拉旋轉:在旋轉時,按照一定的順序(例如:x、y、z,unity中的順序是z、x、y)每個軸旋轉一定的角度,來變換座標或者是向量,實際上尤拉旋轉也可以理解為:一系列座標旋轉的組合;
優點:只需使用3個值,即三個座標軸的旋轉角度;
缺點:必須嚴格按照順序進行旋轉(順序不同結果就不同);
容易造成「萬向節鎖」現象,造成這個現象的原因是因為尤拉旋轉是按順序先後旋轉座標軸的,並非同時旋轉,所以當旋轉中某些座標重合就會發生萬向節鎖,這時就會丟失乙個方向上的選擇能力,除非打破原來的旋轉順序或者三個座標軸同時旋轉;
由於萬向節鎖的存在,尤拉旋轉無法實現球面平滑插值;
一、四元數:
根據前面所述,我們知道了四元數是用於表示旋轉的一種方式,而且transform中的rotation屬性的資料型別就是四元數,那麼四元數該如何表示呢?從本質上來講,四元數就是乙個高階複數,也就是乙個四維空間。
普通的低階複數形式一般是:x = a + bi,其中a、b為實數,而i則是虛數單位,而且存在i^2 = -1這樣的運算規律,用座標表示時其實就是由實軸和虛軸構成的二維空間。
說四元數是高階複數,是因為它一般表示為:x = a + bi + cj + dk,其中i、j、k都是虛數單位,所以也都滿足:i2=j2=k2=−1。此外,這三個虛數單位還有以下特點:ij = k,jk = i,ki = j
關於四元數的優缺點:
優點:避免萬向節鎖現象;
可繞任意過原點的向量旋轉;
可提供球面平滑插值;
缺點:比尤拉旋轉複雜,多了乙個維度;
不夠直觀;
二、四元數與尤拉角:
根據上述,我們可以這樣表示乙個四元數:q = w + xi + yj + zk,為了與三維旋轉聯絡起來,可以簡化表示為:q = ((x,y,z),w) = (v,w),其中v是乙個向量,而w是個實數。此外,向量可以看做實部為0的四元數,而實數亦可以看做虛部為0的四元數。
四元數基本運算法則:(證明:
假設我們想讓點p繞單元向量u = (x,y,z)表示的旋轉軸轉θ角度,具體步驟:
1.將點p座標轉換到四元數空間:p = (p,0);
2.使用q=((x,y,z)sinθ2,cosθ2) 來執行這個旋轉;
3.旋轉後的結果p'的座標為:p′=qpq−1;
三、實際應用:
上述講解的是四元數的原理,但是在實際的使用中並沒有那麼複雜,我們只要呼叫unity為我們提供的介面來修改旋轉角度即可,例如為物件直接設定乙個旋轉值:
float speed = 100.0f;
float x;
float z;
void update () else
//旋轉角度(增加)
transform.rotate(new vector3(x,y,0));
/**---------------其它旋轉方式----------------**/
*time.deltatime * speed);//繞y軸 旋轉
//用於平滑旋轉至自定義目標
pinghuaxuanzhuan();
}
//平滑旋轉至自定義角度
void ongui()
}
bool iszhuan= false;
quaternion targetrotation;
void pinghuaxuanzhuan()
}
就像上述的**中,在實際應用中我們只需通過quaternion.euler和quaternion.slerp來完成rolation的賦值操作。
四元數學習之用四元數旋轉向量
四元數學習之用四元數旋轉向量 最近對四元數的學習又深入了一些,既然可以用四元數來表示三維物體的旋轉,那麼如何由乙個向量和四元數作用得到乙個旋轉後的向量呢?上篇部落格講到了如何將四元數轉化為矩陣,這次其實是上一次的延伸,我們知道矩陣可以和向量進行相乘的,方法是將向量填充為四維齊次向量,然後4 4的矩陣...
unity3d四元數和旋轉矩陣
quaternion中存放了x,y,z,w四個資料成員,可以用下標來進行訪問,對應的下標分別是0,1,2,3。主要介紹幾個函式 1 根據兩個向量計算出旋轉量,計算出來的旋轉量為從fromdirection旋轉到todirection的旋轉量 static quaternion fromtorotat...
unity 利用四元數旋轉向量時出錯 解決方法
ray front ray car left new ray frontlidar.position,frontlidar.forward quaternion.euler 0,45f,0 此句 報錯 經過查手冊發現,是因為vector3型別沒有與quaternion型別有運算子 的過載,而quat...