在很多资料上都可以找到四元数slerp插值的公式:
q
t
=
S
l
e
r
p
(
q
0
,
q
1
,
q
2
)
=
s
i
n
(
(
1
−
t
)
θ
)
s
i
n
θ
q
0
+
s
i
n
(
t
θ
)
s
i
n
θ
q
1
q_t = Slerp(q_0,q_1,q_2) = \frac{sin((1-t)\theta)}{sin\theta}q_0+\frac{sin(t\theta)}{sin\theta}q_1
qt=Slerp(q0,q1,q2)=sinθsin((1−t)θ)q0+sinθsin(tθ)q1
其中,
θ
=
c
o
s
−
1
(
q
0
,
q
1
)
\theta=cos^{-1}(q_0,q_1)
θ=cos−1(q0,q1)
但是直接套用在
q
0
⋅
q
1
q_0 \cdot q_1
q0⋅q1小于0时会绕远。
因此需要对其中一个取反。
例如:
if (glm::dot(glm::normalize(q1), glm::normalize(q2)) < 0)
q1 = -q1;
theta = acos(glm::dot(glm::normalize(q1), glm::normalize(q2)));//slerp插值得到四元数
q3 = sin((1 - between / total_time) * theta) / sin(theta) * glm::normalize(q1) + sin(between / total_time * theta) / sin(theta) * glm::normalize(q2);