Unity中四元數quaternion的學習筆記

2021-10-09 04:41:32 字數 2611 閱讀 1513

筆記來自《遊戲引擎架構》jason gregory著 第二版,4.4四元數,page144。

3*3矩陣可以表示三位中的任何旋轉,但是他又三個問題。

1.9個浮點型表述只有三個自由度的旋轉顯得多餘。

2.矩陣乘法過於複雜對於計算機來說,我們需要運算更快的旋轉方法。

3.不能平滑插值。

如此,我們有quaternion q =

四元數由威廉哈密頓爵士發明,作為複數的衍生,其定義x,y,z為虛部,w為實部,即x^2 = y^2 = z^2 =-1,w^2 = 1。

我們並不需要使用虛數,四元數並不是為旋轉而生,我們只需要知道,單位長度四元數可以表示旋轉,

即x^2 + y^2 + z^2 + w^2 = 1。

需要注意:四元數同矩陣一樣代表一種變換而不是乙個具體到位置的旋轉,四元數的作用物件是向量而不是乙個點,你可以讓乙個箭頭繞軸旋轉90度,但是你不能讓乙個點旋轉,因為點是沒有方向的。這可能影響你理解四元素。

向量vector 標量scalar。

以下標粗字母為向量

q = [qv,qs],qv向量部分是乙個vector3,qs標量部分為float。

q = [a*sinθ/2 , cosθ/2],在三維中,a為旋轉軸的單位向量,繞軸a按右手法則旋轉θ,即為該q定義的旋轉。

注意:兩個四元數相加不表示任何旋轉,因為其模長不等於1。

p和q表示兩個旋轉,兩者合成旋轉用乘法表示pq,四元數的乘法有多種,此處用拉各斯曼積grassmann product草人積

pq = [psqv+ qspv+pv+qv,psqs - dot(pv,qv)], dot是點乘。

四元數[0,0,0,1]表示零旋轉(sin0 = 0,cos0 = 1,很合理)。

逆四元數和原四元數相乘 = [0,0,0,1];

計算逆四元數首先需定義共軛四元數conjugate的量 q* = [-qv,qs],共軛:(實部不變,虛部取負)向量相反標量相同。

因為逆矩陣 q逆 = q*/|q|^2,逆四元數等於共軛四元數除以模長的平方。因為單位四元數模長=1,故q逆 = q*= [-qv,qs]。

因此可見求逆四元數速度遠遠快過求逆矩陣。

還有兩個公式記住: (pq)* = q*p*,(pq)逆 = q逆p逆。注意順序。

我使用四元數q去旋轉向量v,得到向量v′

首先把向量v= [x,y,z]轉變成四元數v = [x,y,z,0]

v′ = roatate(q,v) = qvq逆 = qvq*

另一種運算方法不用將v轉換成四元數,運算量更加少

v′ = roatate(q,v) =v+ 2qv×(qv×v+ qsv

如矩陣一樣四元數也可以串聯,如果將乙個物向量v先進行旋轉q1,然後q2,最後q3,我也可以得到旋轉q合,旋轉一次即可得到旋轉三次同樣的結果。

q合 = q3q2q1,注意順序

v′ = q3q2q1vq1逆q2逆q3逆 = q合vq合逆

四元數的線性插值lerp和球形插值slerp,這是應用四元數的主要原因。

線性插值lerp

q插 = lerp(qa,qb,β) = ((1-β)qa + βqb)/|(1-β)qa + βqb|四元數除以自己模長即歸一化

球面插值slerp

由x^2+y^2+z^2+w^2 = 1可知,四元數實際上是四維空間超球(hypersphere)上的點。

線性插值實為大圓(great circle,超球的切面)的上的插值,而球面插值是大圓的上的插值。

他們的區別在於,當β勻速變化的時候slerp結果也是勻速變化,但是lerp並不勻速,他在β接近0,1時較慢,在0.5左右變化較快。

slerp與lerp類似,但是權值不同

slerp(p,q,β) = w*p + m*q; 其中權值w = sin(1-β)θ/sinθ; 權值m = sinβθ/sinθ;

θ為兩個四元數的夾角,很容易通過四維向量點積求得 cosθ = qxpx+qypy+qzpz+qwpw,然後arccos該值求得θ。

需要注意slerp比lerp昂貴許多,而lerp表現並不差。

四元數和尤拉角轉換:

Unity中的尤拉角與四元數

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

Unity 四元數API詳解

quaternion類 quaternion 四元數 用於計算unity旋轉。它們計算緊湊高效,不受萬向節鎖的困擾,並且可以很方便快速地進行球面插值。unity內部使用四元數來表示所有的旋轉。quaternion是基於複數,並不容易直觀地理解。不過你幾乎不需要訪問或修改單個四元數引數 x,y,z,w...

unity 四元數一些理解

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