29

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

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzIzNjc1NzUzMw%3D%3D&%3Bmid=2247541022&%3Bidx=3&%3Bsn=31e5a3e4312aabcb5f814eb658f79475
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

晓查 发自 凹非寺

量子位 报道 | 公众号 QbitAI

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

JnMNJ3Q.gif

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

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

早期,它和现实世界中的子弹完全不一样,很多玩家合理地利用了这个bug,比如CS里的甩狙。

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

最近一位软件工程师Tristan Jung在游戏论坛上总结了FPS游戏的一些子弹轨迹算法。让我们一起来看看FPS游戏这二十多年来发生的变化。

挡住射线的都会死

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

VRFvEzf.gif

在FPS里,这种算法叫做“命中扫描”(hitscan),当你扣下扳机时,物理引擎会计算下面几件事:

  • 枪口所指的方向;

  • 从枪口射出一束射线,直到达到规定的范围,比如碰到墙;

  • 确定光线投射的路径上是否光线是否撞击物体。

如果引擎发现你有物体挡住了子弹的路径,就是通知系统该物体被击中。

7VvARfz.png!web

方块挡在了子弹A射向B的路径,引擎告知方块已被击中

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

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

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

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

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

因此,行业中的许多游戏都将hitscan用作射击算法也就不足为奇了。

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

77Rj63Z.gif

但是hitscan还是存在着一些缺陷。

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

FzU3qu3.gif

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

其次,子弹的路径是直线,没有考虑风向、重力等因素,即使建模的时候把路径改成曲线,但是在子弹射出后也无法更改路径。

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

给子弹加上弹道

这个算法 听起来很花哨,其实很简单。

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

由于每个弹丸都是独立存在的,因此可以考虑风力、摩擦、重力和温度等因素。任何作用在子弹上的力都会改变其方向。

queu2eR.gif

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

1、在一些游戏中有“子弹时间”特效;

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

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

FnmA7zi.gif

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

一个方法是,在游戏时间之前加载对象的“池”,并在需要时“弯曲并启用”它们。一旦撞击到物体表面,就回收这个对象,将其保存以备后用。

这种方法将减少反复创建和销毁对象的计算和内存成本。

至于游戏时间的同步,存在着多种计算方法:

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

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

yuYFnyR.gif

而且,这种算法在子弹速度足够快时,可能会遇到对象彼此“互穿”的情况,尽管它们在引擎中从未重叠。

混合系统

有没有办法结合了以上两种方法的优点呢?答案是有的。

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

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

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

BnUvimQ.gif

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

例如,要解决物体从弹道互穿的问题,可以在引擎的每个时刻上绘制子弹射线,查看射线是否会相交。

也可以混合两种算法以增强游戏的功能。

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

MN3Eza6.gif

参考链接:

https://www.gamasutra.com/blogs/TristanJung/20191206/355250/How_Do_Bullets_Work_in_Video_Games.php

作者系网易新闻·网易号“各有态度”签约作者

如何关注、学习、用好人工智能? 

每个工作日, 量子位 AI内参 精选全球科技和研究最新动态,汇总新技术、新产品和新应用,梳理当日最热行业趋势和政策,搜索有价值的论文、教程、研究等。

同时,AI内参群为大家提供了交流和分享的平台,更好地满足大家获取AI资讯、学习AI技术的需求。扫码即可订阅:

了解AI发展现状,抓住行业发展机遇

IjmqqiM.jpg!web

AI社群 | 与优秀的人交流

NRBJNrm.png!web

量子位  QbitAI · 头条号签约作者

վ'ᴗ' ի 追踪AI技术和产品新动态

喜欢就点「在看」吧 !


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK