如何计算拦截向量?


11

给定一个二维空间,一艘友好的太空飞船停滞不前,一个敌人没有以已知的实际位置,速度和方向直接移动到友好的飞船上。

友好的战舰想进入射击场与敌人作战。

实际上,我只是将矢量设置为实际位置的移动船舶,并在每一帧进行重新计算,从而产生某种“圆形”飞行路径。

我想要的是设定一条直直的路径,以达到到达发射距离时敌人(大概)将要到达的位置(假设直到那时敌人不会改变方向)。

作为第一个“简单”的实现,如果我们假设朋友可以立即从0加速到max,就足够了。

首选实现方式将考虑朋友的加速能力,并知道何时由于速度而无法进行拦截。它应该以各种启动速度工作,而不仅是静止不动。如果它甚至考虑制动,则将是一个加分(在给定的宇宙中,以光速进行战斗对能量效率极低)

Answers:


5

如果我理解您的问题,则您不希望船舶转向目标,而希望以直线飞行以碰巧拦截目标。我正在制作一款基本上与塔的子弹需求相同的塔防游戏,塔想要发射枪支,只要子弹不改变速度/方向,子弹就能拦截移动的目标。我解决问题的方法是使用二次方程式。这是一些伪代码:

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

我发现这种方法效果很好,我不需要对镜头进行碰撞检测……只要这些因素保持稳定,无论目标的距离/方向/速度如何,我都可以依靠靶心的每一击。


从您的描述来看,这似乎是我要寻找的东西,至少是假设即时加速到最大速度的简单方法。晚上我会仔细看看。我是否正确假设Vector.Dot将the的点积返回给vector?
NobbZ 2011年

嗯...我现在是用红宝石做的,但是似乎出了点问题。每次尝试时,都会引发异常,因为sqrt中的表达式评估为负值,因此超出范围。我该如何处理。很抱歉这个问题,但是我只能用这个,但是在有人给我建议之前,我不理解这里的概念。
NobbZ 2011年

这个例子是从本书:amazon.com/...
史蒂夫^ h

1
不知道这是否有帮助,但是这里有一些python代码可以完成相同的操作。moddb.com/mods/wicmw/tutorials/...
史蒂夫^ h

好的,我仍然不了解后面的漏洞数学,但是文档告诉我,python代码的错误之处在于,如果sqrt内存在负值,那么我的朋友就要慢慢追上。调整测试值后,我得到了一些结果。谢谢您的帮助。
NobbZ 2011年

6

我建议您研究转向行为。尤其是追求。可以在OpenSteer实现中找到源代码,也可以查阅“ 通过示例编程AI ”一书(ISBN 13:978-1556220784)


追求似乎需要有关目标的知识并朝着目标前进,但我真的不知道目标。我知道敌人现在在哪里,我知道它的速度和方向。现在,我想知道它要尽快尽快拦截到目标的敌人的方向。如前所述,起初可以忽略加速,与实际版本相比,这甚至可以节省很多处理时间...对于新模型,我仅在敌人触发“ coursechange”事件时才需要重新计算,而不必为每个“已移动”事件,因为我现在正在这样做。
NobbZ 2011年

是的,您描述的追求。它不知道目标。.它根据“敌人”当前的位置,速度和方向做出预测
bummzack 2011年

然后我就误解了描述,明天我将仔细研究它。
NobbZ 2011年

几分钟前我刚读完文档,追求的不是我想要的。就像我的实际实现一样,除了它以下一帧的位置为目标之外,我仍然必须每帧重新计算新路线,并且该路线会产生一些曲线。但是我要的是假设敌人没有改变速度或路线的直线,直到两者相遇。如果仍然不清楚,我尝试在下班后画些我想要的东西。但是仍然感谢您的链接。我想我可以在项目的其他地方使用它。
NobbZ 2011年

@NobbZ对不起,我的回答没有帮助。您可能应该相应地编辑您的问题,因为这样的陈述:“我知道,在速度或敌人的路线改变的情况下,必须重复进行每一次计算”,这可能会误导您。如果这样做,您最终将不得不“追求”转向行为。
bummzack 2011年
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.