写在前面
我们知道unity用于旋转有三个表示方法
- 欧拉角旋转
- 矩阵旋转
- 四元数旋转
而大多数游戏引擎或者说3D应用上的旋转都是通过4X4矩阵或者四元数记录,由四元数计算,由动态欧拉角表示。
unity也是这样,unity没有旋转计算是基于欧拉角的,都是由四元数计算封装到上层的。
问题
但用动态欧拉角表示有两个缺点:一是万向节死锁,二是旋转表示不唯一。
万向节死锁:Unity中的欧拉角采用 Y(Heading)–>X(Pitch)–>Z(Bank) 的轴顺序,当Pitch旋转90或-90时,使得Heading和Bank位于同一平面,这样的结果就是丧失了一个维度的旋转,如图
无法绕z轴旋转。
Unity内部对此进行了一些限制,但我不(是)求(f)甚()解(w)。
(从大佬那偷了一些知识)
对于旋转表示不唯一的限制
Unity中的欧拉角采用 Y(Heading)–>X(Pitch)–>Z(Bank) 的轴顺序,对应的限制规则,是将**Y和Z轴的旋转数值限制在[-180,180],中间X轴旋转数值限制在[-90,90]**,至于在
Inspector中欧拉角可以无限大的情况,是unity编辑器的额外处理,但记得内部就是这么个范围就好了对于万向节死锁
- 限制一:阻止通过transfrom.eulerAngle角度设定插值使得物体通过死锁位置
- 限制二:当Pitch正好为±90度时,四元数—>欧拉角 的转换发生变化
为什么?我也不知道,挖个坑后面补充
所以就要避免通过欧拉角来旋转物体,四元数计算就能避免这些问题。