四元數的插值方法

2021-09-27 01:18:56 字數 1827 閱讀 5183

四元數常見的插值方法有線性插值(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...