如果我理解您的问题,则您不希望船舶转向目标,而希望以直线飞行以碰巧拦截目标。我正在制作一款基本上与塔的子弹需求相同的塔防游戏,塔想要发射枪支,只要子弹不改变速度/方向,子弹就能拦截移动的目标。我解决问题的方法是使用二次方程式。这是一些伪代码:
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
我发现这种方法效果很好,我不需要对镜头进行碰撞检测……只要这些因素保持稳定,无论目标的距离/方向/速度如何,我都可以依靠靶心的每一击。