首先我们知道,因为Unity中欧拉旋转的顺规的定义,环绕Z轴的进动最先运行。所以,Z轴是“严格保护”的一个轴。就是说。当先沿着Z轴进行进动时,不管此时的XY是什么值,终于的结果,环绕Z轴的进动始终造成相对自身运行桶滚变化。
然而X、Y轴就不同了,我们先不考虑Y轴,如果其一直为0。先说X轴。如果Z轴也是保持为0,那么环绕X轴进动,终于的影响是预期的俯仰变化。
例如以下图:
然而当Z轴为90度时。环绕X轴进动变成了偏航变化,例如以下图:
也就是说,欧拉角的X轴进动造成最后的变化结果,受到到了预先运行的Z轴进动的影响,它仍然会造成某个相对自身的轴向的变化,可是结果不唯一。相同,欧拉角的Y轴进动,则受到了Z轴和X轴的影响,结果更加不唯一。
然而,以上的过程运行,都是严格遵守欧拉角的顺规和轴向定义的。
某些时刻,这样的不确定的结果。就可能造成某个轴向***度的丢失。
就拿下图来说:
欧拉角Z轴的进动。最先运行,造成桶滚。这个没问题。
欧拉角Y轴的进动,最后运行,造成沿着欧拉旋转前的Y轴旋转,这也是依据定义运行。然而如今这样的沿着Y轴的旋转。相同也被映射到了物体的桶滚变化。
总结来说。欧拉角的“万向节死锁”问题,是因为欧拉旋转定义本身造成的。这样的环绕选旋转前固定轴的先Z、再X、再Y的旋转操作,与其终于所预期的三个轴向能够旋转的结果并不是一定是一对一的映射。某些情况下是多对一的映射,造成一些旋转***度的缺失,也就是“死锁”。
建议对于写代码来说,你直接去改变Transform的欧拉角显然是不合适的。通过本文也能够看到,这样的结果差点儿是不可预測的。
可是某些情况下,却是能够预期的,就是你仅仅在一个轴向进动,其他两个轴向保持为0,此时有效,而且直接改动欧拉角的代码效率应该是比較高的。