当大家在玩3D自由视角的游戏时,如果你向上或者向下看,有时会出现相机突然向某个方向抽搐了一下的情况,这种现象在图形学中有个专有称谓,叫Gimbal Lock (万向节死锁,或叫 环向锁节)
参考视频:Euler (gimbal lock) Explained
首先,我们知道在三维坐标系下,相机可以沿着X, Y, Z三个轴转动,也就是传统的欧拉坐标系旋转。
如图,绿色代表Y轴转动轴,红色代表X轴转动轴,蓝色代表Z轴转动轴
然后,我们转一下Y轴,让箭头朝右
再转一下X轴,让箭头朝上
这时候你会发现Z轴和Y轴的转动轴重合了,你丧失了一个转动轴的自由度。
即:没有一个轴能让箭头直接转向你了。
我们找不到那个灰色的轴,能让箭头直接转向你!
但这并不意味着箭头不能转向你,只是我们需要多个轴同时转,才能让箭头朝向你
X, Y, Z轴同时转动,将箭头朝向你之后,我们发现它的转动轨迹实际上是那个黄色的线。
这个黄色的线并不是让箭头转向你的最短路径,相反,它很绕很扭曲。
这就是为什么3D视角下有时候会出现镜头抽搐的原因:
你想让相机向上看,但它会向左绕一下再朝上。
但有的读者可能会说,我从没遇到过这种情况!
是的,这种情况是可以避免的。
那么,如何解决Gimbal Lock?
答:再加一个维度,即4维的转动。
而这种4维的转动量,我们称其为四元数(Quaternion)
在目前主流的游戏引擎中,都提供了四元数的操作,而且也推荐制作者使用四元数来进行旋转。
四元数可以实现平滑插值,并避免Gimbal Lock,唯一的缺点就是大概有点难理解吧(苦笑
关于它的具体用法,大家可以参考这篇文章