武装突袭3吧 关注:46,126贴子:314,743
  • 24回复贴,共1

原版Arma3中的伤害模型和算法

只看楼主收藏回复

最近在纠结游戏的伤害是如何计算的,毕竟也算是很重要的游戏特性,一搜发现这块几乎是一片沙漠,故将其补足.
为避免吞贴,我将其拆分成多个楼以飨读者~
和大多数游戏一样,arma3的人物是有血量属性的(不管你加什么模组),只不过这个一般是隐藏的,健康值为0时,人物就会被认为是死亡.
枪支实际上只是子弹的发射器,不同枪支对子弹射出的效果所能施加的影响非常有限


IP属地:北京1楼2024-11-20 12:35回复
    这里我们先研究子弹特性
    子弹特性(以原版美军MX子弹举例):

    基础伤害(base damage value):每个子弹的基础(也是最高)伤害
    气动摩擦(Aerodynamic):影响子弹速度降低的参数
    枪口速度(Muzzle velocity):初始速度
    预期速度(Expected velocity):当速度低于这个速度时,伤害会减少
    穿透深度(Penetration):这个有计算公式,基础子弹速度 * 子弹口径 *15 / 1000这里我们可以知道,穿透深度和子弹的初速和口径有关
    偏转角度(Deflection angle):子弹归零时的偏转角度


    IP属地:北京2楼2024-11-20 12:37
    回复
      从这里,我们可以知道,伤害和速度高度相关
      这里通过查阅官方文档,发现子弹的运动轨迹是这样的
      对于纯动能的子弹,子弹先从枪口射出,然后以双曲线的轨迹运动,同时速度降低
      在命中目标表面后,记录此时子弹的速度作为”最终速度”
      然后判断是否穿透目标
      而穿透的计算比较复杂,游戏会根据弹药的当前速度、口径、和几何体的材料厚度计算是否满足穿透条件
      有效厚度=厚度 /cos(入射角)
      当弹药的动能(速度与口径的函数)大于目标材料的有效厚度时,子弹可以穿透;否则被阻挡
      如果判定穿透成功,那么子弹会被传送到目标的后方,然后计算穿透后的速度射出
      这么做虽然是违反物理的,但是减少了运算,并不会真的模拟子弹在受击目标内部的运动情况,更不会去计算它
      完全爆炸性的弹药(属性上explosive>= 0.7)没有穿透属性,为了补偿没有穿透,爆炸性武器的初始伤害相当高


      IP属地:北京3楼2024-11-20 12:39
      回复
        至于具体枪械对最终伤害的影响,其实不算太大
        枪械特性(依旧以美军的MX系列武器举例)

        他们三个分别是(突击步枪,卡宾枪,精准射手步枪)
        分散度(Dispersion):这个会影响子弹的分布,子弹的分布会在一个圆内,单位是rad,也就是弧度,这个值越低越好,弧度越大分布越大
        重量(Mass):武器越重,人物负担越大
        惯性(Inertia):影响你人物的惯性,越大越不好刹车(和质量有关)
        灵巧(Dexterity):影响武器的控制,比如后坐力回复,越大越快
        这里面我们可以看到突击步枪性能平均,短管的卡宾枪更适合机动和短距离作战,精准射手步枪适合中远距离作战,这里不再赘述


        IP属地:北京4楼2024-11-20 12:43
        回复

          在这个图中,我们可以看到其他的属性
          比如initSpeed,说明枪械也会对初始速度有一定的影响


          IP属地:北京5楼2024-11-20 12:45
          回复
            伤害的造成

            (上图的”Fire Geometry”是火力几何体”HitPoint”是命中点,子弹必须同时穿过几何体和命中点才能造成伤害)
            在上图中描述了以下的几种情况:
            A: 子弹命中目标并且打穿目标
            B: 子弹命中目标并留在了”命中点”处,可以类比成人体中
            C: 子弹命中目标并留在了”火力几何体”处,可以类比成防弹衣中
            D: 子弹未命中
            E: 子弹没有直接命中,但是该子弹有爆炸属性,造成了范围伤害
            前三种情况中,伤害值从大到小排列是:B->A->C,也就是说,子弹如果击穿目标,伤害不是最高的,但如果子弹没有击穿,留在了”防弹衣”中,目标只会受到一个预先写好的最低伤害
            原理同:停止作用
            情况E比较特殊,游戏的爆炸伤害实际上是一个范围攻击
            在全部伤害范围内(距离 ≤indirectHitRange),目标受到100%的伤害,
            在伤害衰减范围内 (indirectHitRange < 距离 < 4 * indirectHitRange),目标的伤害公式为
            indirectHit_mod=indirectHit * (1 / 距离4)
            在4倍距离外 (距离 > 4 * indirectHitRange),不受到任何伤害
            这个下降率是硬编码的,并不会受到受到任何外部影响

            由此可见,游戏是还原了"停止作用"的
            选择刚好能留在敌人身体中的武器(而不是单纯的口径越大越好),伤害效率最高
            对于车辆目标,了解敌军在车辆的相对位置,使用爆炸性的间接伤害武器,从离敌军人员最近的装甲位置发动攻击,可以让车辆内部敌军吃到伤害,即便看起来并不符合物理(也就是有些人所说的:震荡伤害)


            IP属地:北京6楼2024-11-20 12:49
            回复
              对于有甲目标的伤害,算法是这样的:

              车辆的护甲值比较特殊,他有两个属性: GlobalArmor全局护甲值 和 ArmorCoefficient受击点的护甲修正系数
              综合这两个属性,可以得到有效护甲值:
              有效护甲值 = 全局护甲值 * 受击点的护甲修正系数
              对于一个步兵来说,它没有像车辆那样厚的护甲,原版环境下,防弹衣并无厚度,能直接降低所受的任何子弹伤害
              公式是:所受伤害 = 子弹伤害 / 护甲值


              IP属地:北京7楼2024-11-20 12:54
              回复
                总结来看,伤害是这样计算的:
                直接伤害:

                最终伤害 = 基础子弹伤害* (最终速度 / 典型速度) / (全局护甲值 * 受击点的护甲修正系数)
                间接伤害:
                x表示弹着点和目标的距离,L表示全伤爆炸范围
                最终伤害 = 基础子弹伤害* (1 – 爆炸参数) * (最终速度 / 典型速度) / (全局护甲值 * 受击点的护甲修正系数) + 爆炸子弹伤害 / 防爆属性
                爆炸子弹伤害 = 基础子弹伤害 (x <= L)
                爆炸子弹伤害 = 基础子弹伤害 * [1 / (x4)] (L < x <= 4L)
                爆炸子弹伤害 = 0 (x > 4L)
                这里我们可以看到护甲的防爆属性,他可以用于减少爆炸伤害,与护甲值没有联系


                IP属地:北京8楼2024-11-20 12:56
                回复
                  参考资料:
                  DamageDescription – Arma 3 - Bohemia Interactive Community
                  CfgMagazinesConfig Reference - Bohemia Interactive Community
                  MXseries | Armed Assault Wiki | Fandom
                  本文在贴吧首发,共盖9楼,1800余字,读者可在半小时内读完
                  如有吞贴问题,请回复作者
                  或者加群"925"246"359"反馈本文的问题


                  IP属地:北京9楼2024-11-20 13:00
                  回复
                    贴吧因你而更精彩


                    IP属地:上海10楼2024-11-20 16:29
                    收起回复
                      楼主写的太好了,我反复读了三四遍,我对此提出一些疑问:
                      1.楼主提到了子弹穿透后会降低速度,这个穿透后速度该怎么计算,角度有没有发生偏转。如果射击地面产生的跳弹,速度是怎么计算的。
                      2.玩家在载具里,受到爆炸伤害时,防爆属性是单独计算玩家的吗,在计算玩家最终伤害该怎么计算吗?
                      3.被车创飞怎么算


                      IP属地:广东来自Android客户端11楼2024-11-21 03:37
                      收起回复
                        评论区中提到了一个非常有意思的问题,那就是穿透伤害和跳弹伤害
                        具体分析在11楼,这里我们说结论
                        无论是穿透还是跳弹,子弹在第一次接触后,都会面临较大的速度损失(穿透的速度损失更少)和弹道偏移(上下左右均有,约0到25度),试图依靠穿透或者跳弹来造成可观的次生伤害是不现实的
                        为了规避可能的次生伤害,建议离被集火的目标5m以上,也就是我们常说的保持距离,不仅使得敌人无法一口气将两人同时带走,也能规避潜在的穿透伤害

                        站的太近的模拟军火库小人,第二个目标惨遭次生伤害

                        距离正是相距一个身位


                        IP属地:北京12楼2024-11-22 14:08
                        回复
                          好帖


                          IP属地:贵州来自Android客户端13楼2024-11-24 12:44
                          回复
                            说来有那种添加自定义兵种单位的mod会改动血量或者装备防护等级吗,我之前沙盒测试里不管拿什么口径的武器跟随缘抽奖一样,能拿躯干和头接十几发5.56还不死,纯离谱


                            IP属地:四川14楼2025-01-24 01:36
                            收起回复
                              有兴趣可以继续做做ace系统下的全新计算bug运行模式,乐


                              IP属地:上海来自Android客户端15楼2025-02-17 09:48
                              收起回复