一 四元數(shù)Quaternion中存放了x,,y,,z,w四個(gè)數(shù)據(jù)成員,,可以用下標(biāo)來進(jìn)行訪問,,對應(yīng)的下標(biāo)分別是0,1,2,3,。 主要介紹幾個(gè)函數(shù) <1> 根據(jù)兩個(gè)向量計(jì)算出旋轉(zhuǎn)量,計(jì)算出來的旋轉(zhuǎn)量為從fromDirection旋轉(zhuǎn)到toDirection的旋轉(zhuǎn)量 static Quaternion FromToRotation(Vector3 fromDirection,Vector3 toDirection); <2> static Quaternion LookRotation(Vector3 forward); 使用指定的向前方向和向上方向來創(chuàng)建四元數(shù) 示例
這里面q1和q2的值是相同的,q2的計(jì)算過程是計(jì)算向前向量(vforwardp )到當(dāng)前向量vr的旋轉(zhuǎn)量,,而這就是LookRotation的計(jì)算方式,。 而是LookRotation同時(shí)使用forward和upward兩個(gè)參數(shù)的時(shí)候,,就相當(dāng)于指定了vz和vy兩個(gè)向量,,根據(jù)這兩個(gè)向量可以直接算出對應(yīng)的vx,,然后再用這三個(gè)向量去set對應(yīng)的3×3旋轉(zhuǎn)矩陣的列向量即可獲得一個(gè)旋轉(zhuǎn)矩陣,,再接著可以將其轉(zhuǎn)換到四元數(shù),。 <3> void SetLookRotation(Vector3 view); 也是根據(jù)指定的向前和向上向量創(chuàng)建四元數(shù),本質(zhì)計(jì)算過程和LookRotation一樣,,只不過LookRotation是Quaternion上的靜態(tài)函數(shù),,而SetLookRotation則是Quaternion的成員函數(shù)。 <4> static Quaternion RotateTowards(Quaternion from,Quaternion to, float maxDegreesDelta); 以maxDegreesDelta作為角度步長計(jì)算從from到to之間的旋轉(zhuǎn)量 <5> static Quaternion AngleAxis(float angle,Vector3 axis); 根據(jù)旋轉(zhuǎn)軸和旋轉(zhuǎn)角度算出四元數(shù) <6>Quaternion.eulerAngles 存放四元數(shù)對應(yīng)的三個(gè)軸向的歐拉角,,分別是繞x軸,、y軸、z軸旋轉(zhuǎn)的角度
上面的代碼可以得到q3和qxyz3值一樣,。從這里可以看出unity中旋轉(zhuǎn)順序也是按先繞x軸旋轉(zhuǎn),,然后y,,最后z。unity中對向量應(yīng)用旋轉(zhuǎn)量使用的是向量右乘,,即如下: Vector3 newV = qxyz3*v=qz3*qy3*qx3*v; 二 旋轉(zhuǎn)矩陣unity中僅僅提供了一個(gè)4×4的矩陣類Matrix4x4,,它可以包含位移T、旋轉(zhuǎn)R和伸縮信息,。矩陣中的元素都對應(yīng)一個(gè)mxy的公有成員變量,,因而要訪問單個(gè)元素的話可以直接訪問其成員。同時(shí)也提供了下標(biāo)訪問,,如下
三 四元數(shù)和旋轉(zhuǎn)矩陣之間的轉(zhuǎn)換unity中沒有提供直接的四元數(shù)到旋轉(zhuǎn)矩陣的轉(zhuǎn)換,,但是使用它們的一些成員函數(shù)可以實(shí)現(xiàn)兩者之間的轉(zhuǎn)換。 1 四元數(shù)到旋轉(zhuǎn)矩陣使用Matrix4x4的成員函數(shù)SetTRS void SetTRS(Vector3 pos,Quaternion q,Vector3 s); 示例
2 旋轉(zhuǎn)矩陣到四元數(shù)使用Quaternion類的LookRotation函數(shù) static Quaternion LookRotation(Vector3 forward,Vector3 upwards); 示例(接上面):
這里的newQ與上面的q等值 四 其他unity中可以將一個(gè)四元數(shù)q換算到一個(gè)旋轉(zhuǎn)矩陣R,,同時(shí)將這個(gè)q在Ogre中換算到另一個(gè)旋轉(zhuǎn)矩陣R1,,發(fā)現(xiàn)R和R1是相同的。 這說明雖然unity和Ogre采用的是不同的坐標(biāo)系,,但是對于四元數(shù)和旋轉(zhuǎn)矩陣之間的換算是等價(jià)的,。同時(shí)unity中四元數(shù)的計(jì)算公式也和《三維旋轉(zhuǎn)基礎(chǔ)》中的一樣。 |
|