如何在视频游戏中模拟子弹?


86

我最近一直在玩MW2之类的游戏,作为一名程序员,我倾向于问自己如何使游戏如此吸引人。例如,他们如何模拟子弹速度。

  1. 当NPC从他的枪中发射子弹时,子弹真的从他的枪中传播到给定的目标,还是他们完全忽略了这部分而只是在目标上放了一个子弹孔?

  2. 如果子弹确实是从枪支射向目标,它实际上以什么速度行进?


25
血腥的屏幕,如此真实!
AttackingHobo

6
:BOOOOORRRIIIING
mahen23

1
我不确定您是否可以称呼Megaman Legend的子弹为子弹,但在Megaman中,他们使用慢速弹丸作为子弹。在这些情况下,如果在拍摄时盘旋奔跑(科里奥利效果),则可以清楚地看到拍摄的曲线。
Lie Ryan

Answers:


84

大多数FPS游戏使用光线投射来进行实际游戏;子弹立即行进,发射时击中目标。

但是大多数游戏也使用“假”追踪器。每3枪,或其他间隔时间,示踪剂就会与子弹一起发射,该示踪剂会非常快,但不会瞬间发动。这仅是一种视觉效果,不会直接影响游戏过程,而是有助于向射击者和被射击者提供提示,并为旁观者提供有关射击的定向参考。

大多数使用此类子弹物理学的游戏都是不现实的,因为没有弹子,没有子弹碎片,并且如果有穿透力,通常是线性的。

某些游戏,例如ARMA II,STALKER(整个系列)使用更逼真的子弹物理原理,并具有传播时间,弹跳线和带有偏转角的穿透力。我相信这些系统正在使用射线投射,但限制取决于子弹的速度。使用这些游戏时,枪口速度可以像ARMA II中那样逼真,或者像STALKER中那样看上去正确。

我非常喜欢具有逼真的子弹物理特性,因为枪支会发射弹丸,而不是激光。


1
没有玩过任何提到的游戏,这会如何影响游戏玩法?我的意思是,如果您将子弹物理学应用到《使命召唤》之类的游戏中,您是否真的看到明显的不同?穿透角度会改变游戏规则吗?玩家会不会意识到自己的角色与射手的弹孔不一致?只是好奇有什么好处可以证明开销是合理的。提前致谢。
Dutchie432 2011年

它给我发现令人愉悦的射击技法增加了不可预测性和深度。项目符号不是即时的!chuckhawks.com/rifle_ballistics_table.htm每秒2644英尺,持续600英尺的弹头需要0.2秒以上的时间才能击中目标,这还不算造成额外的减速。如果您直接瞄准目标,则会错过目标。更远的距离将使弹头比声音的速度慢,从而使人们在听到射击后跳到地面或其他地方。
AttackingHobo

此答案中有几条不正确的陈述,应删除。在下面检查我的答案。
EddieV223 2011年

1
ArmA 2中的子弹是模拟弹丸。它们可以在飞行途中进行修改(速度更改,方向更改),并在它们移动时与对象碰撞。不管是通过射线投射完成还是无关紧要,它们都充当真实的物理对象。
deceleratedcaviar

那么MW2?放光还是不放光?因为他们显然在模拟弹孔和被其破坏的环境方面做得非常出色
mahen23 2011年

51

对于子弹,他们通常不必费心模拟实际在空中传播的子弹,而只需在发射目标的那一刻在目标上放一个子弹孔。诸如火箭之类的其他东西速度较慢*,游戏实际上显示它们在空中飞行。

在短距离内,子弹将随着帧之间的时间间隔移动,无论如何,它们将从射击者到目标之间介于1帧之间或1帧之内。

*即,比现实生活中的火箭慢,以便玩家看到它们在空中飞行。


44

我为PlanetSide编写了项目符号代码。我们有一些“命中扫描”弹丸,但大多数情况下都尽可能地模拟了这些弹丸,因为我们可以根据CPU的限制以及随时播放大量子弹的情况来进行模拟。

在点击扫描的情况下,通常在单个射线广播的情况下,在与接收到输入相同的帧中确定影响。这适用于激光或其他超快速弹丸之类的武器。我们通过将弹丸上的初始速度提高到很高的速度来进行击中扫描,以至于它可以在一个瞬间完成跨越游戏板的运动。

非Hitscan项目符号在图形帧时间或固定时间步长上打勾,并应用了加速度(想想火箭),重力,空气摩擦,制导(想想热弹)的计算。目的是为时间步生成弹丸的终端位置。一旦确定了起点和终点,就可以投射一条或多条射线以近似飞行路径并检测在飞行过程中可能发生的任何碰撞。

在Hitscan和非Hitscan弹丸中,碰撞时发生的情况取决于弹丸的性质和所撞击的表面。例如,您可能会碰到坚硬的表面,在这种情况下,您可能会检查弹跳数,并调整每次反射的位置和速度,或者在达到最大弹跳数时引爆弹丸。在此系统中,火箭的最大反弹计数为0。您可能会击中柔软的表面,然后检查您的穿透力,以确定弹丸是否应继续穿过材料等。

编写代码很有趣。另外,为发生的事情编写良好的调试可视化效果非常有用,这样您就可以直观地检查飞行路线,事件等。


2
在开始编写出色的游戏之前,我曾玩过Planetside,这听起来很有趣。
安东尼

18

这取决于游戏和准确性/真实性的水平。

在多人游戏设置中同步射击和伤害模型非常困难,因为您需要准确确定子弹的发射时间和地点,是否击中了目标以及是否有其他东西通过了路径。

因此,我怀疑游戏设计师可能会通过将某些镜头视为瞬间(以便您只需要考虑单个时刻的每个人的位置)或限制子弹的射程来简化事情。幸运的是,这通常对应于现实生活中的物理学。例如,狙击步枪发射高速子弹。

许多游戏可以模拟缓慢移动的对象(例如火炮,炸弹,标记弹等)的多步多快照路径,但这非常昂贵,并且同步问题更为常见,导致制作有趣的youtube视频。

另一个令人关注的游戏是维护单独的较小“环境”(例如,每个房间都单独模拟)以创建较大空间的幻觉。在这些情况下,可以正确模拟“房间”边界内的事物,以便使房间中的每个人都获得关于子弹在空间中发生的一系列转变的更新,而在该环境之外的其他事物则不知道。


14

对于行进速度超过眼睛看不到的弹丸,通常采用射线投射-从炮口发出的射线以适当的方向进行计算,并针对潜在的目标物体进行测试以确定被击中的目标。如果要模拟子弹掉落之类的东西,这可能会使多条射线和一些额外的计算复杂化。您还可以提高项目的速度,并使用它来为计算增加一些真实感(因此项目符号不是瞬时的)。


11

这取决于实现方式,但我知道Source Engine根本不使用物理子弹(弹丸对象),它们只是从玩家到目标的射线投射,并带有随机的“命中区域”圆(半径更大或更小,取决于武器发射的速度有多快以及玩家是否按住射击按钮(其中心是玩家瞄准的点),然后确定从玩家投射到随机确定点的实际光线并根据其他因素(例如子弹“重量”和枪口速度(所有内部数字),物体被击中等),射线投射被投射到多个物体上或直到其撞击地形。

另一方面,Torque 3D Engine DID使用实际的弹丸对象,设计者可能会影响它们各自的速度,质量和重力修改器。引擎所做的只是每32毫秒更新一次值。

编辑

除了使用弹丸对象外,Torque 3D Engine还允许使用射线投射作为替代。(我制作了几款游戏,其中“弹丸”实际上是一种粒子效果,没有弹丸对象所做的任何支持,因此需要射线投射。)


真棒的故事兄弟 但是,我确定Torque 3D引擎需要更多的处理能力来计算所有这些物理量。
mahen23 2011年

@ mahen23您会感到惊讶。它比源引擎具有更少的物理计算,部分原因是它根本不处理软件碰撞,仅处理简单的边界和碰撞盒。
Casey


5

实际上,许多游戏都使用gpu渲染点击测试算法。这是它的基本工作方式:

1)在屏幕外创建当前视图的渲染,其中所有地形均为黑色,每个字符均为非黑色2)获取十字准线下方像素的颜色3)如果为非黑色,则颜色为- >玩家对应,然后将目标命中。

这种方法已经在游戏中使用了多年,主要是因为它的像素完美。如果玩家帽子的一个像素从墙后伸出,您可以打他。IE浏览器,如果您可以看到它,可以点击它。使用简单的射线投射技术几乎无法达到这种精度。其次,这种测试非常快,可以在GPU上执行。


color-> player查找听起来很痛苦?如果用射线投射,效率会不一样吗?
deceleratedcaviar

实际上,它的速度非常快。渲染所花费的大部分时间来自实际多边形的阴影。在进行命中测试的情况下,仅使用纯色多边形。此外,这种命中测试可以完全在GPU中完成,并且像素完美。除了完美击中目标外,没有其他任何事情能打动玩家,然后让命中测试告诉您这是一次未击中。
蒂莫西·鲍德里奇

但是,如何将像素空间转换为世界空间,再转换为您命中的相应对象。
deceleratedcaviar

@Daniel:正如答案所说,被击中的目标由颜色标识。每个字符都呈现为不同的(纯色)颜色,因此您只需检查颜色即可,黑色=未命中,其他=查找使用该颜色呈现的人,因为它们被击中了。
Dave Sherohman 2011年

@戴夫·谢罗曼(Dave Sherohman),我本来一定是看错了,在读完您的解释后,似乎很清楚他的意思了……干杯
deceleratedcaviar

4

毫无疑问,有些游戏确实使用了现实的子弹物理,并考虑了子弹的移动时间和下落,但是我猜想大多数游戏都不会,至少对于NPC而言。

对于直接引导子弹行进(不掉落)的游戏,该游戏会从枪管的前方追溯一条假想的线(矢量)。然后,计算该线与之相交的点,并在该点记录一个项目符号“命中”。它可能是一个坚固的物体,例如墙壁,在墙壁上,撞击会触发诸如子弹击中的贴花和烟雾/碎屑的“抽吸”之类的效果。它可能会影响易碎的物体使其破裂,也可能会影响物理物体并使其产生“撞击”。或者当然,它可能会击中播放器或另一个NPC并造成生命值打击。硬核模拟将对子弹穿透墙壁的模型进行建模,并在出口一侧触发撞击效果,可能会减少子弹在出口时的损坏。

只是NPC并没有完美的目标,许多游戏在向量中添加了某种随机性来模拟子弹扩散。这是您在现实生活中会看到的,子弹不仅击中了您瞄准的目标,而且还以瞄准点为中心进行了打击。

为了可视化子弹散布,想象一下从枪中射出的圆锥形而不是直线(矢量)。实际的子弹方向被随机化到该圆锥体内的某个位置。如果射手真的很接近目标,则传播范围较小且准确性较高。如果目标距离较远,则圆锥体会增加散布,因此射手击中目标的可能性较小。

射锥的想法可用于对射手准确性(技能),武器准确性和其他条件进行建模。例如,低等级的NPC可能会被赋予低精度的射击锥,而高技能的NPC将会具有高等级的精度。一名用冲锋枪从臀部射击的球员将有一个较宽的圆锥射击,如果他们停止跑步或瞄准,这会减少。狙击步枪本质上比手枪具有更紧密的射击锥。


+1好信息。但是我认为,如果AI实际上不擅长瞄准玩家,而不是瞄准更大的圆锥体,那么在视觉上可能会更令人愉悦。或者,如果您想使圆锥变大,则可以根据后坐力使其变大,并为较低等级的敌人提供更快的尺寸增加速度,因此他们似乎没有经验。
AttackingHobo

1

说起我看过的Nexuiz源代码,他们实际上并没有从A点向B点发送“子弹”对象。如果我没记错的话,这仅针对某些武器,而其他武器则不是发射瞬发命中的武器时,代码将查看枪支指向的位置。如果在单击“开火”时将它对准一个人(并且是即时命中的武器),那么您就命中了。

同样值得注意的是,Nexuiz在服务器端如何计算客户端或服务器上的匹配。如果您怀疑客户端在作弊,则可以切换到服务器端点击量计算,以尝试缓解这种情况。


1

另一种策略是混合渲染所有内容和光线跟踪所有内容。您不必渲染所有子弹。举例来说,如果您的枪每秒发射30发子弹,则草丛可能会产生几百个粒子...您可以使用“示踪剂效果”来减少渲染,每3枪渲染一次,射线追踪其他两个。玩家仍然可以看到每秒向敌人发射10发子弹。

根据您的具体情况进行调整,为较低的火力武器渲染更多,而为较高的火力武器渲染更少。


您应该包括一些信息,说明为什么每3秒钟左右都会有示踪剂。它不是游戏开发商的发展。是军队。弹头后部嵌有磷的示踪剂子弹。发射子弹时,火药点燃磷,在子弹后面留下一条明亮的痕迹。示踪剂子弹比常规子弹更昂贵,因此仅在X镜头左右使用它们即可省钱,同时仍具有能够轻松瞄准的预期效果。
AttackingHobo

同样,您也不想像您所说的那样在渲染和更新中将其拆分。您希望所有子弹物理过程完全使用update方法完成。您希望每个X镜头左右也产生一个示踪剂效果,该效果比子弹慢得多,以显示运动和方向。
AttackingHobo

@AttackingHobo我并不是专门考虑磷弹的,而是从视觉上暗示子弹在飞。这个想法是使用选择性压缩...消除了玩家永远不会注册为“缺失”的细节层次,但这减轻了系统负担。“每第3个项目符号”位是任意的……您必须尝试一下才能看到效果良好。在回答中您说了“假示踪剂”,这也很有意义。
斯蒂芬

1

别忘了帧速率与子弹速度之间的关系可能会成为问题,在某些情况下,如果您对物理引擎的编码不够充分,则子弹可以穿过目标而不会被击中。有一个解决方案,我不太记得。。。

无论如何,我认为在多人游戏环境中补偿现实的子弹可能是非常成问题的,如果延迟开始超过30或50ms,即使不是不可能的话。

但是有一天,ISP可能会更多地关注延迟并提供不同的服务……但是如果没有FTTH,那仍然是一个梦想……


1

在糟糕的公司,Battlefeild 3和缠扰者等游戏中,我认为子弹是像“火箭”一样被发射的实际个体。我只认为如果子弹会立即击中目标,就必须进行射线追踪。当实体以逼真的子弹打勾时,它的自我就会打勾,以查看它是否击中了某人。


0

准确地说,如果您在《使命召唤》中观看视频重放,您会隐约看到橙红色的两足动物从空中飞向目标,而Attackinghobo实际上在大多数情况下确实具有正确的答案。

如果您想要像Hobo所说的Richochet效果,那就去玩任何Halo游戏。如果您从较近的位置向金属墙射击,您会发现子弹从金属上刺破。其中的狙击手会留下一条连绵不断的轨迹。

回答拖延了,我可能稍后再解决。


-5

缠扰者系列游戏中的子弹和所有物理原理均使用名为“ Open Dynamics Engine”的开源库。

http://en.wikipedia.org/wiki/Open_Dynamics_Engine

如果您足够聪明,您甚至可以弯曲子弹以射击您看不见但知道其位置的人,则子弹会因重力而下落,甚至可以非常准确地从墙壁弹回。项目符号是一个实际的对象模型。这是我所见过的最现实的方法,当您开始进入较大的空间时,光线跟踪方法并不实用。不过,可以使用激光枪射击。

使用它的其他游戏BloodRayne 2,《华雷斯的呼唤》,《 Goo》,X-Moto和OpenSimulator。

另一个不错的选择是物理库“ Bullet”。 http://en.wikipedia.org/wiki/Bullet_%28software%29

它用于侠盗猎车手4,红色死亡救赎等等。

ps arma 2使用内部物理引擎,他们的下一个游戏arma 3将使用physX物理引擎


3
列出使用ODE的目的与子弹无关的游戏具有误导性。
2011年

4
说缠扰者使用ODE作为子弹,这实际上是一种误导,而事实上游戏使用了自己专有的碰撞测试,但仅使用ODE求解器。
AttackingHobo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.