在射击游戏中,最能直观的表现武器射击表现的无疑是关于后坐力的,但在收资料的时候发现网上这些信息是零碎的,切大家更加关注与实力提升挂钩的各项参数。所以这里尝试分析后坐力的机制,并提供思路给大家作为参考。文章会引用一些经过我修改的游戏DEMO与其他人的视频,他人部分会表明出处。
在不同的射击游戏中,游戏会采取不同的开火逻辑,举个例子游戏COD中子弹是绑定在准星上的 大多游戏是子弹绑定在摄像机上,较为硬核的游戏子弹是真实的从枪口射出。在COD中GunKick机制在动画层面就可以很好的实现子弹的开火散布,但在CSGO中就需要开火时子弹 有随机来实现散布。而在CS中子弹不跟随准星又是其独特的存在。
影响后坐力的因素很多,不同游戏的Gunplay中表现层面会大有不同,有些游戏可能纯在全部机制,而有些可能只有1到俩个机制来影响游戏的后坐力表现。我们将讨论基于早期《使命召唤》与现代的射击游戏后坐力进行分析。
最后我们需要知道引擎中方向的坐标系 Pitch(俯仰角) Yaw(偏航角) Roll(翻滚角) 也就是X Y Z,来更好的 理解后坐力机制。
Visual Recoil(视觉后坐力)指的是游戏通过相机动画、武器模型摆动、准星震动等方式,制造出一种“仿佛枪在后坐”的感受。它的本质是表现层的反馈设计,而非真实的子弹偏移逻辑。
每当武器被发射时,都会播放一个动画,该动画会“震动”模型,给人一种玩家持有的武器已经后坐力的印象。
View kick 是指在射击时,玩家的视角(摄像机方向)被强制偏移,模拟武器后坐力对射手瞄准点的干扰。与 Visual Recoil(武器模型的视觉反馈)不同,Viewkick 直接作用于玩家的输入层级:它改变了十字准星或瞄准方向的位置,从而影响子弹实际落点。
ViewKick通常由更改模型的pitch与Yaw来实现。包括但不限于
adsViewKickPitchMin/adsViewKickPitchMax(开镜时Pitch偏移大小)以度/秒为单位
adsViewKickYawMin/adsViewKickYawMax(开镜时Yaw偏移大小)
adsViewKickCenterSpeed(速度)
hipViewKickPitchMin/hipViewKickPitchMax(腰射时Pitch偏移大小)
hipViewKickYawMin/hipViewKickYawMax(腰射时Yaw偏移大小)
hipViewKickCenterSpeed(速度。通常比ADS低,模拟腰射的不稳定)
以游戏《三角洲行动》举例,理性状态下视口中心为武器瞄准点,我们画俩条线代表游戏中的Yaw(红色)与Pitch(蓝色)。在执行开火命令时,视口以随机速度进行移动。虽然移动的速度是随机的,但是程序会确保在adsViewKickYawMin/adsViewKickYawMax的值之间。数值为正,视口往左。数值为负,视口往右。
偏离阶段:在视口移动时,对其施加加速度影响,将准星偏离中心点。此加速度的大小取决于 adsViewKickCenterSpeed 的值和视口移动的方向。我们会看到引擎会给朝向V的方向拉回来,由于数值会很大,所以v很快就会被拉停。
回正阶段:结束偏移后,视口需要重新回到原始目标点。此时的回正加速度会比adsViewKickCenterSpeed 小,以早期的COD为例,这个值为adsViewKickCenterSpeed的1/16.
举个更直观的例子。假设adsViewKickYawMin/adsViewKickYawMax为+-20(°/s),adsViewKickCenterSpeed为160°/s²。我们已角速度公式ω=ω0+αt,v会在1/8秒及0.125秒后停止。而偏移回到初始位置的结果为 θ = ω₀t + ½αt² 。即0.125+0.5=0.625秒。
停止阶段:在进行下一次射击前,视口会回到初始点并消除一切速度的影响。直到下一次射击。
那么在连续射击时会有所不同,视口会在恢复前(及回正状态开始前或者后,未达到停止)继续添加下一次射击的速度。
在现实中,物体在受到新的力之前会继续受之前速度的影响并保持惯性连续。但在ViewKick机制中,旧速度是会被被清空,不会叠加。不会因为上一枪往左边,下一枪继续更快的往左边。
这基本就是ViekKick机制的核心。Pitch偏移同样取决于adsViewKickPitchMin/adsViewKickPitchMax的大小。但Pitch的值会明显比Yaw的大,以此来体现后坐力的感觉。
但在同时应用俩个方向的偏移时,由于Yaw的数值通常较小,会比Pitch更快的回正。此时应该采用俩个不同且独立的加速度值。所以可能出现Yaw轴已经回正了 Pitch轴还是回正的过程。这就需要调整不同的addViewKcikCenterSpeed的值来体现不同的手感。
在理想情况下,ViewKick会反复执行偏离阶段使得视口持续上跳,所以我们需要一些保护措施来保证视口不会飞到天上去。在游戏中我们会限制Pitch与Yaw的最大值,使得偏移到达最大值时速度将为0.
Error: Unsupported Atomic Block,请用退格键删除此行同样的限制机制也适用于腰射状态,限制的ViekKick的值可能有所不同。 当然,我们也可以不加以限制。就会如视频所示,视角直接飞上天。
枪踢是玩家瞄准标线相对于视口中心位置的扰动,由开火武器产生 。主要体现在武器模型的局部动画或空间偏移,而非直接作用于玩家的视角或准星位置。注意,不是所有游戏都有GunKick,CS就基本没有这个机制。Gunkick与ViewKick的机制十分相同,但有不同的数值来影响GunKick的运行。我们从影响GunKick的变量来理解。
hipGunKickReducedKickBullets
hipGunKickReducedKickPercent
hipGunKickPitchMin/hipGunKickPitchMax
hipGunKickYawMin/hipGunKickYawMax
hipGunKickAccel
hipGunKickSpeedMax
hipGunKickSpeedDecay
hipGunKickStaticDecay
adsGunKickReducedKickBullets
adsGunKickReducedKickPercent
adsGunKickPitchMin/adsGunKickPitchMax
adsGunKickYawMin/adsGunKickYawMax
adsGunKickAccel
adsGunKickSpeedMax
adsGunKickSpeedDecay
adsGunKickStaticDecay
gunMaxYaw/gunMaxPitch
注:我们在腰射是基本不会考虑GunKick的影响,这是GunKick与Visual Recoil基本相同。此时的腰射数值与Visual Recoil配合来进一步增强射击后坐力的视觉效果。
我们对于GunKick的讨论将再次从Yaw轴开始。 和之前一样,我们会在hipGunKickYawMin/hipGunKickYawMax选取一个随机的速度。在射击超过hipGunKickReducedKickBullets的值后,速度将将减少为由hipGunKickReducedKickPercent确定的百分比(0%-100%)数。此减少适用于所有后续射击,直到单次扳机扣动中发射的射击次数超过 adsGunKickReducedKickBullets。
Gunkick在处理持续偏离的阶段也与ViewKick不同。在ViewKick中新的速度会替代旧速度,以此来改变视口的变化。在Gunkick中新的速度会添加到旧速度中。
例如,如果瞄准标线以每秒 40 度的速度向左移动,并且选择下一次射击的速度向左移动 20 度,则下一次射击的速度将为每秒向左移动 60 度!如果旧速度和新速度的符号(方向)相反,速度也可以相互抵消。
GunKick对于停止阶段更为简单。它将不会在经过中心时直接停下,它允许越过中心点偏移另外的方向。此时加速度相反,确保回到视口中心。
GunKickSpeedMax 是 Gunkick 的另一个方面,它与 Viewkick 不同,尽管它非常简单。如果射击会导致瞄准标线的总速度超过 adsGunKickSpeedMax,则速度会立即降低到此值。然后,Gunkick 的其他机制照常接管。
我们从以下三个参数来详细了解GunKick的全过程。
hipGunKickAccel 在开火后施加到武器模型上,使模型进行偏移。
adsGunKickSpeedDecay 用于模拟在枪甩开后遇到阻力减速的过程。
adsGunKickStaticDecay在回正过程中Accel将以adsGunKickSpeedDecay的值来回到原始点的力度。
我们梳理一下,Accel是一个加速度值。在偏移的过程中受到了SpeedDecay确定的阻力的影响。在完成偏移后,adsGunKickStaticDecay变量将会削弱Accel 的值。
在A阶段偏移受到阻力的影响加速度与速度相反,物体减速(B),C阶段速度为0,偏移结束,此时没有阻力,加速度减小。D E阶段开始回正,此时加速度有速度同方向但数值更小,加速更慢。F G偏移越过中心,加速度与速度相反并恢复正常,速度听的更快。H 偏移结束,没有阻力 。 I 加速度减小,同方向 开始加速。之后会再次越过中心开始以正常且相反的加速度开始快速减速,来回摇摆,直到停止。
3.4 Idle Sway/Idle Jitter
Idle Sway,通常译为“静态晃动”或者“武器摇摆”,是一种视觉机制。但不同于Visual Recoil,Idle Swayu会使模型与瞄准视口围绕起中心点进行周期性、低幅度的摆动,从而改变武器的弹着点。在《使命召唤:现代战争》2019&《战区》中的被广泛使用。
我们也将再次讨论ads的情况下的Idle Sway,这对于腰射来说没有意义,只会在弹着点上增加更多的不稳定因素。
Idle Sway可以被视为一种低频、低幅度的周期扰动。以二维简谐振动作用于Pitch与Yaw。我们可以看在上面的视频明显的看出摇摆的幅度为一个倒着的8。
我们可以用一个方程来描述视口的变化。利萨茹曲线(Lissajous curve)
x = A sin(at + φ) y = B sin(bt)
x(t)=Ax⋅sin(ωxt+ϕx) y(t)=Ay⋅sin(ωyt+ϕy)
x(t): Yaw 偏移(水平偏航)
y(t): Pitch 偏移(俯仰角度)
Ax, Ay: 摆动最大幅度(决定影响范围)
ωx, ωy: 角频率(决定摆动速度)
φx, φy: 相位差(决定运动轨迹形状)
当频率比 ωx : ωy = 2 : 1 且相位差 φ = ±π/2 时,相机的运动轨迹呈现为一个椭圆,且该椭圆的长短轴与坐标轴平行。
Idle Jitter 是一种非周期性、随机的小幅度表现,在Idle Sway的基础上添加轻微晃动。猜测是通过随机函数作用于Pitch与Yaw。
如果只有 Idle Sway,玩家可以通过观察“呼吸节奏”来精确抵消漂移;Idle Jitter 的随机扰动让这种补偿变得不完全可靠。而与其他机制配合会有更真实的表现体验。
3.4.3 历代Cod的对于Idle Sway/Idle Jitter的不同
在早期的Cod中 你的Idle Sway只会在你不开枪的时候作用与准星,而在开枪的一瞬间,后坐力会接替准星的跳动。
而在《使命召唤:现代战争2019》,也就是cod16,武器瞄准晃动只影响第一发子弹,开火后瞄准晃动不再生效。
在《使命召唤:现代战争2022》,也就是cod19,武器的瞄准晃动会一直生效,影响子弹的落点。
貌似在《使命召唤:黑色行动6》,也就是cod21,在武器的属性中有一项ADS Idle Sway Delay(单位ms)。它用来确定开镜状态下Idle Sway开始的时间。我们可以从以下来个片段来准确的看到数值对于表现的影响。
我们可以很明显的看ADS Delay对于射击表现的影响。对于Idle Sway机制,在这套机制的影响下就会衍生出屏息与开镜稳定性的概念。
在《战地》系列中,散布机制采用逐帧计算的形式,射击过程中会产生“扩散增加”,而当玩家停止射击或间隔射击时,系统则逐渐减少当前散布值。其独特之处在于,扩散值的减少过程并非线性,而是通过一套包含加速度、偏移量和幂次关系的非线性函数来实现。这使得散布恢复曲线呈现近似对数分布的形态,即:在射击刚停止时,扩散会较快减小,但随着时间推移,减少的速率逐渐放缓,从而保证了更平滑且符合直觉的体验。
Spread exponent:决定扩散减少的加速度
Spread offset:每帧扩散减少的固定值
Spread coefficient: 价差减小加速度的 Beta 值
Spreadₙ = Spreadₙ₋₁ - (1 / SimRate) × [Coef × (Spreadₙ₋₁ - MinSpread)ᴱˣᵖ + Offset]
注:“n”表示当前帧,计算电流扩散,simrate = 战地风云 2042 的 45hz 游戏逻辑循环频率(战地5为60hz)
这套散步机制将扩散曲线会生成一条近似对数分布的扩散曲线。随着持续射击的进行,扩散惩罚逐渐递减。腰射在区域里均与散步,这意味着子弹会均匀分布在扩散锥的整个区域内。
左图中我们只进行单独的视角Yaw轴移动。右图中我们不进行任何操作。
在《Apex英雄》中,我们发现控制器只要平滑的移动就可以做到抵消垂直后坐力对武器的影响,使得武器在压枪的操作上及其的容易。目前并不熟知重生是如何运用这套机制的,但我们可以对比同为Apex的国产竞品《远光84》中并没有运用到这一套机制。(不确定,需要后续更精确的实验)
《战地风云 2042》引入了一个额外的后坐力系统,称为初始后坐力倍增器 (IRM)。IRM (如果存在)提供了一组乘数,以按顺序应用于从武器发射的子弹数量等于提供的乘数数量。IRM 可以分别应用于 HRec 和 VRec。
例如,假设 IRM 提供一种武器,后坐力值为 0.5 上,0.15 左,0.2 右,乘数为:
VRec = [1.8, 1.5, 1.3, 1.1, 1.0]
HRec = [1.2, 1.2, 0.8, 0.8, 1.1]
该武器前五发子弹产生的后坐力为:
Up: 0.90, 0.75, 0.65, 0.55, 0.5
Left: 0.18, 0.18, 0.12, 0.12, 0.165
Right: 0.24, 0.24, 0.16, 0.16, 0.22
这五发子弹中的每一种不仅彼此独一无二,而且与武器的基本值相比,它们都不同。(并非所有武器都有IRM机制)
同样的在《使命召唤》中也存在类似的机制。
在逛插件商店的时候发现市面上优秀且拓展高的Demo与插件十分之多,但不少名字都为后坐力系统,点进去一看是一个程序化的开火动画。于是对于后坐力系统还包括那些机制产生了兴趣,从而写下了这些。
再收集资料的过程中发现,国外的数据收集网站相比国内还是很完整与成熟的(战地,cod一类)。我们甚至可以详细的对比参数,并了解一些游戏里的计算公式。
相比较国内,FPS游戏同样存在数十年,但直到《三角洲行动》上线带来的类cod枪匠机制,玩家才更多的将目光放在了枪械本身的属性对表现与手感的影响。但《三角洲》并没有十分公开的数据支撑玩家搭建类似的对比平台,时不时的暗改也是十分的恶心,可能今天枪的手感与明天就截然不同。不过确实,《三角洲》中不少对cod的像素级模仿,十分的到位,夸一下。
评论区
共 条评论热门最新