最详解万向锁

来源:互联网 发布:电视伴音收音机淘宝 编辑:程序博客网 时间:2024/04/30 02:01

对于万向锁这个东西,很久都没理解,找了很多资料,最后终于应该是被我明白,自我感觉很多教程没有突出重点,或者我们没有意识到他的重点在哪。

比较经典的两个对于欧拉角的解释一个大概是一个老外做的视频,但是看了之后我反正没搞懂,为什么两个轴会共面,视频地址如下:

http://v.youku.com/v_show/id_XNzkyOTIyMTI=.html

发现的另外一篇比较易懂的则是:
http://blog.csdn.net/fengya1/article/details/50721768

这篇博客可以说是对后者的详解,两者可以参考。

什么是欧拉角?

    用一句话说,欧拉角就是物体绕坐标系三个坐标轴(x,y,z轴)的旋转角度。

   1,静态:即绕世界坐标系三个轴的旋转,由于物体旋转过程中坐标轴保持静止,所以称为静态。

   2,动态:即绕物体坐标系三个轴的旋转,由于物体旋转过程中坐标轴随着物体做相同的转动,所以称为动态。

对于分别绕三个坐标轴旋转的情况,下述定理成立:

物体的任何一种旋转都可分解为分别绕三个轴的旋转,但分解方式不唯一。如:

假设绕y轴旋转为heading,绕x轴旋转为pitch,绕z轴旋转为bank,则先heading45°再pitch90°等价于先pitch90°再bank45°。想要理解万向锁,这句话就是重点!!!

Unity为例进行详解:

     一个物体的初始旋转是(0,0,0),一帧旋转5度,第一次旋转目标是(0,5,0),第一次旋转到这个位置之后,又想让他旋转到(0,10,0),这时候他会怎么旋转?直接由(0,5,0)旋转5度到(0,10,0)?不是的,虽然他现在的位置是(0,5,0),但是他还是会从(0,0,0)开始,从(0,0,0)旋转到(0,10,0)。也就是每次旋转都是由(0,0,0)开始旋转的。如果我又想让他旋转到(5,10,0)怎么办呢?先旋转到(5,0,0)再旋转到(5,5,0),再到(5,10,0)?不对!这就是理解万向锁的关键了,注意看上面加红字,先heading->pitch->bank,也就是旋转顺序是固定的,Yheading,所以应该先旋转Y轴,再旋转X轴,最后旋转Z轴。

接下来就是理解为什么会出现轴共面的现象,先在unity中看下物体如何旋转。

为了方便之后观察,让物体坐标系与惯性坐标系重合,并且绘制惯性坐标系。

 

我们先让物体旋转至(45,45,0),之后我们想要让他旋转到(45,80,45)。注意上面所说,不是由(45,45,0)直接沿着y轴旋转35度直接为(45,80,45)而是从(0,0,0)先到(0,80,0)再到(45,80,0)。所以当物体在(45,45,0)时旋转至(45,80,0)时是先由(0,0,0)时的Y轴旋转,(0,0,0)时候的Y轴与惯性坐标系是重合的,所以也就是可以说按照惯性坐标系的Y轴旋转,再进行其他旋转。看下图Y变换是否是沿着惯性坐标系的Y轴也就是物体(0,0,0)时候的Y轴旋转

 

   而万向锁的产生则是两个轴共面,unity中最简单的万向锁就是先让X轴旋转90度,此时Z轴与物体旋转为(0,0,0)时候的Y(也是惯性坐标系Y)重合了,由图可以看出,所以如果想在(90,0,0)改变Y轴时,是以其(0,0,0)旋转时候的Y轴旋转,也就是惯性坐标系Y轴,而此时Z轴与其重合了,两个轴共面,产生万向锁现象。


注意:旋转顺序并不一定是Y->X->Z,不同的地方可能有不同的规定,但不管怎么样,万向锁现象一定会出现的。

原创粉丝点击