写在前面

我们知道unity用于旋转有三个表示方法

  • 欧拉角旋转
  • 矩阵旋转
  • 四元数旋转

而大多数游戏引擎或者说3D应用上的旋转都是通过4X4矩阵或者四元数记录,由四元数计算,由动态欧拉角表示。

unity也是这样,unity没有旋转计算是基于欧拉角的,都是由四元数计算封装到上层的。

问题

但用动态欧拉角表示有两个缺点:一是万向节死锁,二是旋转表示不唯一。

万向节死锁:Unity中的欧拉角采用 Y(Heading)–>X(Pitch)–>Z(Bank) 的轴顺序,当Pitch旋转90或-90时,使得Heading和Bank位于同一平面,这样的结果就是丧失了一个维度的旋转,如图图1无法绕z轴旋转。

Unity内部对此进行了一些限制,但我不(是)求(f)甚()解(w)。

(从大佬那偷了一些知识)

  • 对于旋转表示不唯一的限制

    Unity中的欧拉角采用 Y(Heading)–>X(Pitch)–>Z(Bank) 的轴顺序,对应的限制规则,是将**Y和Z轴的旋转数值限制在[-180,180],中间X轴旋转数值限制在[-90,90]**,至于在Inspector中欧拉角可以无限大的情况,是unity编辑器的额外处理,但记得内部就是这么个范围就好了

  • 对于万向节死锁

    • 限制一:阻止通过transfrom.eulerAngle角度设定插值使得物体通过死锁位置
    • 限制二:当Pitch正好为±90度时,四元数—>欧拉角 的转换发生变化

    为什么?我也不知道,挖个坑后面补充

所以就要避免通过欧拉角来旋转物体,四元数计算就能避免这些问题。