Unity万向锁

首先,万向锁是什么——万向锁是  在物体旋转中   遇到的不正常的问题,这个问题会导致物体在旋转时丢失一个维度;

那么什么是维度呢,在这里维度就是x,y,z轴,维度丢失就可以理解为一个物体x,y,z坐标其中一个没用了。

最简单的万向锁现象就是——一个cube的Rotation,先把X改为90,那么现在可以试着调整一下Y和Z,就会发现这两个调整的是同一个轴的旋转,此时无法围绕Z轴旋转。

为什么会出现这种情况呢—— 一.不得不提到欧拉角,欧拉角就是我们平时用的多少度多少度,一周等于360。只要使用欧拉角作旋转就会出现万向锁的情况。(而四元数可以规避这个问题)    

                                            二.为什么欧拉角的使用会导致这个问题呢,现在开始长篇大论。

1.我们现在把注意力回到   一个普通物体的旋转上, 首先,旋转是围绕着一个轴而进行转动。  旋转最终的Rotation是X,Y,Z  那么所有的旋转都可以认为是先经过   三个步骤最后旋转完成。我们假定先X  ,后Y,然后再Z。      

比如旋转的角度都是90度,想象一下这个过程,  我们下意识旋转 是围着X轴,Y轴,Z轴旋转的,而这仨个轴的方向始终没有变化,说这些的目的就是让我们先确定——我们将要说的旋转  是以世界坐标的X,Y,Z轴而旋转的。

2.首先我们要知道,如果抛开unity,假定旋转角度为(90,0,20)那么如果我们 先对一个物体进行(90,0,0)再进行(0,0,20)不管顺序怎样,只要是经过一次一次进行的,那么旋转都不会任何问题,就算是unity里面也是,比如transform.Rotate(90,0,0);transform.Rotate(0,0,20);结果和你想要的是一样的,但是如果transform.Rotate(90,0,20),就会发现有问题,这两个结果是不同的。    ——一次一次分开旋转不会有问题(这里的是指自己在代码中分别对X,Y,Z进行旋转)                     

3.那么为什么合起来会有问题的,这里就要说到unity旋转的步骤,官方文档显示unity在进行旋转时  是经过这样一个顺序

Z->X->Y,这个顺序代表什么呢,就是说不管(a,b,c)怎么变化,始终先旋转(0,0,c),(a,0,0),(0,b,0),这个顺序对于万向锁的理解并没有那么重要,重要的是由于这个顺序影响了这三个轴的父子关系为相反的Y->X->Z,(下面是最重要的)这个父子关系的意思就是  动一下前面的后面的也会跟着动,但是后面的不会影响前面的。还是以一个例子讲解,理解这个例子万向锁就懂了。

4.例子——由于所有的旋转都是围绕世界坐标的(1的结论)那么,比如有一个cube,将要进行(90,0,20)的旋转,首先我们知道那个顺序为Z->X->Y,那么如果我在inspector面板上按顺序赋值Z:20,X:90,就代表Z轴方向的旋转已经旋转完毕,!!!!Z轴已经不需要了,同时此时的Z轴也会随着X轴旋转而改变为旧的Z轴,下一次再旋转就不会再用这个轴了,我们称这个轴为旧的Z轴,新的Z轴还是世界坐标的Z轴!!!! 

但是如果先X90,再Z20   你的顺序并不会改变unity的顺序,只不过在你的视觉上来讲的话,先X90,下次再修改Z的值的话,不会再按世界坐标的Z来旋转了,而是会按照上面所说的旧的Z轴来旋转,所以当这个轴与Y轴在平行的时候   X的改变又不会改变Y轴的方向,所以就会出现Y 与Z的旋转在你看来都在Y方向,而失去了一个维度,也就形成了万向锁。







展开阅读全文

没有更多推荐了,返回首页