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方面好好入...