1.矩阵旋转:
优点:旋转轴可以是任何向量
缺点:旋转其实只需要知道一个向量+一个角度(一共4个信息值),但是矩阵用了16个元素(矩阵法比较耗时和内存)
2.欧拉角旋转
优点:通俗易懂,形象直观; 更方便的表示,只需要三个值(分别对应x、y、z轴的旋转角度)
缺点:欧拉角是按照固定坐标轴的顺序旋转的,所以不同的顺序会导致不同的结果; 欧拉角旋转会引起万向锁现象,这是由于上述坐标轴旋转顺序引起的固定而出现的。 理论上,欧拉角旋转可以按这个顺序将物体旋转到任意想要的方向,但是如果旋转过程中某些坐标轴重合,就会出现万向锁现象,此时就失去了单向旋转的能力(两个旋转轴(环)重合)3D角色,也就是说,在这种状态下,无论我们怎么旋转(或者按照原来的旋转顺序)unity 绕轴旋转,都不可能得到一些想要的结果,除非原来的旋转顺序被打破或者三个轴同时旋转。
由于万向节锁的存在,欧拉旋转无法实现球面平滑插值。
万能锁的简单解决方案:构造不同的轮换层级顺序,但万能锁总会以一定的顺序出现,调整轮换顺序不是根本解决办法。 (Unity使用的是ZXY序列,即旋转序列为z轴,x轴音乐音效,y轴。虽然在某些情况下可能会出现万能锁,但是这个序列出现万能锁的概率是最小的)
通用锁方案:将欧拉角转换为四元数,对四元数进行Slerp插值,然后将这一系列四元数转换为对应的欧拉角,再作用于需要旋转的物体。 这种方法的缺点是比较耗内存,但是可以任意旋转物体,灵活性高。
使用欧拉旋转的旋转路径偏移的根本原因:在万向节锁定的情况下,欧拉角的插值不是线性的。 (突变)
静态欧拉角:一个不同的参考系,其旋转轴是静止的。
动态欧拉角:使用物体本身的坐标系,所以它会随着物体的旋转而旋转。 (局部坐标系会随着物体的旋转而旋转)
三、四元数旋转
优点:可以避免万能锁; 只需要一个4维四元数就可以围绕任意一个经过原点的向量进行旋转unity 绕轴旋转,方便快捷,在某些实现上比旋转矩阵更高效; 而四元数旋转可以提供平滑的插值。
缺点:比欧拉旋转稍微复杂一点,因为多了一维,比较难理解,不直观。