关于抛物线武器的弹道计算和运动控制

恩。。。先别问我为什么要研究这个问题。:stuck_out_tongue_winking_eye: 你可以自己去猜想,但不一定会得到制作人员的任何形式的确认。

抛物线武器弹道计算目前想了几种,其中一种是严格按照炮弹速度和重力来进行的。
已知目标平面距离R,目标竖直方向偏差Y,炮弹速度V,求炮弹发射角A。
Vxoz=cosAV
Vy=sinA
V
假设耗时t击中目标
Vxozt=R
Vy
t-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(...)

疯了,搞这个太耗脑细胞

:stuck_out_tongue_winking_eye: 牛屎刀要是看到Starburst导弹的脚本岂不还要晕倒?

本公司专业提供各种加密狗复制,<破-解>服务,价格便宜,业务咨询QQ:98746502,技术咨询QQ:75881369
网址:http://www.cpdog.com


[b]软件破-解、加密狗破-解复制专业厂商

赛耐孚软件狗复制100%成功,不成功不收费
咨询QQ:75881369,98746502[/b]网址:http://www.cpdog.com

点击这里和我直接沟通