欧拉角与万向锁—深度解读万向锁


相信很多人听说过欧拉角与万向锁,主要问题是欧拉角为什么会产生万向锁?

有矩阵解读法,但是不够直观,而图像解读又难以理解,什么轴向重合啊,轴向失效啊等等。

其实误区在于万向锁并没有真的“锁”,只是看上去像是锁住了一个轴,这也是导致万向锁概念难以被理解的原因,因为大多数对欧拉角与万向锁的解读,都重点放在了"锁", 最近看到一句对于欧拉角旋转的解读,我认为这句话才是理解万向锁的重点

欧拉角是由三个角度表示,表示物体从原始姿态到目标姿态的一个变换。无论(α,β,γ)三个角度值是多少,都是得从物体的原始姿态开始进行绕轴进行旋转。

问题描述:

在这里插入图片描述
因为欧拉角旋转以自身轴向旋转
旋转X,导致YZ 平面,Y轴轴向向Z轴靠拢
在这里插入图片描述
旋转90° 重合
在这里插入图片描述
最终导致Y轴与Z轴调节效果一致,产生万象锁问题,Z轴看起来不再生效,
在这里插入图片描述

Z轴不生效(轴向重合)

重点是,Z轴为什么不生效

在Blender 查看轴向可以发现,万向锁问题是因为有一个轴始终看起来没有跟着模型改变轴向,如图,绕X轴旋转-90度,Y轴下去了,为什么Z轴不跟着转?Z轴始终朝上!!!!!

就是因为Z 轴没转,导致了Y轴与Z 轴重合,最后绕z 与绕y效果一致
在这里插入图片描述
大部分从图形角度解读万向锁就到此,告诉大家,因为轴向重合了,如图,y,z重合,于是绕y,绕z 效果一致,万向锁

但是我还想再问 为什么?

轴向为什么会重合

这里就进入误区了,我们这时旋转 y,z是把当前状态当成了初始状态去进行操作,我们实际想进行的操作,其实是二次变换

初态未改变是万向锁产生的根本原因。

如图,右边的方片应用旋转,万向锁解除

应用旋转后,旋转Z,即可发现,面片沿Z 轴转了,而不是与X轴相同,本质是初态改变
在这里插入图片描述

初态

在这里我把万向锁的原因归结为对于初态的认知不够,那么我觉得有必要更详细的体现一下什么是初态

如图:两者旋转一致
在这里插入图片描述
在这里插入图片描述

这体现两个事情:

1.欧拉角到目标状态,不是唯一确定的
2.一次变换,唯一确定一个目标态

因此我们得出结论,因为欧拉角到目标状态,不是唯一确定的,所以当我们X,Z重合,所调节的其实是欧拉角到目标状态的集合,

比如目标态为旋转Y=-90°,X= 50°,只要满足 X+Z=50的所有X,Z 都可以从初态变换到目标态

这个第一个事情,解释为什么轴向无效,因为欧拉角有无数种组合可以从初态到目标态,我们调节的是众多组合的一种,让我们产生了一种轴向无效的错觉

二次变换

第二个事情可以解释什么呢,那就是初态与二次变换,我们想要的,其实是二次变换,初态到目标态属于一次变换,而一次变换后,我们想要的二次变换恰巧落在了一次变换——初态到目标态的欧拉角重叠集合当中

(X+Z=50的例子,所有满足的X,Z,而Z恰巧属于我们二次变换需要改变的值)

,因此无论我们怎么做,都无法在一次变换的基础上实现二次变换的效果,本质是因为这些操作落在了一次变换当中

所以我们应用掉一次变换,初态改变(坐标轴重新计算),当前状态成为初态,此时万向锁消失,回到了一次初态的情况。

总结:

万向锁 本质是初态未改变,我们想要一次变换,实现两次变换效果,这是因为我们理所当然的认为欧拉角转动之后的状态就是新状态,我们每次都在新状态的认知上进行旋转,因此当我们认知与实际发生偏差后,我们就说,欧拉角有问题,实际是我们没有深入其中,草草下了结论。

解决办法:

理解了万向锁的本质,那么使用欧拉角就再也不用担心了,只要我们时刻保持对初态的关注,理解欧拉角是从初态到目标态的一次旋转变换,就不会发生万向锁问题

那么实际如何操作呢?

在Blender 中,我们使用应用旋转,这样即初态改变

那么在其余地方呢?Unity,Unreal,Maya,甚至于机器人转向,以及各种旋转问题,这些地方怎么办呢?

其实答案已经在前面提到过了,提示:Blender应用旋转的本质是什么,其余所有情况下解决万向锁问题都是一样的

除此之外,当然还有其余办法可以解决,比如更换旋转方案,采用四元数,矩阵旋转,旋转向量等等,也是不错的方法,
这里就不多介绍了。

此篇只是想为欧拉角正名,万向锁问题是可以在欧拉旋转内解决的

猜你喜欢

转载自blog.csdn.net/euphorias/article/details/123612227