四元數常見的插值方法有線性插值(lerp)和球面線性插值(slerp)
首先,線性插值方法:
q t=
lerp
(q0,
q1,t
)=(1
−t)q
0+tq
1q_t = lerp(q_0,q_1,t) = (1-t)q_0+tq_1
qt=le
rp(q
0,q
1,t
)=(1
−t)q
0+t
q1由於這樣算出的q
tq_t
qt並不是單位四元數,所以需要對其進行歸一化處理,也就是使用了歸一化線性插值(nlerp)方法:
q t=
nler
p(q0
,q1,
t)=(
1−t)
q0+t
q1∣∣
(1−t
)q0+
tq1∣
∣q_t = nlerp(q_0,q_1,t) = \frac
qt=nl
erp(
q0,
q1,
t)=∣
∣(1−
t)q0
+tq
1∣∣
(1−t
)q0
+tq1
這樣雖然能保證是單位四元數了,但是有個問題就是這樣計算並不能保證均勻的角速度,於是就有了球面線性插值(spherical linear interpolation)方法,
簡稱slerp。能夠保證每個四元數之間的角速度是固定的。這種方法不對四元數q直接插值,而是對角度q
1q_1
q1和q
2q_2
q2之間的夾角θ
\theta
θ插值,這從原理上保證了插值的效果。
計算公式:
q t=
sler
p(q0
,q1,
t)=s
in((
1−t)
θ)si
n(θ)
q0+s
in(t
θ)si
n(θ)
q1θ=
acos
(q0⋅
q1
)q_t = slerp(q_0,q_1,t) = \fracq_0 +\fracq_1 \\ \theta = acos(q_0 \cdot q_1)
qt=sl
erp(
q0,
q1,
t)=s
in(θ
)sin
((1−
t)θ)
q0
+sin
(θ)s
in(t
θ)q
1θ=
acos
(q0
⋅q1
)程式設計時需要注意的問題:
1.若θ非常小,那麼sin(θ)可能會由於浮點數的誤差被近似為0.0,從而導致除以0的錯誤.所以,我們在實施 slerp
之前,需要檢查兩個四元數的夾角是否過小(或者完全相同)。一旦發現這種問題,我們就必須改用 nlerp 對兩個四元數進行插值,這時候 nlerp 的誤差非常小,所以基本不會與真正的 slerp 有什麼區別。
2.在對兩個單位四元數進行插值之前,我們需要先檢測q0與q1之間是否是鈍角,即檢測它們點積的結果q0⋅q1 是否為負數。如果 q0⋅q1<0,那麼我們就反轉其中的乙個四元數,比如說將q1改為−q1 ,並使用q0與−q1之間新的夾角來進行插值,這樣才能保證插值的路徑是最短的.
本文參考:
四元數奇異值分解演算法
四元數由乙個實部和三個虛部構成,三個虛部彼此正交。四元數p w xi yj z k,i j k 均是虛數單位。也就是說,四元數描述形式其實是標量加上向量。另外規定了如下規則 i2 j2 k2 ijk 1,ij k,jk i,ki j ji k,kj i,ik j。因為乙個四元數有4個部分,所以可以簡...
四元數乘法 剛體旋轉中的四元數
四元數博大精深,用途之一圖形學中的三維旋轉。單純從應用角度考慮,四元數可以以如下方式應用於旋轉。旋轉示意圖 假定我們有乙個經過原點的旋轉軸 其中 則,3d旋轉可以通過四元數乘法來表示 1 其中,為單位四元數,等價於 和 分別為 的共軛和逆。對於單位四元數而言 根據式 1 結合四元數的乘法,可以完成一...
四元數的筆記
四元數 h a bi cj dk 共軛 h a bi cj dk 逆 h frac 所以單位四元數的共軛等於他的逆 單位四元數 絕對值為1的四元數 若實部為cos t 它的共軛作用是乙個角度為2t的轉動,轉軸為虛部的方向。四元數的優點是 只有單位四元數才能表示旋轉,所以在eigen中一般會有quat...