前言
关于万向节死锁的问题个人看了一些博客,大多数文章的说法是由于按一个轴旋转了特定角度,使另外两个轴的方向重合,导致损失了一个自由度,并给出了陀螺仪的示意图。但个人对于这种解释很难理解。经过在unity中一番摆弄后,我觉得以下的说法可能更易接受。
先说明想法:我认为理解万向节死锁的两个重点是“按序旋转”和“从头开始”。
按序旋转
所谓按序旋转就是说物体旋转被拆分成按三个轴分别旋转的结果,但这三个轴是有确定的先后顺序的。在unity中手动调整transformer组件中的rotation值,我们会发现从(0,0,0)的状态开始,只有按照y轴,x轴,z轴的顺序进行调整,每一步才会按照物体自身xyz轴进行旋转。说明起码在这种方法下,物体的旋转顺序可以看做先y轴,x轴,最后z轴。这里说的轴应该理解成物体自身的轴,而非世界空间中的静态轴。
从头开始
所谓从头开始就是在对unity中rotation项中x,y,z值进行调整时,不是根据调整前的状态进行变化,而是从头,也就是(0,0,0)的状态开始(此时物体自身的轴与世界空间的静态轴重合)按自身y轴、x轴,最后是z轴的顺序变换成调整后的状态。
比如rotation从(20,0,0)调整为(30,0,0)并不是我们习惯思维中直接按x再转10,而是回到(0,0,0),先按自身y轴变换0,再按自身x轴变换30,最后按自身z轴变换0。这也符合前面说到的按序旋转原则。
举个栗子
y轴绿色,x轴红色,z轴蓝色
这是初始状态
根据按序旋转原则,y轴转0度,x轴转90度,z轴转0度,调整至(90,0,0)
现在只调整z轴,根据从头开始原则,会从(90,0,0)回到(0,0,0),再用按序旋转原则y轴转0度,x轴转90度,z轴转30度。视觉效果上好像是根据上图直接旋转z轴,是因为z轴本来就排在yx的后面。
此时只调整y轴,会发现看起来是按照当前z轴旋转的,这就是万向节死锁现象。原因同上,根据从头开始原则,会从(90,0,0)回到(0,0,0),再用按序旋转原则y轴转-30度,x轴转90度,z轴转0度。造成的视觉效果就是调整y轴和调整z轴好像都是按照(90,0,0)状态时的z轴进行旋转
结论
综上所述,如果不能理解自由度损失的说法,不如这样理解。万向节死锁是我们人类的惯性思维的产物,我们理所应当的认为旋转是在以前的基础上进行的,但计算机却不会记录中间状态,每次只会从头开始,并按照旋转顺序调整至当前设置的状态。这就导致了特定情况下两个不同的调整会产生相同的视觉效果。大家也可以用三根手指摆一组xyz正交基,按照yxz的旋转顺序和从头开始原则模拟一下就能理解了。