在我的2D游戏中,我有AI炮塔,应该通过自动向敌人射击来辅助玩家。我想让他们明智地开火并领导目标,而不仅仅是瞄准敌人的当前位置。因此,给定敌人和炮塔的弹丸的(始终是恒定的)速度和位置矢量,我如何找到一个代表炮塔必须相交的实际位置的矢量,以使弹丸与敌人相交(并命中)?
任何描述数学,算法等文章的链接将不胜感激!
在我的2D游戏中,我有AI炮塔,应该通过自动向敌人射击来辅助玩家。我想让他们明智地开火并领导目标,而不仅仅是瞄准敌人的当前位置。因此,给定敌人和炮塔的弹丸的(始终是恒定的)速度和位置矢量,我如何找到一个代表炮塔必须相交的实际位置的矢量,以使弹丸与敌人相交(并命中)?
任何描述数学,算法等文章的链接将不胜感激!
Answers:
我不会给你一个答案,我相信它是有用的,甚至是正确的,但是在这里:
在使用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,则可以这样做)
屏幕截图: