以前一直以为自己已经清楚了这是怎么回事,也没去细想,然而最近又遇到角度的问题,发现还是迷糊,于是又静下心来看了网上的相关文档,并以直白简单的方式分享一下。
还是以unity为例吧
首先,万向节锁只发生于以模型自身坐标系旋转的情况下,代码就是 transform.localEulerAngles = xxx 这种,而 transform.eulerAngles = xxx这种是不会有问题的。
究其区别,就是旋转时轴会不会跟着一起旋转,会就有可能出现万向节锁。
原因如下:
由于坐标轴两两之间互相垂直,因此,三个轴中,任意一个轴c旋转90或-90度,都会使剩下的两轴中的a轴跑到b轴的位置上去,b轴跑到a轴相反的方向。并且,欧拉角的旋转是分解为三个轴向上的旋转并且有一个顺序的(比如先X再Y再Z),三维软件会一直按照某一顺序去应用旋转操作,因此,中间那一个轴转了90或-90度时,第一个轴和第三个轴所应用的旋转从世界坐标系上来看,是在同一个轴上,就是所谓的轴向丢失。
以unity坐标系为例,y向上,x向右,z向屏幕里面。假设应用顺序为x->y->z,如果我想转一个(10,90,20),那么我先在x上面转10度,然后,y转90度,此时,z轴指向了y旋转前x的方向的反方向,所以,第三步,在z上转20度,可以直接减在第一步里,在x上转-10度,因此,可以认为此时在z轴向上应用任何旋转是没有意义的。
同样,如果上面的y是转了-90度,那么把z上的旋转加到x上就可以达到同样的效果。
我试了下,u3d的顺序应该是z->x->y,大家可以试下(90,10,20)和(90,-10,0)的效果是一样的。
顺便一提,网上一个比较出名的视频,外国人讲万向节锁那个,刚开始看不理解啊,为什么三个环要有单向的嵌套关系呢?三个轴应该是一动全动啊?现在想来,这个是数值上的一个建模,不是物理上的。从数值上考虑,最先旋转的轴是不受剩下两个轴的旋转影响的,但从现象上来看,三个轴是一起动的。只不过,有些轴的旋转是发生在其它轴的旋转之前的。
原文地址:http://blog.csdn.net/yangxun983323204/article/details/53113929