网上文章很多,有些写的很详细,但是我个人理解起来有不是很顺畅,把几个重要的知识点整理一下
欧拉角:欧拉角用于控制物体的旋转角度,在Unity中欧拉角的表示就是一个Vector3,例如 Vector3 v3 = new Vector3(30,30,30)
Unity的欧拉角旋转顺序是 Z-X-Y,这个旋转顺序在不同的软件,行业有所不同,没有一个全球统一标准。
旋转顺序:同样的输入值,不同的旋转顺序,得到的结果不同
静态欧拉角:旋转的参考坐标系保持不变(Space.World),这种情况不产生万向节锁
动态欧拉角:旋转的参考坐标系为物体自身的局部坐标系(Space.Self),特定情况下会产生万向节死锁
万向节死锁:中间旋转顺序轴(X)旋转90°,使前顺序轴(Z)和世界坐标系的后顺序(Y)轴重叠,这样在世界坐标系的观察空间内,物体绕自己的Z轴旋转,就跟物体绕着世界坐标系的Y轴旋转一样,这样看物体坐标的Z轴自由度似乎消失了,这种情况就称为万向节死锁。
欧拉角存在多对一的关系,即物体的最终旋转情况,可以用多个欧拉角来表示,例如 Vector3(90,30,30) 等价于 Vector3(90,20,20)
且慢,我刚刚,看到一个跟规定不符合的情况,Uniyt的旋转顺序似乎是 Y-X-Z !!!!!!为什么大家都说是Z-X-Y啊??
如果是Y-X-Z,我就不会困惑那么久了啊!!!
我用文字表达一下:首先物体初始角度是Vector3(0,0,0),此时局部坐标世界坐标相同,假设要旋转的欧拉角是Vector3 v3 = new Vector3(90,30,60),我们来分析一下过程,以世界坐标系的角度来看到物体旋转。先绕v3.y旋转30°,因为此时局部坐标和世界坐标重合,所以你看到物体绕着世界坐标的Y轴旋转,接着绕v3.x旋转90°,旋转后,局部坐标的Z轴和世界坐标的Y轴重合,接着绕着v3.z旋转,从世界坐标系来看就像是绕着Y轴旋转,这样一来,局部坐标的Z轴旋转似乎不起作用,似乎Z轴的自由度消失了!万向节死锁产生了!
简单描述产生过程:Y-X-Z,一开始Y旋转就是世界坐标Y旋转,X旋转90°后,局部坐标系Z和世界坐标系Z重合,局部坐标系Z旋转看起来就是世界坐标系Y旋转