欧拉角和万向节死锁

欧拉角

表示坐标系按一定顺序绕X轴、Y轴、Z轴旋转。这里的三个轴可以是世界坐标系,也可以是物体自身坐标系。如果是绕世界坐标系旋转,则参考坐标不变;但如果是绕自身坐标系旋转,则坐标系一直在变,相同的旋转数值,采用不同的顺序就会有不同的结果!

  • 优点:占用空间小
  • 缺点:同一个方位,存在多种描述。比如(0,5,0)和(0,365,0),(255,0,0)和(290,180,180),无法判断是否相等

万向节死锁

欧拉角表示三个旋转量,每一个旋转代表一个Gimbal(万向节、平衡环架)。在按自身坐标轴旋转的情况下,如果前两个旋转把第三个旋转轴转到了原来某个轴的位置,这时第三个分量旋转的效果就会和绕着原来那个轴旋转一样,只是角度不同。

比如按照X、Y、Z的顺序,先按照X轴和Y轴旋转,把Z被转到了原来X的方向(从世界坐标系看),然后轮到按Z转,这时的旋转跟开始的时候绕X旋转一样(从世界坐标系看)。于是旋转就减少了一个自由度,从而导致GimbalLock(万向节死锁)

实际应用

Unity中用三个角度保存方位,X和Z都是沿局部坐标系旋转,Y是沿世界坐标系旋转(Unity限制代码里设置的x分量只能为90~270)。如果先按照X旋转90度(自身的Z与世界的Y重合),然后再转Y和Z,这时会发现都是在按照世界坐标系的Y旋转(失去了一个自由度),这就是万向节死锁。由于Y和Z都是在同一个轴向旋转,Unity规定在发生万向节死锁时沿Z轴完成旋转,而Y轴一直为0

Unreal中只有X是沿局部坐标轴旋转,而Y和Z都是沿世界坐标系旋转,三个分量都限制在了0~360