预测敌人的位置,以使物体领先于目标


13

在我的2D游戏中,我有AI炮塔,应该通过自动向敌人射击来辅助玩家。我想让他们明智地开火并领导目标,而不仅仅是瞄准敌人的当前位置。因此,给定敌人和炮塔的弹丸的(始终是恒定的)速度和位置矢量,我如何找到一个代表炮塔必须相交的实际位置的矢量,以使弹丸与敌人相交(并命中)?

任何描述数学,算法等文章的链接将不胜感激!



感谢您的链接!但是,我觉得解决方案有点难以阅读,也许我可以使用您提供的链接来为该问题提供一个清晰的视觉答案,以帮助遇到其他问题的其他人。
拉罗拉罗2012年

@Larolaro我在回答中添加了图形演示,因此您可以更好地理解它。
jmacedo 2012年

我描述了我在这个答案中采用
突然发生变化

Answers:



3

我不会给你一个答案,我相信它是有用的,甚至是正确的,但是在这里:
在使用mathematica多一点(检查笔记本/已发布笔记本的答案的结尾)文件后,此解决方案似乎是正确的,甚至认为它可能不是效率最高的解决方案。

我用mathematica编写了这与您的问题相对应的内容。基本上,它求解方程式/不等式以求出OA变量,这是我们需要找出的。输出将为我们提供OA可能具有的解决方案,以及需要验证每种解决方案有效的条件:

Reduce[{BPx, BPy} + t*{BVx, BVy} == {OPx, OPy} + t*OV*{Cos[OA], Sin[OA]} && t != 0 && OV != 0, {OA}]
  • {BPx,BPy}是蓝色的当前位置

  • {BVx,BVy}是蓝色的速度向量

  • {OPx,OPy}是橙色的项目符号位置

  • OV是橙色子弹速度矢量(总速度)的范数

  • OA是橙色的子弹角(速度矢量的角度)

  • t是子弹射到蓝色所需的时间

我尝试将t> 0 && OV> 0设置为条件,但是mathematica会花很长时间,所以我只用了t!= 0 && OV!= 0。与橙色的位置相同,并且橙色的子弹真正移动时(而不是保持静止)

输出是巨大的:http : //freetexthost.com/xzhhpr5e2w

但是,如果我们提取OA == _部分,则会得到以下信息:

http://freetexthost.com/iyrhqoymfo

这些是OA可以具有的值(每个值都需要不同的条件才能有效)。

经过一些进一步的分析,得出了我们不希望OV为负的解决方案,我得到了:

http://freetexthost.com/iy4wxepeb6

因此,这些是解决问题的可能方案,每个方案都需要不同的条件才能有效。为了使某个角度OA有效,必须满足以下条件:

Reduce[{BPx, BPy} + t*{BVx, BVy} == {OPx, OPy} + t*OV*{Cos[OA], Sin[OA]} && t != 0 && OV != 0, {t}]

输出:

(BVy - OV Sin[OA] != 0 && BPx == (BPy BVx + BVy OPx - BVx OPy - BPy OV Cos[OA] + OPy OV Cos[OA] - OPx OV Sin[OA])/(BVy - OV Sin[OA]) && t == (-BPy + OPy)/(BVy - OV Sin[OA]) &&  BPy OV - OPy OV != 0) || 
(BVy == OV Sin[OA] && BPy == OPy && BVx - OV Cos[OA] != 0 && t == (-BPx + OPx)/(BVx - OV Cos[OA]) && BPx OV - OPx OV != 0) || 
(BVy == OV Sin[OA] && BVx == OV Cos[OA] && BPy == OPy && BPx == OPx && OV t != 0)

因此,仅考虑可验证的解决方案(您无需验证t == _部件。如果其他条件有效,它们将为您提供子弹击中车辆所需的时间。请注意,如果t的结果为负,即使验证了其他条件,您也不能将给定的OA视为有效的解决方案(这是因为我们使用t!= 0而不是reduce中的t> 0)。

/math//中询问有关此问题也是一个好主意。

编辑

我对这个问题越来越感兴趣,因此我创建了一个带有注释的笔记本,其中以图形方式展示了我所解释的所有内容。在这里下载:

http://www.2shared.com/file/pXhYyhN1/towerBullets.html
或此处:http : //www.2shared.com/file/W01g4sST/towerBullets.html

(这是已发布的版本,您只需要mathematica播放器(可以免费观看)即可。如果您没有mathematica,则可以这样做)

屏幕截图:


我可以为条件和解决方案提供乘号(*),以便您更轻松地将它们移植到您的编程语言中(然后,您只需替换ArcTan [...],Sin [...], Cos [...],Sqrt [...],最后是电源符号(^)
jmacedo 2012年

嗯,算了吧。现在,这个问题已经合并,第一个答案的链接将包含更好的答案。
jmacedo 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.