如何计算击中移动目标的射击角度和速度?


11

我正在开发一款2D Android游戏,并且正在为AI弹丸制定一种瞄准算法,以沿着路径或自由移动击中敌人。目前,它只是计算目标在一定距离后的位置,并发射弹丸以达到该距离。当然,这意味着要改变弹丸速度以达到目标。

有没有人有简单的算法(最优的算法)的技巧来计算弹丸何时需要发射以及如果它只能以恒定的速度行进时需要瞄准什么地方?是说射弹的速度是目标的两倍?

我能想到的唯一方法就是搜索,而且看起来很大。



@JohnMcDonald:考虑到抛物线抛物线不是线性的,所以关系不大。这更接近:gamedev.stackexchange.com/questions/4995/…–
e100

Answers:


13

在我制作的塔防游戏中,我使用二次方程式预测了相交点,从而预测了目标点。以下瞄准代码段假定敌人以恒定的速度和方向行进。它还假定弹丸将以已知的恒定速度行进(可以是任何速度,但算法必须知道)。

Vector totarget =  target.position - tower.position;

float a = Vector.Dot(target.velocity, target.velocity) - (bullet.velocity * bullet.velocity);
float b = 2 * Vector.Dot(target.velocity, totarget);
float c = Vector.Dot(totarget, totarget);

float p = -b / (2 * a);
float q = (float)Math.Sqrt((b * b) - 4 * a * c) / (2 * a);

float t1 = p - q;
float t2 = p + q;
float t;

if (t1 > t2 && t2 > 0)
{
    t = t2;
}
else
{
    t = t1;
}

Vector aimSpot = target.position + target.velocity * t;
Vector bulletPath = aimSpot - tower.position;
float timeToImpact = bulletPath.Length() / bullet.speed;//speed must be in units per second

由于它还决定了撞击时间,因此我只等到粘贴时间就将撞击图形调用到目标位置即可……无需任何碰撞检测即可确定撞击。


“无需任何碰撞检测即可确定命中。” -如果目标被限制维持其速度和方向。---但是,如果他们有活跃的AI,或更糟糕的是,他们是玩家,并且能够在射击者开火后移动,那么按时击打而不是根据碰撞检测来判断玩家的基础会被视为一些令人讨厌的错误/故障。
XenoRo

@TheLima是的,就像答案第二句中所说的那样。;-)
史蒂夫·H

对于我的情况而言,这几乎是完美的选择,但是您如何考虑这两个附加变量:弹丸的加速度,塔架本身的运动?
2015年

什么a是0?这将产生除以零的异常,但这对于变量t意味着什么?应该将其视为“很大数目”还是最好的情况是什么?
firelynx16年

有没有一本很好的书可以理解这背后的直觉?我很好奇你怎么知道要看这个数学……
davidkomer

4

在此处输入图片说明

AI,目标物在发射子弹时的位置以及目标在死亡点的最终位置形成一个三角形,这是您应该已经知道的:

  1. 边长a,即弹丸速度
  2. 边长b,即目标速度
  3. 靶标的运动角度。

您有三角形的三个部分,一个SSA案例,所以像这样解决它

  1. 根据运动角度和AI的位置找到角度B
  2. 用正弦定律求角A

角度A应该允许您确定弹丸的发射角度。

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.