unity里面有三种旋转控制方式,矩阵控制旋转,四元数控制旋转和欧拉角控制旋转。 矩阵控制旋转因为添加了无畏的计算量而不推荐使用, 欧拉角是日常生活中描述旋转最多最好理解的方式, 但是unity提供的旋转api都是基于四元数的,这是为了规避欧拉角旋转带来的弊端:万向锁。
说万向锁之前先说一下,欧拉角旋转的机制,这个机制是理解万向锁的基础,我们以前可能会通过调节物体的rotation参数观察物体的旋转觉得自己了解了欧拉角的旋转机制。但是可能只是了解了一部分。没真正了解欧拉角的旋转机制,理解万向锁不会很容易。
unity的物体inspector面板的transform部分有rotation参数,是用欧拉角来表示的 这里的x对应的蓝色,y对应绿色,z对应蓝色,当调节x参数的时候,箭头会绕着蓝色圈代表的轨迹旋转,其他同理。 欧拉角的旋转是一层嵌套一层的,嵌套顺序可以任意,如图所示是z嵌套在x,x嵌套在y,这种嵌套关系使得最外层的旋转会影响内层的旋转。理论上欧拉旋转是可以很直观全面无死角的旋转物体。unity的inspector面板的rotation参数调节旋转采用的机制是这个机制。
理解了欧拉旋转的机制之后,假设嵌套关系如上图所示,这时物体的欧拉角是(0,0,0)。这时我将物体的z旋转90度。这时红圈就会和绿圈重合,此时红圈代表的x和绿圈代表的y的旋转轨迹是一致的,如下图所示。 此时unity里面调节物体的inspector面板的rotation的x和z, 物体的旋转轨迹是在同一个平面。这就是万向锁。
在unity中,最简单出现万向锁的机制是,先将物体的rotation调节到(90,0,0),然后这时调节y和z,会发现物体的旋转是围绕在同一个平面进行的,情况和上面描述的一样。
参考链接: 欧拉旋转 详解万向锁