为什么3D游戏摄像头会抖动?详细解释万向节锁

当你在玩3D自由视角游戏时,如果你向上或向下看,有时相机会突然向某个方向抽动。这种现象在图形学中有一个专门的名字,叫做万向节锁(万向节死锁,或称环锁)。

参考视频:欧拉(万向节锁)讲解

首先我们知道,在三维坐标系中,相机可以沿X、Y、Z三个轴旋转,也就是在传统的欧拉坐标系中。

如图,绿色代表Y轴旋转轴,红色代表X轴旋转轴,蓝色代表Z轴旋转轴。

然后,让我们转动Y轴,使箭头指向右边。

再次转动x轴,使箭头朝上。

这时你会发现Z轴和Y轴的旋转轴重合,你失去了一个旋转轴的自由度。

也就是说,没有一条轴线能使箭头直接转向你。

我们找不到那个灰轴,可以直接把箭头转向你!

但这并不意味着箭头不能转向你,只是我们需要多根轴同时转向才能让箭头朝向你。

X、Y、Z轴同时旋转,箭头指向你之后,我们发现它的旋转轨迹其实就是那条黄线。

这条黄线并不是将箭头转向你的最短路径。相反,它非常曲折。

这就是为什么有时从3D视角看镜头会抖动:

你想让摄像机向上看,但它会绕到左边,然后向上看。

但是有的读者可能会说,我从来没有遇到过这样的情况!

是的,这种情况是可以避免的。

那么,如何解决万向节锁呢?

答:再加一个维度,就是四维旋转。

而这个4维的旋转量叫做四元数。

在目前主流的游戏引擎中,都提供了四元数运算,也建议制作方使用四元数进行旋转。

四元数可以实现平滑插值,避免万向节锁。唯一的缺点是可能有点难以理解(苦笑

其具体用法,可以参考本文。