欧拉角
通过三个分量来表示物体的旋转,但轴之间分量的不同变换顺序得到的结果是不同的
万向死锁
平衡环架(Gimbal) 忘了的话去查,通常会用来解释欧拉角的旋转并演示万向死锁的问题
unity 内万向节层次从外到内分别为 y x z
根据这个,欧拉角变换顺序是 先y 再x 再 z
通常利用平衡环架来理解死锁
通常对于万向死锁解释为 在y旋转时,x z跟着旋转,x旋转时,z跟着转而y不转(这样的运作方式符合平衡环架),这样的话当 x旋转九十度之后,z被带动着与y轴方向重合,此时旋转y与z就会得到一样的效果,万向死锁发生。此时物体丢失了一个旋转轴(自由度),绕y旋转时,会在模型空间下,是显示为在局部坐标的z轴旋转的
实际上,当物体发生旋转的时候,本地坐标是转动的,由于上面的解释与平衡环架相似,并且直观看到万向锁的成因,只是一个方便的类比,方便解释
直接从欧拉角的定义理解
欧拉角 描述的是变换而非运动(旋转),变换的意义是:再给定欧拉角的三个变换参数和顺序之后,将初始姿态变为最终姿态,仅此而已
物体从初始姿态通过 欧拉角变换 直接变换为结果姿态,没有中间过程(以平衡环架为解释的,因为不得不旋转,解释的时候也就会带着旋转,反而忽视了 欧拉角是一个变换的描述)
我们现在将x的变换设为90,此时会发生死锁问题 ,我们将y 设为20 z设为0, 此时,会显示为 模型绕着局部坐标的z在旋转,然而我们要知道,这个变换的过程,是 y x z依次执行的,y先变换20,再将x变换90,此时,视图上就显示为在本地坐标上z轴的20度变换了(别忘了现在的x轴是斜的,不是正对世界坐标的x轴)(平衡环架中都是将中间轴x轴先旋转90,依此来显示另外两个轴的重合,实际上这个是错误的,先旋转的绝对不是中间轴)。而且设 x 90 y从0到20的过程是一个 一度一度的变换过程,形成了帧动画,视觉上再绕旋转,但还是不要忘记我们不是变换的x而是先变换的y然后是x
当我们设置x为90 的时候,看似是在设置好x之后再去调整y(感觉是在反过来调整y轴,直觉上以为我们调整y应该按照当前的y轴旋转),然而每个变换还是要从初始姿态算起,使用时,按照变换顺序变换。因为y处在变换顺序的最前面,每个变换中物体都处于初始状态,无论是否调整了后面的轴,对y轴的修改针对的都是初始位置的y轴(而不是按x变换后调整y绕本地z轴旋转)用户的操作顺序无法改变变换的顺序,导致看起来y的调整在x之后,但其实变换还是发生在x轴变换之前。
调成y的值,仍然针对的是物体的初始姿态的y轴,形成的帧动画也就表现为绕着物体初始的y轴旋转,而不是x轴调整90后的y的值,这就是所谓的“后轴无法带动前轴”的出现。
万向死锁的会导致,当出现时在这个方向上无法进行y轴的俯仰变换,需要将x多变换一段,完成俯仰后再将x变换为90 这样会导致畸形的动画效果
因此万向死锁实际上是 欧拉角设定上的问题,无法消除,可以通过将很难旋转+-90 的轴 设为中间变换轴,依次避免万向死锁问题
Inspector窗口中的Rotation,transform(变量)中的Rotation是四元数
根据视频整理记录【无伤理解欧拉角中的“万向死锁”现象】 https://www.bilibili.com/video/BV1Nr4y1j7kn/?share_source=copy_web&vd_source=c47266c8cb398d42399c6a92a215d503