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

 

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

                                                         

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

1.  Lerp

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

                                               

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

                                                       

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

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

                                                               

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

                                                                      

2.  Nlerp

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

                                                                              

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

                                                                   

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

                                                                       

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

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

3. Slerp

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

                                                                    

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

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

                                             

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

                                              

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

                                                       

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

                                                              

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

                                                    

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

   由 (2) 我们能得到:

                                           

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

                    

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

                                              

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

                                                   

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

                                                       

4.  双倍覆盖带来的问题

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

                                                        

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

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

  • 8
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
open3d是一个用于处理三维数据(点云、三维模型等)的开源库。点云配准是将两个或多个点云数据进行对齐的过程,以便在一个全局坐标系下进行比较、分析或重建。其中,四元数法是一种常用的点云配准方法。 四元数是一种用四个实数表示的扩充复数,可以用于描述旋转变换。在点云配准中,使用四元数法是因为其具有以下优势: 第一,四元数具有紧凑的表示形式,只需要四个实数即可表示旋转变换,相较于旋转矩阵的九个实数表示方式节省了存储空间,降低了计算复杂度。 第二,四元数法能够有效地避免了“万向锁”问题。万向锁是指在使用欧拉角进行坐标变换时,由于旋转过程中会出现奇点,导致旋转角度无法精确表示的问题。而四元数法不会出现这个问题,具有更好的数值稳定性。 在open3d中,点云配准的四元数法通常有以下几个步骤: 首先,计算两个点云之间的特征描述子,例如FPFH(Fast Point Feature Histograms)或SHOT(Signature of Histograms of Orientations)。这些描述子能够表示点云的局部几何信息。 然后,根据特征描述子的相似性,寻找初始的点对应关系。 接下来,通过最小化点云之间的误差指标,例如最小化点到平面的距离或最小化点到点的距离,来优化点对应关系,并计算出旋转矩阵。 将旋转矩阵转换为四元数表示,即可完成点云的配准过程。 四元数法是open3d中常用的点云配准方法之一,其能够高效地实现点云的准确对齐。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值