3D数学笔记——四元数的插值

 

   不管是哪种插值方法,我们都希望将中间向量 vt 写为初始向量 v0 和最终向量 v1 的线性组合,也就是说:

                                                         3D数学笔记——四元数的插值

           其中,系数 α 与 β 都是 t 的函数.不同的插值方法只是拥有不同的系数而已.

1.  Lerp

        我们首先来看一下两个向量插值最简单的一种形式:线性插值(Linear Interpolation), 也叫做「Lerp」.Lerp 会沿着一条直线进行插值,如果将 v0 和 v1 看做是三角形的两 个边,那么 vt 会指向三角形的第三条边:

                                               3D数学笔记——四元数的插值

        从图中可以看到,我们能将 vt 写为两个向量的和(用红色标出).其中一个向量正 是 v0,而另一个向量则是 (v1 − v0) 乘上一个系数,我们直接将 t 作为这个系数,所 以:

                                                       3D数学笔记——四元数的插值

      当 t = 0 时,vt = (1 − 0)v0 + 0v1 = v0;当 t = 1 时,vt = (1 − 1)v0 + 1 · v1 = v1. 这正是我们需要的结果.

      如果将 Lerp 的结果应用到单位四元数上,我们就能得到:

                                                               3D数学笔记——四元数的插值

      当然,因为我们是沿着一条直线(也就是圆上的一个弦)进行插值的,这样插值出 来的四元数并不是单位四元数:

                                                                      3D数学笔记——四元数的插值

2.  Nlerp

     虽然这样插值出来的 qt 并不是单位四元数,但只要将 qt 除以它的模长 ∥qt∥ 就能够 将其转化为一个单位四元数了:

                                                                              3D数学笔记——四元数的插值

       我们将这种先对向量进行插值,再进行正规化 (Normalization) 的插值方法称为正规 化线性插值(Normalized Linear Interpolation),或者「Nlerp」.与 Lerp 不同,Nlerp 的 两个输入向量必须是单位向量,否则插值出来的结果不会经过初始和最终向量.下 面分别是向量和四元数的 Nlerp 公式:

                                                                   3D数学笔记——四元数的插值

Nlerp 插值仍然存在有一定的问题,当需要插值的弧比较大时,vt 的角速度会有显 著的变化.我们可以来看一个例子:

                                                                       3D数学笔记——四元数的插值

         这五个 t 值将整个弧和弦分割成了四个部分.虽然弦上的四段是等长的,但是四个 弧是完全不相等的.t = 0 到 t = 0.25 之间的弧(红色)明显比 t = 0.25 到 t = 0.50 的弧(蓝色)要短了不少.

         这也就是说,在同等时间内,vt 扫过的角度是不同的.vt 扫过的速度(或者说角速 度)首先会不断地增加,到 t = 0.50 之后会开始减速,所以 Nlerp 插值不能保证均匀 的角速度.

3. Slerp

         为了解决这个问题,我们可以转而对角度进行线性插值.也就是说,如果 v1 和 v2 之间的夹角为 θ,那么:

                                                                    3D数学笔记——四元数的插值

          因为对角度线性插值直接是让向量在球面上的一个弧上旋转,所以又称球面线性 插值 ( Spherical Linear Interpolation),或者「Slerp」.类比于 Lerp 是平面上的线性插值, Slerp 是球面上的线性插值.我们上一章讨论的四元数插值公式正是一个对四元数在 四维超球面上的旋转,所以它是 Slerp 的一个等价公式.

        上面公式并没有涉及到任何的向量,我们希望将 vt 写为 v0 和 v1 的线性组合:

                                             3D数学笔记——四元数的插值

         注意这里的 v0 和 v1 仍是单位向量.为了求出这其中的 α 和 β,我们需要借助图像 来找出一些关系:

                                              3D数学笔记——四元数的插值

      因为图中涉及到很多的角度关系,我们可以先对 (1) 的两边同时点乘 v0:

                                                       3D数学笔记——四元数的插值

     我们知道,v0 和 vt 之间的夹角是 tθ,v0 与它自身之间的夹角为 0,v0 和 v1 之间 的夹角是 θ,而且所有的向量都是单位向量,所以:

                                                              3D数学笔记——四元数的插值

同理,我们将 (1) 的两边同时点乘 v1,构造第二个方程:

                                                    3D数学笔记——四元数的插值

   现在,我们就有了两个方程以及两个未知数,我们只需要解 (2) 、 (3) 这两个方程, 求出 α 和 β 就能获得 Slerp 的公式了.

   由 (2) 我们能得到:

                                           3D数学笔记——四元数的插值

  将 (4) 代入 (3) ,利用一些三角恒等式,我们能解出 β:

                    3D数学笔记——四元数的插值

现在我们就得到了 β,将 β 代入 (4) 就能解出 α:

                                              3D数学笔记——四元数的插值

将 α 和 β 代回 (1) ,我们可以得到向量的 Slerp 的公式:      

                                                   3D数学笔记——四元数的插值

q0 与 q1 之间的夹角 θ 可以直接使用它们点乘的结果来得出,即

                                                       3D数学笔记——四元数的插值

4.  双倍覆盖带来的问题

      如果你还记得,两个不同的单位四元数 q 与 −q 对应的其实是同一个旋转,这个特 性显然会对我们的插值造成一些影响.虽然 q 与 −q 对向量变换的最终效果是完全相 同的,但是它们作为向量相差了 π 弧度:

                                                        3D数学笔记——四元数的插值

       可以看到,虽然我们能够将 q0 向左插值至 q1(蓝色的弧),但这会将 3D 空间中的 向量旋转接近 360◦,而实际上这两个旋转相差并没有那么多,它并不是 3D 空间中的 弧面最短路径(Geodesic).而如果我们将 q0 向右插值至等价的 −q1(红色的弧),它 的旋转变化量就会比插值到 q1 要小很多,所以 q0 插值到 −q1 才是插值的最短路径.

       这也就告诉我们,在对两个单位四元数进行插值之前,我们需要先检测 q0 与 q1 之 间是否是钝角,即检测它们点积的结果 q0 · q1 是否为负数.如果 q0 · q1 < 0,那么我 们就反转其中的一个四元数,比如说将 q1 改为 −q1,并使用 q0 与 −q1 之间新的夹角 来进行插值,这样才能保证插值的路径是最短的.