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