四元数的基础知识
q = a + b i + c j + d k q=a+bi+cj+dk q=a+bi+cj+dk
i i = j j = k k = i j k = − 1 ii=jj=kk=ijk=-1 ii=jj=kk=ijk=−1
即
i 2 = j 2 = k 2 = − 1 i^2=j^2=k^2=-1 i2=j2=k2=−1
i j = k , j k = i , k i = j ij=k,jk=i,ki=j ij=k,jk=i,ki=j
j i = − k , k j = − i , i k = − j ji=-k,kj=-i,ik=-j ji=−k,kj=−i,ik=−j
若四元数 q = [ s , v ] q=[s,v] q=[s,v],则 q ∗ = [ s , − v ] q^*=[s,-v] q∗=[s,−v]
四元数 q q q的逆 q − 1 = q ∗ ∣ ∣ q ∣ ∣ 2 q^{-1}=\frac{q^*}{||q||^2} q−1=∣∣q∣∣2q∗,当 l a t e x q latex q latexq为单位四元数时, q − 1 = q ∗ q^{-1}=q^* q−1=q∗
v ′ = q v q ∗ v'=qvq^* v′=qvq∗,对任意单位四元数 q = [ c o s ( 1 2 θ ) , s i n ( 1 2 θ ) u ] q=[cos(\frac{1}{2}\theta),sin(\frac{1}{2}\theta)u] q=[cos(21θ),sin(21θ)u]
表示绕旋转轴 u u u 旋转 θ \theta θ度
四元数插值
我们希望找到,中间变换 q t q_t qt,让初始变换 q 0 q_0 q0平滑过渡到最终变换 q 1 q_1 q1
设旋转的该变量为
Δ
q
\Delta q
Δq,旋转的该变量也对应一个旋转,
l
a
t
e
x
q
1
latex q_1
latexq1 可以看成旋转的复合
Δ
q
q
0
=
q
1
Δ
q
=
q
1
q
−
1
Δ
q
=
q
1
q
∗
q
t
=
(
q
1
q
∗
)
t
\Delta qq_0 =q_1 \\ \Delta q=q_1 q^{-1} \\ \Delta q=q_1 q^* \\ q_t=(q_1 q^*)^t
Δqq0=q1Δq=q1q−1Δq=q1q∗qt=(q1q∗)t
Δ q \Delta q Δq的旋转角度是$ q 和 q 1 和 q_1 和q1的夹角 θ \theta θ的二倍,即$ 2 θ 2\theta 2θ
Lerp
线性插值(Linear Interpolation)
v
t
=
L
e
r
p
(
v
0
,
v
1
,
t
)
=
v
0
+
t
(
v
1
−
v
0
)
v
t
=
(
1
−
t
)
v
0
+
t
v
1
v_t=Lerp(v_0,v_1,t)=v_0+t(v_1-v_0) \\ v_t=(1-t)v_0+tv_1
vt=Lerp(v0,v1,t)=v0+t(v1−v0)vt=(1−t)v0+tv1
应用到单位四元数,得Lerp公式:
q
t
=
L
e
r
p
(
q
0
,
q
1
,
t
)
=
q
0
+
t
(
q
1
−
q
0
)
q
t
=
(
1
−
t
)
q
0
+
t
q
1
q_t=Lerp(q_0,q_1,t)=q_0+t(q_1-q_0) \\ q_t=(1-t)q_0+tq_1
qt=Lerp(q0,q1,t)=q0+t(q1−q0)qt=(1−t)q0+tq1
l
a
t
e
x
q
t
latex q_t
latexqt并不是单位四元数
Nlerp
正规化线性插值(Normalized Linear Interpolation)
q t 0 = q t ∣ ∣ q t ∣ ∣ q_t^0=\frac{q_t}{||q_t||} qt0=∣∣qt∣∣qt
存在问题:
旋转速度,先加速后减速,不能保证均匀的角速度
Slerp
对角度线性插值,又称球面线性插值(Spherical Linear Interpolation)
θ
t
=
(
1
−
t
)
∗
0
+
t
θ
=
t
θ
v
t
=
α
v
0
+
β
v
1
\theta_t=(1-t)*0+t\theta=t\theta \\ v_t=\alpha v_0+\beta v_1
θt=(1−t)∗0+tθ=tθvt=αv0+βv1
左右两边分别点乘$ v_0
和
和
和 v_1$
v
0
⋅
v
t
=
v
0
⋅
(
α
v
0
+
β
v
1
)
v
1
⋅
v
t
=
v
1
⋅
(
α
v
0
+
β
v
1
)
v_0 \cdot v_t=v_0 \cdot(\alpha v_0+\beta v_1) \\ v_1 \cdot v_t=v_1 \cdot(\alpha v_0+\beta v_1)
v0⋅vt=v0⋅(αv0+βv1)v1⋅vt=v1⋅(αv0+βv1)
得
α
=
s
i
n
(
(
1
−
t
)
θ
)
s
i
n
(
θ
)
β
=
s
i
n
(
t
θ
)
s
i
n
(
θ
)
\alpha=\frac{sin((1-t)\theta)}{sin(\theta)} \\ \beta=\frac{sin(t\theta)}{sin(\theta)}
α=sin(θ)sin((1−t)θ)β=sin(θ)sin(tθ)
得Slerp公式
q
t
=
S
l
e
r
p
(
q
0
,
q
1
,
t
)
=
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,t)=\frac{sin((1-t)\theta)}{sin(\theta)}q_0+\frac{sin(t\theta)}{sin(\theta)}q_1
qt=Slerp(q0,q1,t)=sin(θ)sin((1−t)θ)q0+sin(θ)sin(tθ)q1
其中$ \theta=cos^{-1}(q_0\cdot q_1)$
Slerp方法效率低,要注意 l a t e x θ latex \theta latexθ不能过小,否则会出现除 l a t e x 0 latex 0 latex0得错误
Squad
球面四边形插值(Spherical and quadrangle)
希望能以牺牲固定角速度为条件,让插值的曲线不仅是连续的,而且让它的以解甚至是高阶导数是连续的。
Squad采用一层二次插值,嵌套一层一次插值
设有一个向量序列$ v_0,v_1,v_2,v_3$
v
03
=
L
e
r
p
(
v
0
,
v
3
;
t
)
v
12
=
L
e
r
p
(
v
1
,
v
2
;
t
)
v_{03}=Lerp(v_0,v_3;t) \\ v_{12}=Lerp(v_1,v_2;t)
v03=Lerp(v0,v3;t)v12=Lerp(v1,v2;t)
使用
l
a
t
e
x
2
t
(
1
−
t
)
latex 2t(1-t)
latex2t(1−t)为参数,对
l
a
t
e
x
v
03
latex v_{03}
latexv03和
l
a
t
e
x
v
12
latex v_{12}
latexv12作二次插值
v
0312
=
L
e
r
p
(
v
03
,
v
12
;
2
t
(
1
−
t
)
)
v_{0312}=Lerp(v_{03},v_{12};2t(1-t))
v0312=Lerp(v03,v12;2t(1−t))
S
q
u
a
d
(
q
0
,
q
1
,
q
2
,
q
3
;
t
)
=
S
l
e
r
p
(
S
l
e
r
p
(
q
0
,
q
3
;
t
)
,
S
l
e
r
p
(
q
1
,
q
2
;
t
)
;
2
t
(
1
−
t
)
)
Squad(q_0,q_1,q_2,q_3;t)=Slerp(Slerp(q_0,q_3;t),Slerp(q_1,q_2;t);2t(1-t))
Squad(q0,q1,q2,q3;t)=Slerp(Slerp(q0,q3;t),Slerp(q1,q2;t);2t(1−t))
设控制点
s
i
s_i
si和
s
i
+
1
s_{i+1}
si+1
S
q
u
a
d
(
q
i
,
s
i
,
s
i
+
1
,
q
i
+
1
;
t
)
=
S
l
e
r
p
(
S
l
e
r
p
(
q
i
,
q
i
+
1
;
t
)
,
S
l
e
r
p
(
s
i
,
s
i
+
1
;
t
)
;
2
t
(
1
−
t
)
)
Squad(q_i,s_i,s_{i+1},q_{i+1};t)=Slerp(Slerp(q_i,q_{i+1};t),Slerp(s_i,s_{i+1};t);2t(1-t))
Squad(qi,si,si+1,qi+1;t)=Slerp(Slerp(qi,qi+1;t),Slerp(si,si+1;t);2t(1−t))
其中
s
i
=
q
i
exp
(
−
l
n
(
q
i
∗
q
i
−
1
)
+
l
n
(
q
i
∗
q
i
+
1
)
4
)
s_i=q_i \exp(- \frac{ln(q^*_iq_{i-1})+ln(q^*_iq_{i+1})}{4})
si=qiexp(−4ln(qi∗qi−1)+ln(qi∗qi+1))
红色的点即为控制点
参考文章:
https://krasjet.github.io/quaternion/