unity3d四元數和旋轉矩陣

2022-06-18 10:06:10 字數 3602 閱讀 5924

quaternion中存放了x,y,z,w四個資料成員,可以用下標來進行訪問,對應的下標分別是0,1,2,3。

主要介紹幾個函式

<1> 根據兩個向量計算出旋轉量,計算出來的旋轉量為從fromdirection旋轉到todirection的旋轉量

static quaternion fromtorotation(vector3 fromdirection,vector3 todirection);

<2>

static quaternion lookrotation(vector3 forward);

static quaternion lookrotation(vector3 forward,vector3 upwards);

使用指定的向前方向和向上方向來建立四元數

示例[csharp]view

plain

copy

vector3 vr = 

newvector3(1,0,0);  

quaternion q1 = quaternion.lookrotation(vr);  

debug.log(q1);  

vector3 vforwardp = new

vector3(0,0,1);       

quaternion q2 = quaternion.fromtorotation(vforwardp ,vr);  

debug.log(q2);  

這裡面q1和q2的值是相同的,q2的計算過程是計算向前向量(vforwardp )到當前向量vr的旋轉量,而這就是lookrotation的計算方式

。而是lookrotation同時使用forward和upward兩個引數的時候,就相當於指定了vz和vy兩個向量,根據這兩個向量可以直接算出對應的vx,然後再用這三個向量去set對應的3×3旋轉矩陣的列向量即可獲得乙個旋轉矩陣,再接著可以將其轉換到四元數。

<3>

void setlookrotation(vector3 view);

void setlookrotation(vector3 view,vector3 up);

也是根據指定的向前和向上向量建立四元數,本質計算過程和lookrotation一樣,只不過lookrotation是quaternion上的靜態函式,而setlookrotation則是quaternion的成員函式。

<4>

static quaternion rotatetowards(quaternion from,quaternion to, float maxdegreesdelta);

以maxdegreesdelta作為角度步長計算從from到

to之間的旋轉量

<5>

static quaternion angleaxis(float angle,vector3 axis);

根據旋轉軸和旋轉角度算出四元數

<6>quaternion.eulerangles

存放四元數對應的三個軸向的尤拉角,分別是繞x軸、y軸、z軸旋轉的角度

[csharp]view

plain

copy

quaternion q3 = 

newquaternion();  

q3.eulerangles = new

vector3(10, 30, 20);  

quaternion qx3 = quaternion.angleaxis(10,vector3.right);          

quaternion qy3 = quaternion.angleaxis(30,vector3.up);  

quaternion qz3 = quaternion.angleaxis(20,vector3.forward);  

quaternion qxyz3 = qz3*qy3*qx3;  

上面的**可以得到q3和qxyz3值一樣。

從這裡可以看出unity中旋轉順序也是按先繞x軸旋轉,然後y,最後z。unity中對向量應用旋轉量使用的是向量右乘,即如下:

vector3 newv = qxyz3*v=

qz3*qy3*qx3*v;

unity中僅僅提供了乙個4×4的矩陣類matrix4x4,它可以包含位移t、旋轉r和伸縮資訊。矩陣中的元素都對應乙個m

xy的公有成員變數,因而要訪問單個元素的話可以直接訪問其成員。同時也提供了下標訪問,如下

[csharp]view

plain

copy

public

float

this

[int

row, 

intcolumn]  

set}  

public

float

this

[int

index]  

unity中沒有提供直接的四元數到旋轉矩陣的轉換,但是使用它們的一些成員函式可以實現兩者之間的轉換。

使用matrix4x4的成員函式settrs

void settrs(

vector3

pos,

quaternion

q,vector3

s);示例

[csharp]view

plain

copy

quaternion q = quaternion.lookrotation(

newvector3(0,0.5,1));  

matrix4x4 rot = new

matrix4x4();  

rot.settrs(new

vector3(0,0,0),q,

newvector3(1,1,1));  

使用quaternion類的lookrotation函式

static quaternion lookrotation(vector3 forward,vector3 upwards);

示例(接上面):

[csharp]view

plain

copy

matrix4x4 rot = 

newmatrix4x4();  

rot.settrs(new

vector3(0,0,0),q,

newvector3(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),

newvector3(vy.x,vy.y,vy.z));  

這裡的newq與上面的q等值

unity中可以將乙個四元數q換算到乙個旋轉矩陣r,同時將這個q在ogre中換算到另乙個旋轉矩陣r1,發現r和r1是相同的。

這說明雖然unity和ogre採用的是不同的座標系,但是對於四元數和旋轉矩陣之間的換算是等價的。同時unity中四元數的計算公式也和《三維旋轉基礎》中的一樣。

unity3d四元數和旋轉矩陣

quaternion中存放了x,y,z,w四個資料成員,可以用下標來進行訪問,對應的下標分別是0,1,2,3。主要介紹幾個函式 1 根據兩個向量計算出旋轉量,計算出來的旋轉量為從fromdirection旋轉到todirection的旋轉量 static quaternion fromtorotat...

四元數和旋轉矩陣

quaternion 四元數 quaternion 的定義 四元數一般定義如下 q w xi yj zk 其中 w,x,y,z是實數。同時,有 i i 1 j j 1 k k 1 四元數也可以表示為 q w,v 其中v x,y,z 是向量,w是標量,雖然v是向量,但不能簡單的理解為3d空間的向量,它...

Unity 3D 矩陣和四元數的研究

版本 unity 5.4.1 語言 c 2017年了,使用unity也有一段時間了,略有心得吧,基本上要求一些功能可以拼拼湊湊地做出來,算是入門了吧。不過很多遊戲上使用的技術還沒有接觸過,比如protobuf 熱更新 shader之類,今年的一開始接觸一下遊戲中常用的技術,然後shader方面好好入...