为什么单机游戏中的碰撞很不真实?物理引擎真的很难做到和现实一样吗?

为什么单机游戏中的碰撞很不真实?物理引擎真的很难做到和现实一样吗?

皮皮关

这个问题提的太好了,既是玩家们很容易察觉到的问题,而深究起来又有很深的技术原理。

这次咱们避免长篇大论,直接直观地看几种物理参数对“真实性”的影响。

1、物理帧率

现实世界是连续的(只要不要深入到量子物理的世界【滑稽】),现实世界也不是由 CPU、GPU 模拟的;而游戏物理,全靠模拟,模拟真实性的第一个影响因素就是——物理模拟的频率。

先举一个有趣的例子:N 年前跑跑卡丁车可以通过截图操作让电脑变卡、然后穿过障碍。这就是物理检测帧率变低导致出现碰撞错误的典型例子。

所以现在成熟的引擎中,通常物理计算频率和显示频率完全是无关的,就算游戏画面卡成了幻灯片,物理也尽可能保证正确性。而物理帧率越高、计算结果就越准确,下面以 Unity 里的一个简单场景为例,介绍“物理帧率和真实性”的关系。

1、物理 50 帧(Unity 默认的 FixedUpdate 帧率),小球弹了 7 下:

2、物理计算降低为 20 帧,小球弹了 9 下:

显然,之前 50 帧的效果比这个 20 帧的真实太多了。问题是,还能进一步真实吗?答案是可以的。

3、物理计算改为 100 帧,小球只弹了 6 下:

有趣的是,进一步降低物理帧率,比如 1 秒 10 帧,足球甚至会穿过底板……(穿墙的问题有其他解决办法,不在本回答考虑范围之内)。

好吧,大部分读者到这里应该已经恍然大悟了,由于现实世界的物理过程是连续的,那么只要让物理引擎不断提高计算频率,就可以无限接近真实的物理世界吗?

不是的,有两个问题:1、帧率越高 CPU、GPU 负担就越大,迟早要超负荷。2、就算帧率足够足够高了,还会有其他更多问题,下面说。

2、物体外形

以一个简单的模型为例。一般的模型都由美术设计师来制作,包含了许多许多的三角面,以下这把枪,从模型来说一般来说有几千个三角面(因为扳机、枪口等位置都由很多的弧面和凸起)。但是物理系统在处理很复杂的外形时,碰撞检测会成几何级数增加。所以必须采用简化的物理外形:

虽然枪的模型有几千个三角面,但是物理方面,我们把它简化为三个长方体、一个圆柱体。糊弄玩家足够了【滑稽(读者表示其实是 4 个长方体【滑稽】)】。

Unity 也支持直接用 3D 模型作为网格,但是做出了一个非常苛刻的限制:如果一个物体能够在物理世界中自由运动和反弹(被称作刚体),那么它必须具有简化的物理外形。这个问题这么理解:

  1. 皮球打在不同表面上,它的第一次反弹的方向很容易计算,和入射方向、反弹面的朝向有关。
  2. 如果是一把枪撞击到地面上,它会如何反弹呢?你会发现地面碰到枪的位置略有一点差异,那么反弹方向就会有巨大差异,撞在枪口略上一点、略下一点,最终结果会有天壤之别。

所以物体外形带来的复杂度也会对模拟结果带来巨大影响。

3、物体表面的材质

真实世界的碰撞发生时,两个物体之间一定会发生挤压,这个挤压时间很短、速度很快我们可以忽略它。但是在物理模拟时,我们只能采用近似的公式来估计反弹的速度,这就造成了和现实巨大的不同。

现代物理引擎也有“物理材质”的概念,但是它一般只包含“摩擦力”、“弹力”这两个主要方面,与现实世界细究起来差异太大了。

上图是 Unity 中的物理材质,参数为:动摩擦力、静摩擦力、弹性系数。下面两个是选择不同的物理算法。

4、其它问题

其它问题都和计算复杂度有关,一是物理公式的迭代次数,二是误差的累计。

很多方程求值时要采用迭代逼近的方法,循环次数越多结果越精确,但是我们只能强行限制到有限的次数,否则会导致运算量不必要的增大。

另外就是为避免无限迭代下去,当物体速度小于某个非常小的值时,我们就假设它“完全静止”了,这样可以省下进一步模拟的计算消耗。

5、总结

实时游戏的开发和设计,是一个“造假”的艺术,只要能让用户觉得“真实”,而且从性能上讲可实现,那么就达到目的了。

所以伟大的开发者们一方面不断让游戏更真实,一方面还要尽可能降低计算的开销。最终达到一个大部分人都可接受的结果。

虽然物理引擎的效果目前似乎还不尽人意,但是从技术手段上来说,已经有了长足的发展。总之,想对题主说:能玩不错了,凑合玩吧【滑稽】