Unity物体旋转之四元数从未入门到放弃

四元数本质上是一种高阶复数,是一个四维空间,相对于复数的二维空间。我们高中的时候应该都学过复数,一个复数由实部和虚部组成,即x = a + bi,i是虚数单位,如果你还记得的话应该知道i^2 = -1。而四元数其实和我们学到的这种是类似的,不同的是,它的虚部包含了三个虚数单位,i、j、k,即一个四元数可以表示为x = a + bi + cj + dk。那么,它和旋转为什么会有关系呢?我们先来看一下Unity中的旋转。。。

旋转分为矩阵旋转、欧拉旋转和四元数旋转

  • 矩阵旋转

    • 优点
      旋转轴可以是任意向量;
    • 缺点
      旋转其实只需要知道一个向量和一个角度,一共4个值的信息,但矩阵法却使用了16个元素;
      而且在做乘法操作时也会增加计算量,造成了空间和时间上的一些浪费;
  • 欧拉旋转

    • 优点
      很容易理解,形象直观;表示更方便,只需要3个值(分别对应x、y、z轴的旋转角度);但按我的理解,它还是转换到了3个3*3的矩阵做变换,效率不如四元数;
    • 缺点
      之前提到过这种方法是要按照一个固定的坐标轴的顺序旋转的,因此不同的顺序会造成不同的结果;会造成万向节锁(Gimbal Lock)的现象。这种现象的发生就是由于上述固定坐标轴旋转顺序造成的。理论上,欧拉旋转可以靠这种顺序让一个物体指到任何一个想要的方向,但如果在旋转中不幸让某些坐标轴重合了就会发生万向节锁,这时就会丢失一个方向上的旋转能力,也就是说在这种状态下我们无论怎么旋转(当然还是要原先的顺序)都不可能得到某些想要的旋转效果,除非我们打破原先的旋转顺序或者同时旋转3个坐标轴。由于万向节锁的存在,欧拉旋转无法实现球面平滑插值;
  • 四元数旋转

    • 优点
      可以避免万向节锁现象;只需要一个4维的四元数就可以执行绕任意过原点的向量的旋转,方便快捷,在某些实现下比旋转矩阵效率更高;可以提供平滑插值;
    • 缺点
      比欧拉旋转稍微复杂了一点点,因为多了一个维度;理解更困难,不直观;

欧拉角数学理论:欧拉角与万向节死锁
Unity3D 中 用quaternion 来对一个坐标点进行旋转的初步体会
unity3d中如何旋转物体,但坐标轴却不旋转??
Unity3D与旋转相关的函数(C#)

参考:
【Unity技巧】四元数(Quaternion)和旋转

你可能感兴趣的:(Unity物体旋转之四元数从未入门到放弃)