![18a1a37013aac5dfe9046d6e198773a5.png](https://img-blog.csdnimg.cn/img_convert/18a1a37013aac5dfe9046d6e198773a5.png)
旋转的插值
有了之前的预备知识,我们就能开始讨论旋转的插值了,当然,在这里,也就是四元数的插值(Interpolation).
假设有两个旋转变换
如果觉得这样不太好抽象理解的话,那么假设空间中有两个四面体,一个旋转是
![da1259e356faa4161c6c231b48a8894a.png](https://img-blog.csdnimg.cn/img_convert/da1259e356faa4161c6c231b48a8894a.png)
假设我们已经有了这个变换:
那么,
又旋转所用的四元数都是单位四元数,所以
再根据我们之前得到的结论:
可以看到,一个单位四元数的 t 次幂等同于将它的旋转角度缩放至 t 倍,并且不会改变它的旋转轴.
我们对
可以验证:
3D空间旋转变化量 vs 四元数4D向量空间夹角
如果我们把
而非常有意思的是,这个向量点乘的结果正好也等于四元数
所以:
又
这也就是说,与
作为向量在 4D 四元数空间中的夹角 θ,正好是它们旋转变化量 ∆q 的所代表旋转的角度的一半,即 θ =
.所以,我们可以直接用插值向量的方法对旋转进行插值.
这个结论给我们的巨大解放就是我们不需要再使用上面得到的公式
Lerp, Nlerp, Slerp
因为我们已经把四元数插值转换为向量插值,所以我们需要做的就是将中间向量
其中
Lerp
Lerp (Linear Interpolation) 大家应该很熟悉了:
将 Lerp 应用到单位四元数上:
这样会造成的问题是中间插值的四元数不一定是单位四元数,我们也说过,旋转使用单位四元数来表示的。所以这就引出了 Nlerp.
NLerp
虽然使用 lerp 插值出来的
NLerp 存在的问题是在于当需要插值的范围较大时,
Slerp
为了解决角速度的问题,我们可以对角度来进行插值,如果
这叫做球面线性插值(Spherical Linear Interpolation)。上面的公式并没有向量出现,我们还是希望写成之前的形式:
先上式两边同时乘以
用插值的式子两边同时乘以
根据类似的分析,我们可得:
根据这两个式子和三角恒等式,我们能够解出向量和四元数的 Slerp 公式:
使用 Slerp 有两个注意点: 一是如果要插值的角度比较小的话,我们可以直接使用 Nlerp, 误差并不会很大。二是如果
至此,关于四元数的讨论先暂停一下,我们即将进入另外一个常用的用来表示旋转的主题- 李群和李代数。
参考:
- 四元数与三维旋转