美文网首页Unity3D游戏开发程序员Unity技术分享
为什么3D游戏相机会抖动?详解Gimbal Lock

为什么3D游戏相机会抖动?详解Gimbal Lock

作者: 白痴毛 | 来源:发表于2017-09-28 18:21 被阅读134次

    当大家在玩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,唯一的缺点就是大概有点难理解吧(苦笑
    关于它的具体用法,大家可以参考这篇文章

    相关文章

      网友评论

        本文标题:为什么3D游戏相机会抖动?详解Gimbal Lock

        本文链接:https://www.haomeiwen.com/subject/ujjvextx.html