三维旋转四元数系列(5.四元数的插值)

三维旋转四元数系列(3.四元数定义与基本性质)https://blog.csdn.net/SKANK911/article/details/90186556

三维旋转四元数系列(4.四元数三维旋转表达)https://blog.csdn.net/SKANK911/article/details/90189234

/-----------------------------------------------------------------------------------------------------------------------------------------------/

序:上两节我们介绍了四元数及其性质,以及四元数如何表示三维旋转。基于四元数的这些特性,其插值相比与轴角、旋转矩阵、欧拉角更加容易。这一节我们就来谈谈四元数的插值。

 

1.四元数插值问题转化为四维向量空间夹角

上一节三维旋转四元数系统(4.四元数三维旋转表达)的证明部分我得到了结论,三维空间中的Ѳ度旋转,是四元数,经过两次变换得到的。

三维旋转四元数系列(5.四元数的插值)_第1张图片

。更直观的理解这层关系请看下图。

三维旋转四元数系列(5.四元数的插值)_第2张图片

q1与q0之间的夹⻆为Ѳ时,旋转的变化量正好是2Ѳ。

三维旋转四元数系列(5.四元数的插值)_第3张图片

如上图,插值时即为找到在q0与q1之间的qt对应,v0与v1之间的vt。我们可以将两个四元数的插值问题从四维空间投影到上左图的二维空间圆上,可以看为一个超球的横截面。那么两个四元数的插值就被我们简化为两个向量的插值。

 

2.Lerp, Nlerp, Slerp

2.1 lerp

lerp线性插值(Linear Interpolation)是向量插值最简单的一种形式。

三维旋转四元数系列(5.四元数的插值)_第4张图片

如上图所示,vt即为在v1、v0连线上的一点到原点的向量。我们假设v1vt与vtv0比例为1-t:t则vt可用下式表达:

将lerp法的插值作用在我们上述四元数问题中为:

很明显,这样的插值法得到的并非单位四元数,如下图所示:

三维旋转四元数系列(5.四元数的插值)_第5张图片

2.2 Nlerp

在lerp的基础上引入归一化/正规化(Normalization),即qt除以其模长。先进行lerp插值再将输入向量转为单位向量,这种方法称为Nlerp插值(Normalized Linear Interpolation)。

三维旋转四元数系列(5.四元数的插值)_第6张图片

三维旋转四元数系列(5.四元数的插值)_第7张图片

这样的插值方法虽然保证了插值四元数仍为单位四元数,但对于三维旋转来说,其角速度不均匀。如上图所示,按照Nlerp的插值方法对v1v0线段进行四等分,得到了三个插值结果,很明显相同t的变化量对应的旋转角度不同。

 

2.3 Slerp

Slerp球面线性插值(Spherical Linear Interpolation)便是为了解决上述问题,

三维旋转四元数系列(5.四元数的插值)_第8张图片

这里我们直接就给出Slerp插值的公式:

向量Slerp插值:

四元数Slerp插值:

q0,q1夹角Ѳ为cos  q0与q1点乘的反函数:arccos(q0•q1)

 

:

①当四元数夹角Ѳ较小时为了避免计算机将sinѲ近似记为0,我们将用Nlerp代替Slerp方法,此时的Nlerp结果基本与Slerp法结果一致。

②上一节3.2部分中我们讲到,四元数表达三维旋转不具备唯一性,三维空间的任意旋转都可以由两个互为相反数的四元数表示。这个性质显然会影响四元数的插值。因此在插值运算时,先要检测q0与q1的向量点积是否为负(夹角Ѳ为钝角),若为负q0q1其中一个去负,再计算新的插值。Eg:qo与-q1之间进行新的插值。

③上述方法的插值仅考虑了两个四元数的情况,当多个四元数进行插值时,角速度就有可能发生突变。为了得到更加平滑连续的插值结果,有时也是要取消固定角速度的约束,在一阶或高阶导数上需求连续性的结果。因此还有Squad球面四边形插值 (Spherical and quadrangle)、三次 Bézier曲线(Cubic Bézier Curve)等方法,我们这里就不做过多介绍了。

你可能感兴趣的:(旋转与四元数)