Как рассчитать угол выстрела и скорость удара по движущейся цели?

11

Я занимаюсь разработкой 2D-игры для Android и делаю алгоритм прицеливания для ИИ-снарядов, чтобы поражать врагов либо по пути, либо по свободному движению. В данный момент он просто вычисляет, где будет цель после дистанции, и стреляет снарядом, чтобы встретить ее на этом расстоянии. Конечно, это означает изменение скорости снаряда для достижения цели.

Есть ли у кого-нибудь подсказки для простого алгоритма (оптимального), чтобы рассчитать, когда снаряду нужно стрелять и куда нужно стремиться, если он может двигаться только с постоянной скоростью? Скажите, что снаряд идет вдвое быстрее цели?

Единственный способ, которым я могу придумать, - это поиск, и он кажется довольно большим.

Guen
источник
Связанный: gamedev.stackexchange.com/questions/17467/…
Джон Макдональд
@JohnMcDonald: не очень связано, учитывая, что это параболические снаряды, а не линейные. Это намного ближе: gamedev.stackexchange.com/questions/4995/…
e100

Ответы:

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

Так как он также определяет время удара, я просто ждал, пока не истечет время, чтобы вызвать графику удара в положении цели в это время ... нет необходимости в обнаружении столкновений для определения попаданий.

Стив Н
источник
«Нет необходимости в обнаружении столкновений для определения попаданий». - Если цель (цели) ограничены в поддержании их скорости и направления. --- Если, однако, они имеют активный ИИ или, что еще хуже, являются игроком и могут двигаться после того, как стрелок выстрелил, то основание ваших попаданий на времени, а не на обнаружении столкновений, приведет к тому, что ваш игрок-база будет воспринимать как некоторые неприятные ошибки / глюки.
XenoRo
@TheLima Да, точно так же, как сказано во втором предложении ответа. ;-)
Стив Х
Это почти идеально подходит для моего сценария, но как бы вы учитывали эти 2 дополнительные переменные: ускорение для снаряда, движение самой башни?
Джек
Что aтакое 0? Это приведет к делению на нулевое исключение, но что это означает в терминах переменной t? следует ли считать это «очень большим числом» или каков будет лучший случай?
firelynx
Есть ли хорошая книга, которая входит в интуицию за этим? Мне любопытно, как вы узнали, чтобы искать эту математику ...
Давидкомер
4

введите описание изображения здесь

ИИ, местоположение цели во время выстрела и возможное местоположение цели в точке смерти образуют треугольник. Вот то, что вы уже должны знать:

  1. Длина стороны а, которая является скоростью снаряда
  2. Длина стороны b, которая является целевой скоростью
  3. Угол движения цели движения цели.

У вас есть три части треугольника, дело SSA, так что решите это так

  1. Найти угол B на основе угла движения и местоположения ИИ
  2. Используйте закон синусов, чтобы найти угол A

Угол А должен позволить вам определить угол, под которым должен быть запущен снаряд.

tyjkenn
источник