欧拉角
欧拉角是用于描述刚体方向的三个一组的独立角参量。对于任何参考系,一个刚体的姿态,是依照一定的顺序,围绕参考系的三个轴做三个旋转而成
Pitch、Yaw、Roll
在飞行器的航行中,进行X Y Z三个方向旋转的旋转有专业的术语,见下图:
沿着机身右方轴(Unity中的+X)进行旋转,称为Pitch,中文叫俯仰
沿着机头上方轴(Unity中的+Y)进行旋转,称为Yaw,中文叫偏航
沿着机头前方轴(Unity中的+Z)进行旋转,称为Roll,中文叫桶滚
Unity 中的欧拉角
在 Unity 中,Transform组件中所使用的Rotation就是以欧拉角形式产生的旋转
在 Unity 中,围绕 Z 轴、X 轴和 Y 轴(按该顺序)执行这些旋转
万向锁(Gimbal Lock)
由于欧拉旋转的顺规和轴向定义,自然造就了“万向节死锁”问题。
平衡环架
首先,我们来了解Gimbal究竟是什么。下面来自维基百科中关于Gimbal的一段引述:
平衡环架(英语:Gimbal)为一具有枢纽的装置,使得一物体能以单一轴旋转。由彼此垂直的枢纽轴所组成的一组三只平衡环架,则可使架在最内的环架的物体维持旋转轴不变,而应用在船上的陀螺仪、罗盘、饮料杯架等用途上,而不受船体因波浪上下震动、船身转向的影响。
上图就是一个Gimbal装置了,它中间有一根竖轴,穿过一个金属圆盘。金属圆盘称为转子,竖轴称为旋转轴。竖轴外侧是三层嵌套的圆环,它们互相交叉,带来了三个方向自由度的旋转
其中Gimbal只代表陀螺仪装置中的平衡环,显然维基百科上将它解释成“平衡环架”更为合理
万向锁
由于欧拉角的顺规和轴向定义,当依次施加三个旋转时,第一个或第二个旋转可能导致第三个轴的方向与先前两个轴之一相同。这意味着已失去“自由度”,因为不能围绕唯一轴应用第三个旋转值
当我们让物体做(90.0,90.0,90.0)旋转,根据Unity中欧拉角的规顺,先进行Z轴的旋转
然而当Z轴为90度时,围绕X轴进动变成了偏航变化,如下图:
也就是说,欧拉角的X轴进动造成最后的变化结果,受到到了预先执行的Z轴进动的影响,它仍然会造成某个相对自身的轴向的变化,但是结果不唯一;同样,欧拉角的Y轴进动,则受到了Z轴和X轴的影响,结果更加不唯一
然而,以上的过程执行,都是严格遵守欧拉角的顺规和轴向定义的。某些时刻,这种不确定的结果,就可能造成某个轴向自由度的丢失
所以,欧拉角的“万向节死锁”问题,是由于欧拉旋转定义本身造成的。这种围绕选旋转前固定轴的先Z、再X、再Y的旋转操作,与其最终所预期的三个轴向可以旋转的结果并非一定是一对一的映射。某些情况下是多对一的映射,造成一些旋转自由度的缺失,也就是“死锁”