射击游戏中准心与枪弹弹道的探究
2019-11-18杂谈搜奇网42°c
A+ A-媒介
现如今,佳构游戏合作猛烈,各大游戏厂商都在争相推出“3A”级质量的游戏。而现在比较热点的科幻、战役、行为等品类大多都有枪械射击内容,因此,“玩枪”便成了很大一部分游戏中常见的弄法。当前比较热点的任务招呼系列、战地系列、无主之地系列、战役机械系列另有近来盛行的吃鸡类游戏(绝地求生、碉堡之夜)等等都是玩枪,中心弄法范例上都是属于射击类游戏。因此做好兵器与射击体验,复原传神的射击情况,便成了这类游戏的中心卖点。
射击游戏的分类
现在的射击游戏重要分为两种,一种为“第一人称射击游戏”(FPS)与“第三人称射击游戏”(TPS)。
第一人称
第一人称射击游戏是以玩家主视角举行的射击游戏。玩家不再像别的游戏范例一样支配屏幕中的假造人物来举行游戏,而是设身处地的主视角,体验游戏带来的视觉打击,这就大大增强了游戏的主动性和真实感。
如上两张图分别是1999年出售的反恐精英( Counter-Strike )与2019年出售的任务招呼:现代战役 ( Call of Duty: Modern Warfare )。可以看到,时隔20年,场景与枪械变得越发邃密与传神,界面变得优美与合理,但稳定的是,屏幕中心都做有一个“准心”。
第三人称
第三人称射击游戏与第一人称区分在于,屏幕上显现的主角的视野差别,而且第三人称中玩家掌握的游戏人物在游戏屏幕上是可见的,因此第三人称射击游戏加强调更强调行为感。
如上3张图都是“幽魂行为:断点”的游戏画面,可以看到,在没有对准时屏幕中心是没有准心的,这时候可以将注意力集合在环境、角色行为、游戏剧情等等。当翻开对准时,就会涌现屏幕中心的准心,还可以经由历程Alt键切换第一人称与第三人称(第二张图与第三张图)。
准心
经由历程上述的引见可以看到,不管是第一人称照样第三人称,屏幕中心都邑有“准心”以轻易玩家对准。那为何要有准心呢?为何有了准心以后,我们在游戏中就可以对准目的呢?
实际中的射击
我们在物理课程中相识过,假如抛去枪的庞杂构造不谈,枪的事情道理简朴来说就是,弹头在枪管中遭到推进力后做抛物线活动。
假如弹头在活动历程当中碰撞到目的,则示意击中;若未碰撞到目的,则示意未击中。那末我们怎样对准才击中目的呢?
如图所示,蓝色的水平线则是对准线,代表对准方向;绿色是枪管轴心线,代表枪管的指向方向;赤色则是枪弹的遨游飞翔轨迹。假定枪弹每次从枪口中射出的速率是牢固的,空气阻力也是牢固的,枪弹遭到的重力也是牢固的,那末依据上图的对准体式格局,射击掷中的“远交点”也是牢固的。换句话说,用这把枪和这个对准角度的话,只能击中间隔枪口x米的目的。那末假如我们射击统一方向上比x米更近或更远的目的怎样办呢?
如上图所示,分别为步枪和狙击枪的射击间隔调解要领。步枪中有对准间隔刻度线,调治刻度即可;狙击枪在对准高倍镜中有刻度线,依据目的的间隔,运用对应的对准刻度线即可;手枪由于射击间隔短(大部分射击间隔在50米之内),对准偏差较小,所以不必调治。
游戏中的射击
而在游戏中,未开对准镜的情况下,角色的持枪行为每每如上图所示,将枪牢固于肘关节处。为何要如许持枪呢?由于如许持枪姿态可以减小在第一人称人下枪所遮住的视野,提拔游戏体验,而如许的持枪行为,在实际中是打不准目的的(由于没有三点一线的对准)。在游戏里为了能越发便利开枪,因此加入了准心的观点。
有了准心以后,玩家就可以越发轻易地对准目的,从而取得更好的射击体验。但这类准心“指哪打哪”的游戏结果是怎样完成的呢?
UE4中的枪弹弹道
我刚开始在UE4中完成枪弹弹道时,主意很简答,既然枪弹是从枪中射出的,那末枪弹的遨游飞翔方向固然就是枪口的朝向。为了使枪弹可以击中“准心”的位置,我调解了枪在手中的朝向。
题目
经由重复测试后发明,不管怎样调,只能保证在某一牢固射击间隔时,弹着点能与准心重合。当射击间隔转变时,枪弹就没法击中准心位置,这是什么原因呢?
如上图所示,假定玩家(摄像机)与枪处在统一水平面,从俯视的角度来看,玩家的准心永久指向正前方(用赤色线条示意),而枪则在玩家左手或右手,其朝向(用绿色线条示意)与玩家朝向存在夹角Θ。在该夹角下,只要玩家与目的间隔y时,弹着点才恰好在准心上。不管怎样调解夹角Θ,都只要某一个间隔下弹着点恰好落在准心上(由于两条不平行的直线永久只要一个交点)。而实际上枪与玩家(摄像头)并不在统一水平面,在三维坐标系下,两条不平行的直线最多有一个交点(能够没有交点)。
那末该怎样处理该题目呢?既然两条线只要一个交点,那末能不能依据差别的射击间隔转变枪的朝向,使交点一直在准心对准位置呢?
要想调解枪的朝向,就必须调解枪在玩家动画的骨骼中的相对位置。而且要依据射击间隔及时调解(玩家准心瞄到的障碍物的间隔),这个 运算量会非常大,几乎是不能够完成的,所以这条路走不通,该怎样办呢?
处理计划
既然枪的方向不轻易调解,枪弹的方向总可以掌握吧!可以在开枪时,先依据玩家(摄像机)的朝向,做射线检测,肯定目的弹着点,然后再掌握枪弹的遨游飞翔方向为枪口飞向弹着点,这不就可以完成不管玩家瞄向那里,枪弹都可以击中“准心”的位置的需求吗。
盘算弹着点
如上蓝图代码所示,用摄像机方向(即准心的朝向)做射线检测,返回击中的弹着点坐标与材质(轻易后续播放击中殊效),若未击中任何物体(比方朝天上开枪),则返回射线检测的尽头,轻易客户端展现弹道。
播送开枪
如上蓝图代码所示,取得弹着点坐标与材质后举行播送,在所有客户端上播放该玩家的开枪动画(兵器殊效),并挪用C++函数,应用GamePlayTask生成弹道。
void AWeapon::GenerateBulletTrack(FVector HitLocation, UPhysicalMaterial* HitMaterial)
{
// 枪口坐标
FVector MuzzleLocation = Mesh->GetSocketLocation("Muzzle");
// 向量方向:尽头 - 出发点
FVector Direction = HitLocation - MuzzleLocation;
// 遨游飞翔速率
FVector Speed = Direction.Rotation().Vector() * 10000;
// 遨游飞翔时候:间隔 / 速率
float Time = Direction.Size() / Speed.Size();
// 击中点殊效
UParticleSystem* HitFX = nullptr;
// 击中点材质
if (HitMaterial)
{
EPhysicalSurface SurfaceType = HitMaterial->SurfaceType;
// 该枪已设置该材质范例的击中殊效
if (VarHitFXs.Contains(SurfaceType))
{
HitFX = VarHitFXs[SurfaceType];
}
}
// 运转枪弹轨迹的GamePlayTask
UBulletTrackTask * TrackTask = UBulletTrackTask::InitBulletTrack(BulletTrackComponent, MuzzleLocation, Speed, TargetFX, HitFX, Time, this, HitLocation);
TrackTask->ReadyForActivation();
}
如上C++代码所示,依据击中点坐标,盘算出枪弹的遨游飞翔方向与间隔,然后盘算出遨游飞翔时候,并用这些参数开启枪弹轨迹的GamePlayTask,用于显现客户端的枪弹轨迹及击中殊效。
枪弹弹道
void UBulletTrackTask::TickTask(float DeltaTime)
{
// 纪录遨游飞翔时候
ActiveTime += DeltaTime;
UWorld* World = GetWorld();
check(World);
const FVector OldLocation = CurrentLocation;
// 匀速间隔公式:间隔 = 速率 * 时候
FVector MoveDistance = CurrentVelocity * DeltaTime;
// 新位置
CurrentLocation = OldLocation + MoveDistance;
// 更新轨迹殊效的位置与朝向
if (TrackComponent)
{
TrackComponent->SetWorldLocationAndRotation(CurrentLocation, UKismetMathLibrary::MakeRotFromX(CurrentVelocity.GetSafeNormal()));
}
// 凌驾遨游飞翔时候
if (ActiveTime >= LifeTime)
{
// 有击中殊效
if (HitFX)
{
// 显现击中殊效
UGameplayStatics::SpawnEmitterAtLocation(World, HitFX, HitLocation);
}
EndTask();
}
}
经由历程运转该枪弹轨迹的GamePlayTask,每帧会更新枪弹轨迹殊效的位置,显现枪弹的遨游飞翔历程,假如凌驾了枪弹的遨游飞翔时候,则在服务器已盘算出的击中点发生击中殊效(受伤害殊效)等等,完成了枪弹老是能击中游戏准心对准的目的。
瞻望
上述处理计划是弹道完成的较简化版本,由于没有斟酌枪弹的遨游飞翔时候、枪弹重力、枪械反冲力、空气阻力等诸多要素。假如斟酌这些要素的话,服务器就不合适直接用射线检测来盘算弹着点,而是一样改用GamePlayTask来完成,以便可以准确盘算枪弹遨游飞翔历程当中的受力、遨游飞翔碰撞等等题目。但如许做势必会增添服务器中弹着点盘算耗时(由于会增添枪弹遨游飞翔时候),加大客户端的表现难题(让玩家感遭到开枪有延时),这也是该计划后续的难点。