筆記來自《遊戲引擎架構》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...