射击游戏里的子弹是如何飞行的
从第一款FPS游戏《德军总部3D》出现以来 , 这种类型的游戏广受好评 , 创新的玩法也层出不穷 , 比如“吃鸡” 。

文章图片
△第一款FPS游戏《德军总部3D》
但是你知道游戏里的子弹是怎么飞行的吗?
早期 , 它和现实世界中的子弹完全不一样 , 很多玩家合理地利用了这个bug , 比如CS里的甩狙 。
随着PC运算能力的提高 , 子弹的算法也在不断进步 , 弹道的效果越来越真实 。
最近一位软件工程师TristanJung在游戏论坛上总结了FPS游戏的一些子弹轨迹算法 。 让我们一起来看看FPS游戏这二十多年来发生的变化 。
挡住射线的都会死
早期的FPS游戏都采用一种“光线投射”(raycasting)的技术 , 用枪口发射出去的射线来确定子弹的轨迹 。 光线投射可以确定与光线相交的第一个对象 。

文章图片
在FPS里 , 这种算法叫做“命中扫描”(hitscan) , 当你扣下扳机时 , 物理引擎会计算下面几件事:
枪口所指的方向;
从枪口射出一束射线 , 直到达到规定的范围 , 比如碰到墙;
确定光线投射的路径上是否光线是否撞击物体 。
如果引擎发现你有物体挡住了子弹的路径 , 就是通知系统该物体被击中 。

文章图片
△方块挡在了子弹A射向B的路径 , 引擎告知方块已被击中
hitscan的核心很简单 , 至于物体被子弹击中后的下一步逻辑是什么 , 可以根据游戏要求定义:
1、如果允许子弹穿透 , 那么它将穿透路线上的所有物体;
2、消除最大的射线范围 , 就可以一直发射出激光 , 直到命中物体为止;
3、将某些表面设置为具有反射性 , 可以将子弹弹开 。
使用hitscan算法 , 最大的好处是计算简单快速 , 不需要额外的内存或处理时间即可构建新的物理对象 。 这也意味着在多人游戏时 , 所需的网络资源也最少 。
因此 , 行业中的许多游戏都将hitscan用作射击算法也就不足为奇了 。
不仅《德军总部3D》和《毁灭战士》这些经典游戏采用 , 连近年来的一些热门游戏也是 。 比如《守望先锋》、《使命召唤》里的一些武器即是采用hitscan算法 。

文章图片
但是hitscan还是存在着一些缺陷 。
首先 , 子弹的速度是无限的 , 比光速还快 , 瞬间到达被击中的物体 。 即使你离目标很远 , 只要你开枪的一瞬间 , 对手在准星上 , 就必死无疑 。

文章图片
△扣动扳机和目标上的火光同时出现 , 说明子弹是瞬间击中
其次 , 子弹的路径是直线 , 没有考虑风向、重力等因素 , 即使在建模的时候把路径改成曲线 , 但是在子弹射出后也无法更改路径 。
为了让射击游戏更真实 , 就需要使用另一种方法 。
给子弹加上弹道
这个算法听起来很花哨 , 其实很简单 。
武器射出的每颗子弹 , 都会在环境中创建一个新的物理对象 , 有着自己的质量、速度和引擎要计算的命中框 。
由于每个弹丸都是独立存在的 , 因此可以考虑风力、摩擦、重力和温度等因素 。 任何作用在子弹上的力都会改变其方向 。

文章图片
而且在这种算法下 , 子弹不会瞬间移动 , 还可以实现以下功能:
1、在一些游戏中有“子弹时间”特效;
2、如果长距离狙击移动目标 , 需要提前目标的估计移动量;
3、实现榴弹等爆炸物的延迟爆炸 。

文章图片
但是在进行多人游戏时 , 服务器将需要做更多的计算 , 来确保所有对象都同步 , 并且必须解决不同客玩家之间的差异或冲突 , 以免在同一台服务器上给玩家带来不一致的体验 。
一个方法是 , 在游戏时间之前加载对象的“池” , 并在需要时“弯曲并启用”它们 。 一旦撞击到物体表面 , 就回收这个对象 , 将其保存以备后用 。
这种方法将减少反复创建和销毁对象的计算和内存成本 。
至于游戏时间的同步 , 存在着多种计算方法:
1、时间是与渲染分开计算 , 即使存在跳帧 , 游戏也能精确地表示对象 。 这种方法需要计算自上次渲染之后经过的确切时间 。
2、计算每一帧的时间 , 将物理引擎绑定到帧速率 。 如果禁用帧速率上限 , 或开始丢帧 , 则会看到加速或卡顿的效果 。

文章图片
而且 , 这种算法在子弹速度足够快时 , 可能会遇到对象彼此“互穿”的情况 , 尽管它们在引擎中从未重叠 。
混合系统
有没有办法结合了以上两种方法的优点呢?答案是有的 。
最简单的办法就是不同武器使用不同的引擎 。
大多数FPS游戏引擎可以处理两种类型的子弹模拟 。 这样就可以选择拥有各种各样的武器 。 《侠盗猎车手》和《半条命》等游戏都具有可以支持两种物理类型的武器 。
比如《光环》中的突击步枪使用命中扫描引擎 , 而刺针枪使用子弹弹道模型 。

文章图片
游戏开发人员还可以混合使用两种技术来弥补每个系统的弱点 , 从而提供更加逼真的体验 。
例如 , 要解决物体从弹道互穿的问题 , 可以在引擎的每个时刻上绘制子弹射线 , 查看射线是否会相交 。
也可以混合两种算法以增强游戏的功能 。
【射击游戏里的子弹是如何飞行的】《狙击精英》系列就是一个很好的例子 。 扣动扳机后 , 引擎将使用hitscan来确定子弹是否足够靠近目标以触发慢动作 。 如果结果为true , 引擎将在子弹时间内计算弹道 。

文章图片
推荐阅读
- 通达信精选指标:价位时空主图,画线战法是技术派的核心内功
- 疫情冲击经济,第一个“破产”的国家出现!今年5次调查自华产品
- 美国用“核试验”来恫吓中国“核裁军”,那是赤裸裸的核讹诈
- 寂然单排134连胜,队友却全程挂机,赛后寂然发现挂机队友的一个秘密
- RNG新上单暴露了?绿毛小明聊天记录曝光:记得照顾好我们的兄弟
- 下周开始,缘分跟桃花邂逅相遇,迎来幸福爱情的四生肖,恭喜脱单
- 情商高、会说话,相处起来很舒服的星座,走到哪里都受欢迎
- 笑起来超迷人,却不喜欢笑的星座,摩羯上榜
- 十二星座里,翻脸比翻书快,特别爱作的4个星座
- 又一位“埃梅里”,巴黎青训小将崭露头角
