如何为游戏制作“拦截导弹”?

问题描述 投票:0回答:5

我正在开发一款游戏,里面有寻的导弹。目前,它们只是转向目标,这会产生看起来相当愚蠢的结果,所有导弹都跟随目标周围。

我想创造一种更致命的导弹,它将瞄准目标“将”到达的地方,但我对如何做到这一点感到有点困惑和困惑。

我猜我需要弄清楚我的目标在未来的某个时刻会在哪里(无论如何都是猜测),但我无法弄清楚要展望多远。它需要基于导弹距离目标有多远,但目标也在移动。

我的导弹具有恒定的推力,但转弯能力较弱。希望它们能够快速且令人兴奋,但像牛一样驾驶(对于非 HitchHiker 粉丝来说,这很糟糕)。

无论如何,这似乎是 Stack Overflow 帮助我解决的一个有趣的问题,因此任何有关更好或“更有趣”导弹的想法或建议都将不胜感激。

接下来是人工智能来躲避他们......

physics trigonometry
5个回答
22
投票

您所建议的称为“命令指导”,但有一种更简单、更好的方法。

真实导弹通常采用的方式(并非所有导弹都相似)是使用称为比例导航的系统。这意味着导弹“转动”的方向与导弹和目标之间的视线 (LOS) 转动的方向相同,转动速率与 LOS 速率“成比例”......这将执行您的操作当 LOS 率为零时,您就处于碰撞过程中。

只需比较每一秒与下一秒导弹和目标之间连线的斜率,即可计算 LOS 率。如果斜率没有变化,那么您就处于碰撞路线上。如果它正在变化,请计算变化并按比例角速率转动导弹......您可以使用代表导弹和目标位置的任何指标。

例如,如果您使用比例常数 2,并且 LOS 以 2 度/秒的速度向右移动,则将导弹以 4 度/秒的速度向右移动。 LOS 以 6 度/秒的速度向左,导弹以 12 度/秒的速度向左...

在 3 维问题中,除了“LOS 速率的变化”之外,其他问题都是相同的,(以及由此产生的导弹转向速率)本身就是一个向量,即,它不仅有大小,还有方向(我是否将导弹向左、向右转动或向上或向下或向右水平上方 30 度,等等??...想象一下,作为一名导弹飞行员,您将“设置机翼”来施加升力...

雷达制导导弹,“知道”接近速度。根据闭合度调整比例常数(闭合度越高,导弹尝试转向的速度越快),以便导弹在高闭合度情况下转向更积极(当飞行时间较短时),而在低闭合度情况下转向更不积极(追尾)当它需要保存能量时。 其他导弹(如响尾蛇)不知道闭合,使用恒定的预先确定的比例值)。 FWIW,越南时代的 AIM-9 响尾蛇使用的比例常数为 4。


15
投票

我之前使用过这篇 CodeProject 文章 - 它有一些非常漂亮的动画来解释数学。

“导弹瞄准和模拟的数学:从微积分到四次公式”: http://www.codeproject.com/KB/recipes/Missile_Guidance_System.aspx

(此外,隐藏在该文章底部的注释中的是对 Unreal wiki 中的一些完成相同任务的 C++ 代码的引用)


5
投票

看看OpenSteer。它有解决此类问题的代码。查看“steerForSeek”或“steerForPursuit”。


1
投票

您是否考虑过最近方位随时间变化而发生的负面反馈?

细节留作练习。

这些建议是完全严肃的:如果目标不机动,这应该获得接近最佳的拦截。即使目标主动躲避,它也应该会收敛。

需要更多细节吗?

在二维空间中求解以便于表示。取

\vec{m}
为导弹位置,矢量
\vec{t}
为目标位置。 上一个时间单位内运动方向的当前航向:
\vec{h} = \bar{\vec{m}_i - \vec{m}_i-1}}
。令 r 为导弹和目标之间的归一化向量:
\vec{r} = \bar{\vec{t} - \vec{m}}
。方位角是
b = \vec{r} \dot \vec{h}
计算每个时间刻度的方位角及其变化,并更改航向以最小化该数量。

3D 中的数学更为复杂,因为每一步都需要找到作用平面,但过程是相同的。


0
投票

您需要将目标和导弹的轨迹作为时间的函数进行插值。然后寻找对象坐标在可接受误差范围内的时间。

© www.soinside.com 2019 - 2024. All rights reserved.