欧拉角和万向死锁(Gimbal Lock)

欧拉角

通过三个分量来表示物体的旋转,但轴之间分量的不同变换顺序得到的结果是不同的

万向死锁

平衡环架(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值