quaternion

四元数的基础知识

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} q1=q2q​​​,当 l a t e x q latex q latexq​​​为单位四元数时, q − 1 = q ∗ q^{-1}=q^* q1=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=q1q1Δq=q1qqt=(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(v1v0)vt=(1t)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(q1q0)qt=(1t)q0+tq1
l a t e x q t latex q_t latexqt并不是单位四元数

image-20210721101241723

Nlerp

正规化线性插值(Normalized Linear Interpolation)

q t 0 = q t ∣ ∣ q t ∣ ∣ q_t^0=\frac{q_t}{||q_t||} qt0=qtqt

存在问题:

旋转速度,先加速后减速,不能保证均匀的角速度

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=(1t)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) v0vt=v0(αv0+βv1)v1vt=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((1t)θ)β=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((1t)θ)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(1t)为参数,对 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(1t))
image-20210721104725422
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(1t))
设控制点 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(1t))
其中
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(qiqi1)+ln(qiqi+1))
image-20210721110036875

红色的点即为控制点

参考文章:

https://krasjet.github.io/quaternion/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值