欧拉变换和万向锁

欧拉变换

由瑞士数学家欧拉提出,主要描述3d空间中对物体的旋转。比如 x轴旋转30°,y轴旋转0°,z轴旋转60°,把这三个组合到一起,对一个3d空间中的物体做一定的旋转(注意:旋转是有一个既定的顺序的,比如 y->x->z)。

万向锁

在unity中出现万向锁的问题:设置x旋转90°,y和z只能旋转同一个方向。

万向锁的问题是欧拉变换在某些特定的角度,产生一个维度的丢失!主要是因为欧拉旋转的机制是存在层级关系,预先定义的旋转顺序(y->x->z),在旋转y的时候x轴和z轴的指向会一起变化,在x旋转的时候只有z轴会跟着变化(x轴在上一步已经操作过了,不影响了)(某个特定角度)导致z和之前的x轴的指向一致时,z轴无论如何旋转都是和x一样的方向,即维度丢失。

介绍下上图的视频:虽然用户拖动先假定了x是定格在90°,然后去旋转y和z。但是实际欧拉变换描述的是一种状态,并不是当前情况下的旋转,它还是按y->x->z这样的顺序执行的。先让y旋转了任意θ角度之后,再旋转x轴90°(或者-90°),这个时候z轴会跟着x的旋转正好和y轴的方法重合了,在旋转z轴等于是在旋转x轴,一个维度丢失了。
在实时渲染中通过公式对其解释
yxz三个轴上的旋转可以表示为三个矩阵相乘的形式 (注意有顺序哦,矩阵乘法是不满足交换律的)。具体解释如下

特殊的矩阵变换和操作

万向锁有什么办法解决?

欧拉变换中无法解决,只能尽可能的避免,第二个顺序旋转轴(这里是x)尽可能避免90°(-90°)的旋转。
如果要彻底解决万向锁问题,只能换一个方式–四元数