射击游戏里的子弹是如何飞行的

晓查 发自 凹非寺
量子位 报道 | 公众号 QbitAI

自第一款FPS游戏《德国总部3D》问世以来,这类游戏受到了广泛的赞誉,创新的玩法层出不穷,如“吃鸡”。

射击游戏里的子弹是如何飞行的

第一款FPS游戏《德国总部3D》

但是你知道游戏中的子弹是怎么飞的吗?

早期,它与现实世界中的子弹完全不同,许多玩家合理地使用了这个bug,比如CS中的狙击手。

伴随着PC计算能力的提高,子弹的算法也在不断进步,弹道的效果也越来越真实。

最近的软件工程师Tristan Jung在游戏论坛上总结了FPS游戏的一些子弹轨迹算法。让我们来看看过去20年来FPS游戏的变化。

挡住射线的人都会死

早期的FPS游戏使用“光投射”(ray casting)该技术,用枪口发射的射线来确定子弹的轨迹。光投射可以确定与光交叉的第一个对象。

射击游戏里的子弹是如何飞行的

这种算法在FPS中被称为“命中扫描”(hitscan),当您扣下扳机时,物理发动机会计算以下事项:

  • 枪口指的方向;
  • 从枪口射出一束射线,直到达到规定的范围,如碰墙;
  • 确定光投射路径上的光是否撞击物体。

如果发动机发现你的物体挡住了子弹的路径,则通知系统物体被击中。

射击游戏里的子弹是如何飞行的

方块挡在子弹A射向B的路径上,发动机告诉方块已经被击中

hitscan的核心很简单,物体被子弹击中后的下一个逻辑是什么,可以根据游戏要求来定义:

1、如果允许子弹穿透,它将穿透路线上的所有物体;

2、消除最大射线范围后,激光可以一直发射到命中物体;

3、将某些表面设置为反射性,可以弹开子弹。

使用hitscan算法最大的优点是计算简单快捷,不需要额外的内存或处理时间就可以构建新的物理对象。这也意味着在多人游戏中,所需的网络资源最少。

因此,业内很多游戏都把hitscan作为射击算法也就不足为奇了。

不仅采用了《德军总部3D》、《毁灭战士》等经典游戏,近年来也采用了一些热门游戏。比如《守望先锋》、使命召唤中的一些武器是hitscan算法。

射击游戏里的子弹是如何飞行的

但是hitscan还是有一些缺陷的。

首先,子弹的速度是无限的,比光速快,并立即到达被击中的物体。即使你远离目标,只要你开枪,对手就会死在准星上。

射击游戏里的子弹是如何飞行的

扣动扳机和目标上的火同时出现,说明子弹瞬间击中

其次,子弹的路径是直线,不考虑风向、重力等因素。即使路径在建模过程中改为曲线,子弹射出后路径也无法改变。

为使射击游戏更加真实,需要使用另一种方法。

在子弹上加弹道

这个算法听起来很花哨,但实际上很简单。

武器射出的每颗子弹都会在环境中创造一个新的物理对象,有自己的质量、速度和发动机计算的命中框。

因为每个弹丸都是独立存在的,所以风、摩擦、重力和温度都可以考虑。子弹上的任何力都会改变它的方向。

射击游戏里的子弹是如何飞行的

而且子弹不会在此算法下瞬间移动,还可以实现以下功能:

1、有些游戏有“子弹时间”的特效;

2、如果长距离狙击移动目标,需要提前估计移动目标;

3、实现榴弹等爆炸物的延迟爆炸。

射击游戏里的子弹是如何飞行的

然而,在进行多人游戏时,服务器需要做更多的计算,以确保所有对象同步,并必须解决不同客户和玩家之间的差异或冲突,以免给玩家带来不一致的体验。

一种方法是在游戏时间前加载物体的“池”,必要时“弯曲并启用”它们。一旦撞击物体表面,回收物体并保存以备将来使用。

该方法将降低反复创建和销毁对象的计算和内存成本。

至于游戏时间的同步,有很多计算方法:

1、时间是与渲染分开计算的。即使有跳帧,游戏也能准确地表示对象。这种方法需要计算上次渲染后的确切时间。

2、计算每帧时间,将物理引擎绑定到帧速率。如果禁止帧速率上限或开始丢失帧,则会看到加速或卡住的效果。

射击游戏里的子弹是如何飞行的

此外,当子弹速度足够快时,该算法可能会遇到物体“相互穿透”,尽管它们从未在引擎中重叠过。

混合系统

有没有办法结合上述两种方法的优点?答案是肯定的。

最简单的方法是用不同的引擎使用不同的武器。

大多数FPS游戏引擎可以处理两种子弹模拟。这样,你就可以选择拥有各种各样的武器。《侠盗猎车手》和《半条命》都有武器可以支持两种物理类型。

例如,光环中的突击步枪使用命中扫描引擎,而刺针枪使用子弹弹道模型。

射击游戏里的子弹是如何飞行的

游戏开发人员还可以使用两种技术来弥补每个系统的弱点,从而提供更现实的体验。

例如,为了解决物体从弹道相互穿透的问题,可以在发动机的每一刻绘制子弹射线,看看射线是否会相交。

为了增强游戏的功能,还可以混合两种算法。

狙击精英系列就是一个很好的例子。扣动扳机后,发动机将使用hitscan来确定子弹是否足够接近目标以触发慢动作。如果结果是true,发动机将在子弹时间内计算弹道。

射击游戏里的子弹是如何飞行的

参考链接:https://www.gamasutra.com/blogs/TristanJung/20191206/355250/How_Do_Bullets_Work_in_Video_Games.php