Unity 四元數API詳解

2021-09-29 14:52:44 字數 4547 閱讀 3678

quaternion類

quaternion(四元數)用於計算unity旋轉。它們計算緊湊高效,不受萬向節鎖的困擾,並且可以很方便快速地進行球面插值。 unity內部使用四元數來表示所有的旋轉。

quaternion是基於複數,並不容易直觀地理解。 不過你幾乎不需要訪問或修改單個四元數引數(x,y,z,w); 大多數情況下,你只需要獲取和使用現有的旋轉(例如來自「transform」),或者用四元數來構造新的旋轉(例如,在兩次旋轉之間平滑插入)

大部分情況下,你可能會使用到這些函式:

quaternion 是乙個結構體,本身成員變數相對簡單,可以作為函式引數高效傳遞

unity預設方向:

unity中使用左手座標系,x軸水平向右,y軸垂直向上,z軸垂直紙面向內。可以在編輯器中直觀的看到座標軸相對位置

方向的表示法

①尤拉角表示法

假如你使用一組尤拉角表示旋轉,xyz三個引數代表相應軸向按照順歸zxy的旋轉,因此(0,90,90)代表先進行

+z軸旋轉90度,再沿著+y軸進行90度旋轉

②前方上方向量界定法

程式設計過程中,大部分需要明確指定方位的時候就需要使用這個方法。要確定乙個朝向,我們可以使用兩個向量來確定:即前方向量和上方向量。當乙個朝向的前方和上方確定之後,這個朝向也就完全確定了。

③繞軸旋轉界定法

第三種定義旋轉的方法就是圍繞某個指定的軸向旋轉一定的角度。這個方法也可以確定乙個相對旋轉,它以從預設方向(此時前方+z,上方+y)出發,沿著指定的軸向進行指定角度的旋轉,旋轉後的前方和上方是確定的。因此這個方法也可以用來確定朝向

④a向到b向相對旋轉表示法

還有一種方法就是從a向到b向的相對旋轉,這種表示了乙個旋轉的相對變化。比如a為(0,1,0),b為(0,0,1),也就是相對旋轉量代表原來的上方被旋轉到了前方,這樣的乙個四元數也可以用尤拉角表示成(90,0,0),也就是沿著+x軸旋轉了90度。

注意上面四中表示方法中,有的明確表明了上方向量,有的好像只明確了前方向量,要明確的一點就是,它們都是從預設向量出發的,如果沒有明確指定上方朝向,那麼就是使用預設的上方,也就是+y方向

成員變數

靜態成員

identity 單位四元數,也就是預設的無旋轉狀態,此時與世界座標相同,前方指向+z,上方指向+y

成員函式

函式形式

解釋void set(float new_x, float new_y, float new_z, float new_w)

設定xyzw分量 與this功能相同

void setfromtorotation(vector3 fromdirection, vector3 todirection)

void setlookrotation(vector3 view, vector3 up = vector3.up)

void toangleaxis(out float angle, out vector3 axis)

靜態函式

函式形式

解釋static float angle(quaternion a, quaternion b)

計算兩個四元數前方向量之間的夾角度數

static quaternion angleaxis(float angle, vector3 axis)

構建乙個四元數,它表示沿著乙個軸旋轉固定角度

static float dot(quaternion a, quaternion b)

計算兩個四元數之間的點積,返回乙個標量,這個函式一般用不到,它的點積不代表什麼具體的物理含義

static quaternion euler(float x, float y, float z)

構建乙個四元數,它用尤拉旋轉表示

static quaternion fromtorotation(vector3 fromdirection, vector3 todirection)

構建乙個四元數,它表示從指向fromdirection方向到指向todirection方向的相對旋轉量

static quaternion inverse(quaternion rotation)

構建乙個四元數,它是指定的四元數的逆,也就是逆向旋轉,比如原四元數表示相對+x軸旋轉了90度,那麼此函式結果就是相對+x軸旋轉了-90度

static quaternion lerp(quaternion a, quaternion b, float t)

構建乙個四元數,表示從四元數a到b的球面插值,所謂的插值也就是中間旋轉量,從a作為起點,此時對應t為0,到b為終點,此時對應t為1。當t取0-1之間的小數時,就代表了中間的插值結果。這個方法與slerp相同,計算速度快,但是精度低,如果相對旋轉變化量很小,則效果不理想

static quaternion lerpunclamped(quaternion a, quaternion b, float t)

與lerp相同,區別是,lerp的t值會被鉗制在[0,1]之間,而此方法則不會,t允許超出計算

static quaternion lookrotation(vector3 forward, vector3 upwards = vector3.up)

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

static quaternion slerp(quaternion a, quaternion b, float t)

球面插值,與lerp功能相同,t值也被鉗制,計算精度高,但是速度相對較慢

static quaternion slerpunclamped(quaternion a, quaternion b, float t)

與slerp功能相同,只是t值不被鉗制,允許超出計算

static quaternion operator * (quaternion lhs, quaternion rhs)

乘法運算子過載,當表示兩個連續的旋轉時,可以使用lhs * rhs的形式得出連續旋轉的結果,lhs為左值,rhs為右值。注意左值是先進行的旋轉,疊加右值旋轉。用法示例:lhs = lhs * rhs;

static vector3 operator *(quaternion rotation, vector3 point)

乘法運算子過載,表示對乙個向量point施加旋轉rotation,得出旋轉後的結果向量。用法示例:vector3 result=rotation * point

總結幾種表示方法

在場景中設定三個物體,它們的朝向是打亂的,從左到右分別對應1、2、3。可以使用以下**將三個物體朝向調整為一致

//前方上方向量界定法的實際上方會重新計算

m_t1.transform.rotation = quaternion.

lookrotation

(vector3.forward, vector3.up)

;m_t2.transform.rotation = quaternion.

lookrotation

(vector3.forward,

newvector3(0

,0.5f,-

0.5f))

;m_t3.transform.rotation = quaternion.

lookrotation

(vector3.forward,

newvector3(0

,0.5f

,0.5f))

;

旋轉的四種表示形式

//旋轉量的4種表示形式

quaternion q1 = quaternion.

euler(90

,0,0

);quaternion q2 = quaternion.

lookrotation

(vector3.down ,vector3.forward)

;quaternion q3 = quaternion.

angleaxis(90

,vector3.right)

;quaternion q4 = quaternion.

fromtorotation

(vector3.up, vector3.forward)

;

四元數旋轉應用到子彈射擊

當槍管轉動起來,子彈仍然沿著正確的朝向發射出去,可以使用很簡單的幾句話,修改之前的**後如下:

bullet_2 bullet = m_comppool.takeunit()

;//發射時,將子彈的初始位置為槍口的當前位置

bullet.m_transform.position = m_transform.position;

//將子彈的初始化旋轉設定為指向當前槍口前方

bullet.m_transform.rotation = quaternion.

lookrotation

(m_transform.forward)

;

看下知乎擴充套件:

通俗理解尤拉角 四元數

Unity中四元數quaternion的學習筆記

筆記來自 遊戲引擎架構 jason gregory著 第二版,4.4四元數,page144。3 3矩陣可以表示三位中的任何旋轉,但是他又三個問題。1.9個浮點型表述只有三個自由度的旋轉顯得多餘。2.矩陣乘法過於複雜對於計算機來說,我們需要運算更快的旋轉方法。3.不能平滑插值。如此,我們有quater...

unity 四元數一些理解

unity 四元數一些理解 一 兩個四元數相乘 給定兩個四元數p和q,分別代表旋轉p和q,則乘積pq表示兩個旋轉的合成 即旋轉了q之後再旋轉p 並不是用加法。二 quaternion.inverse 求逆 返回引數rotation的逆向quaternion值 crrentrotation quate...

Unity中的尤拉角與四元數

quaternion.euler 將尤拉角轉換為四元數 設定物體旋轉 直接給尤拉角賦值 transform.eulerangles new vector3 45,45,45 將尤拉角轉換為四元素,賦值給rotation transform.rotation quaternion.euler new ...