久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

unity3d四元數(shù)和旋轉(zhuǎn)矩陣

 雪柳花明 2016-09-09

一 四元數(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);
static Quaternion LookRotation(Vector3 forward,Vector3 upwards);

使用指定的向前方向和向上方向來創(chuàng)建四元數(shù)


示例

[csharp] view plain copy
  1. Vector3 vr = new Vector3(1,0,0);  
  2. Quaternion q1 = Quaternion.LookRotation(vr);  
  3. Debug.Log(q1);  
  4.           
  5. Vector3 vforwardp = new Vector3(0,0,1);       
  6. Quaternion q2 = Quaternion.FromToRotation(vforwardp ,vr);  
  7. Debug.Log(q2);  


這里面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);
void SetLookRotation(Vector3 view,Vector3 up);

也是根據(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)的角度


[csharp] view plain copy
  1. Quaternion q3 = new Quaternion();  
  2. q3.eulerAngles = new Vector3(10, 30, 20);  
  3. Quaternion qx3 = Quaternion.AngleAxis(10,Vector3.right);          
  4. Quaternion qy3 = Quaternion.AngleAxis(30,Vector3.up);  
  5. Quaternion qz3 = Quaternion.AngleAxis(20,Vector3.forward);  
  6.           
  7. Quaternion qxyz3 = qz3*qy3*qx3;  


上面的代碼可以得到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)訪問,,如下

[csharp] view plain copy
  1. public float this [int row, int column]  
  2. {  
  3.     get  
  4.     {  
  5. <span style="white-space:pre">  </span>    return this [row + column * 4];  
  6.     }  
  7.     set  
  8.     {  
  9. <span style="white-space:pre">  </span>    this [row + column * 4] = value;  
  10.     }  
  11. }  
  12. public float this [int index]  

三 四元數(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);


示例

[csharp] view plain copy
  1. Quaternion q = Quaternion.LookRotation(new Vector3(0,0.5,1));  
  2. Matrix4x4 rot = new Matrix4x4();  
  3. rot.SetTRS(new Vector3(0,0,0),q,new Vector3(1,1,1));  


2 旋轉(zhuǎn)矩陣到四元數(shù)

使用Quaternion類的LookRotation函數(shù)

static Quaternion LookRotation(Vector3 forward,Vector3 upwards);


示例(接上面):

[csharp] view plain copy
  1. Matrix4x4 rot = new Matrix4x4();  
  2. rot.SetTRS(new Vector3(0,0,0),q,new Vector3(1,1,1));  
  3.           
  4. Vector4 vy = rot.GetColumn(1);  
  5. Vector4 vz = rot.GetColumn(2);  
  6.           
  7. Quaternion newQ = Quaternion.LookRotation(new Vector3(vz.x,vz.y,vz.z),new Vector3(vy.x,vy.y,vy.z));  

這里的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ǔ)》中的一樣。




    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多