我最近一直在玩MW2之类的游戏,作为一名程序员,我倾向于问自己如何使游戏如此吸引人。例如,他们如何模拟子弹速度。
当NPC从他的枪中发射子弹时,子弹真的从他的枪中传播到给定的目标,还是他们完全忽略了这部分而只是在目标上放了一个子弹孔?
如果子弹确实是从枪支射向目标,它实际上以什么速度行进?
我最近一直在玩MW2之类的游戏,作为一名程序员,我倾向于问自己如何使游戏如此吸引人。例如,他们如何模拟子弹速度。
当NPC从他的枪中发射子弹时,子弹真的从他的枪中传播到给定的目标,还是他们完全忽略了这部分而只是在目标上放了一个子弹孔?
如果子弹确实是从枪支射向目标,它实际上以什么速度行进?
Answers:
大多数FPS游戏使用光线投射来进行实际游戏;子弹立即行进,发射时击中目标。
但是大多数游戏也使用“假”追踪器。每3枪,或其他间隔时间,示踪剂就会与子弹一起发射,该示踪剂会非常快,但不会瞬间发动。这仅是一种视觉效果,不会直接影响游戏过程,而是有助于向射击者和被射击者提供提示,并为旁观者提供有关射击的定向参考。
大多数使用此类子弹物理学的游戏都是不现实的,因为没有弹子,没有子弹碎片,并且如果有穿透力,通常是线性的。
某些游戏,例如ARMA II,STALKER(整个系列)使用更逼真的子弹物理原理,并具有传播时间,弹跳线和带有偏转角的穿透力。我相信这些系统正在使用射线投射,但限制取决于子弹的速度。使用这些游戏时,枪口速度可以像ARMA II中那样逼真,或者像STALKER中那样看上去正确。
我非常喜欢具有逼真的子弹物理特性,因为枪支会发射弹丸,而不是激光。
我为PlanetSide编写了项目符号代码。我们有一些“命中扫描”弹丸,但大多数情况下都尽可能地模拟了这些弹丸,因为我们可以根据CPU的限制以及随时播放大量子弹的情况来进行模拟。
在点击扫描的情况下,通常在单个射线广播的情况下,在与接收到输入相同的帧中确定影响。这适用于激光或其他超快速弹丸之类的武器。我们通过将弹丸上的初始速度提高到很高的速度来进行击中扫描,以至于它可以在一个瞬间完成跨越游戏板的运动。
非Hitscan项目符号在图形帧时间或固定时间步长上打勾,并应用了加速度(想想火箭),重力,空气摩擦,制导(想想热弹)的计算。目的是为时间步生成弹丸的终端位置。一旦确定了起点和终点,就可以投射一条或多条射线以近似飞行路径并检测在飞行过程中可能发生的任何碰撞。
在Hitscan和非Hitscan弹丸中,碰撞时发生的情况取决于弹丸的性质和所撞击的表面。例如,您可能会碰到坚硬的表面,在这种情况下,您可能会检查弹跳数,并调整每次反射的位置和速度,或者在达到最大弹跳数时引爆弹丸。在此系统中,火箭的最大反弹计数为0。您可能会击中柔软的表面,然后检查您的穿透力,以确定弹丸是否应继续穿过材料等。
编写代码很有趣。另外,为发生的事情编写良好的调试可视化效果非常有用,这样您就可以直观地检查飞行路线,事件等。
这取决于游戏和准确性/真实性的水平。
在多人游戏设置中同步射击和伤害模型非常困难,因为您需要准确确定子弹的发射时间和地点,是否击中了目标以及是否有其他东西通过了路径。
因此,我怀疑游戏设计师可能会通过将某些镜头视为瞬间(以便您只需要考虑单个时刻的每个人的位置)或限制子弹的射程来简化事情。幸运的是,这通常对应于现实生活中的物理学。例如,狙击步枪发射高速子弹。
许多游戏可以模拟缓慢移动的对象(例如火炮,炸弹,标记弹等)的多步多快照路径,但这非常昂贵,并且同步问题更为常见,导致制作有趣的youtube视频。
另一个令人关注的游戏是维护单独的较小“环境”(例如,每个房间都单独模拟)以创建较大空间的幻觉。在这些情况下,可以正确模拟“房间”边界内的事物,以便使房间中的每个人都获得关于子弹在空间中发生的一系列转变的更新,而在该环境之外的其他事物则不知道。
这取决于实现方式,但我知道Source Engine根本不使用物理子弹(弹丸对象),它们只是从玩家到目标的射线投射,并带有随机的“命中区域”圆(半径更大或更小,取决于武器发射的速度有多快以及玩家是否按住射击按钮(其中心是玩家瞄准的点),然后确定从玩家投射到随机确定点的实际光线并根据其他因素(例如子弹“重量”和枪口速度(所有内部数字),物体被击中等),射线投射被投射到多个物体上或直到其撞击地形。
另一方面,Torque 3D Engine DID使用实际的弹丸对象,设计者可能会影响它们各自的速度,质量和重力修改器。引擎所做的只是每32毫秒更新一次值。
编辑
除了使用弹丸对象外,Torque 3D Engine还允许使用射线投射作为替代。(我制作了几款游戏,其中“弹丸”实际上是一种粒子效果,没有弹丸对象所做的任何支持,因此需要射线投射。)
在《军团要塞2》维基上有关于他们的弹丸和Hitscan武器行为的非常酷的文章。
实际上,许多游戏都使用gpu渲染点击测试算法。这是它的基本工作方式:
1)在屏幕外创建当前视图的渲染,其中所有地形均为黑色,每个字符均为非黑色2)获取十字准线下方像素的颜色3)如果为非黑色,则颜色为- >玩家对应,然后将目标命中。
这种方法已经在游戏中使用了多年,主要是因为它的像素完美。如果玩家帽子的一个像素从墙后伸出,您可以打他。IE浏览器,如果您可以看到它,可以点击它。使用简单的射线投射技术几乎无法达到这种精度。其次,这种测试非常快,可以在GPU上执行。
毫无疑问,有些游戏确实使用了现实的子弹物理,并考虑了子弹的移动时间和下落,但是我猜想大多数游戏都不会,至少对于NPC而言。
对于直接引导子弹行进(不掉落)的游戏,该游戏会从枪管的前方追溯一条假想的线(矢量)。然后,计算该线与之相交的点,并在该点记录一个项目符号“命中”。它可能是一个坚固的物体,例如墙壁,在墙壁上,撞击会触发诸如子弹击中的贴花和烟雾/碎屑的“抽吸”之类的效果。它可能会影响易碎的物体使其破裂,也可能会影响物理物体并使其产生“撞击”。或者当然,它可能会击中播放器或另一个NPC并造成生命值打击。硬核模拟将对子弹穿透墙壁的模型进行建模,并在出口一侧触发撞击效果,可能会减少子弹在出口时的损坏。
只是NPC并没有完美的目标,许多游戏在向量中添加了某种随机性来模拟子弹扩散。这是您在现实生活中会看到的,子弹不仅击中了您瞄准的目标,而且还以瞄准点为中心进行了打击。
为了可视化子弹散布,想象一下从枪中射出的圆锥形而不是直线(矢量)。实际的子弹方向被随机化到该圆锥体内的某个位置。如果射手真的很接近目标,则传播范围较小且准确性较高。如果目标距离较远,则圆锥体会增加散布,因此射手击中目标的可能性较小。
射锥的想法可用于对射手准确性(技能),武器准确性和其他条件进行建模。例如,低等级的NPC可能会被赋予低精度的射击锥,而高技能的NPC将会具有高等级的精度。一名用冲锋枪从臀部射击的球员将有一个较宽的圆锥射击,如果他们停止跑步或瞄准,这会减少。狙击步枪本质上比手枪具有更紧密的射击锥。
另一种策略是混合渲染所有内容和光线跟踪所有内容。您不必渲染所有子弹。举例来说,如果您的枪每秒发射30发子弹,则草丛可能会产生几百个粒子...您可以使用“示踪剂效果”来减少渲染,每3枪渲染一次,射线追踪其他两个。玩家仍然可以看到每秒向敌人发射10发子弹。
根据您的具体情况进行调整,为较低的火力武器渲染更多,而为较高的火力武器渲染更少。
缠扰者系列游戏中的子弹和所有物理原理均使用名为“ 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物理引擎