恩。。。先别问我为什么要研究这个问题。 你可以自己去猜想,但不一定会得到制作人员的任何形式的确认。
抛物线武器弹道计算目前想了几种,其中一种是严格按照炮弹速度和重力来进行的。
已知目标平面距离R,目标竖直方向偏差Y,炮弹速度V,求炮弹发射角A。
Vxoz=cosAV
Vy=sinAV
假设耗时t击中目标
Vxozt=R
Vyt-1/2Gt*t=Y 其中G为重力加速度常数。
方程看似简单,但却无法求出A的值,仅在Y=0时可以用另一种方法求得A的精确值,因此,sulbon给我提了几种方案:
1.不去计算A,而把炮弹的Vxoz定为V,而Vy则需要计算出来。
具体的式子就变成了:
t=R/V
VyR/V-1/2GR/VR/V=Y,那么Vy可以轻易的计算出来。
2.线性插值法,也就是使用多个A的值来计算分别的R,然后寻找实际的R在哪两个算出的R的值之间,然后以线性的方式估算A。这个方法的计算量会大一些,可能需要预先用其他方法估算A的大致范围,以减少不必要的计算量并提高精度。
3.俯仰角追加法,也就是先按照Y=0的情况计算A,然后再把发射位置-目标位置的俯仰角追加到A上面去。这种方法的精确度有待评估。
后来我也自己想了个方法,高度差修正法
同样是使用Y=0的特殊情况计算出A,然后再根据高度差等数据来修正A的值,如果比发射地点高,那么就使A的值变大,反之则减小,至于具体的差量计算公式这里就不罗列了。这种方法的精确度有待评估。
当时和sulbon讨论时,我还开玩笑是不是要增加炮弹的末端制导功能,毕竟对付移动中的单位,如果去计算提前量将十分困难(平行接近法的直接算法我还没法计算出来),不如在炮弹下降至离地一定距离时开始制导。
炮弹运动控制的大致脚本是:
[OnStart]
TargetDirection:=CalculateAngle(TargetPosX-Position.X,TargetPosZ-Position.Z) //算出目标角
Position.SpeedX:=... //通过上述的计算方式之一求得初速度的三个分量
Position.SpeedZ:=...
Position.SpeedY:=...
G:=0.196 //不同星球的G值不同
Position.SetAccelerate(0,-G,0) //设置重力加速度
StartThread("GroundCollideCheck","GroundCollideCheck")
StartThread("Guidance","Guidance")
[GroundCollideCheck]
while(1)
if(Position.Y<=Terrain.GetHeightAtPoint(Position.X,Position.Z))
Weapon.Destroy()
end
wait(1)
end
[Guidance]
while(1)
if(Position.SpeedY<0)
if(Position.Y-Terrain.GetPositionAtPoint(Position.X,Position.Z)<=80)
if(TF.TargetCount==0)
TF.ChangeTargetType(5)
TF.ScanTarget()
else
//末端制导控制代码
...
end
end
end
wait(1)
end
[OnDestroy]
Weapon.EmitAnim(...)
Weapon.PlaySound(...)
DamageField.Create(...)