Как создать & # 8220; ракету-перехватчик & # 8221; для игры?

StackOverflow https://stackoverflow.com/questions/1202391

  •  05-07-2019
  •  | 
  •  

Вопрос

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

Я хочу создать более смертоносную разновидность ракеты, которая будет нацелена на то место, где будет находиться цель ». к тому времени, когда он туда добирается, я немного застрял и запутался в том, как это сделать.

Я предполагаю, что мне нужно будет решить, где моя цель будет в какой-то момент в будущем (во всяком случае, предположение), но я не могу понять, как далеко вперед смотреть. Он должен быть основан на том, как далеко ракета находится от цели, но цель тоже движется.

Мои ракеты имеют постоянную тягу в сочетании со слабой способностью поворачиваться. Надеюсь, что они будут быстрыми и захватывающими, но держатся как корова (то есть, плохо, для не фанатов HitchHiker).

В любом случае, Stack Overflow показалось мне забавной проблемой, которая помогла мне решить, поэтому любые идеи или предложения о том, как лучше или "веселее" все ракеты будут приняты с благодарностью.

Далее будет ИИ для уклонения от них ...

Это было полезно?

Решение

То, что вы предлагаете, называется " Command Guidance " но есть более простой и лучший способ.

Способ, которым настоящие ракеты обычно делают это (не все похожи), использует систему, называемую пропорциональной навигацией. Это означает, что ракета "поворачивает" в том же направлении, что и линия визирования (LOS) между ракетой и целью, которая вращается со скоростью поворота, «пропорциональной»; до скорости LOS ... Это будет делать то, о чем вы просите, так как когда скорость LOS равна нулю, вы находитесь на курсе столкновения.

Вы можете рассчитать скорость LOS, просто сравнив наклоны линии между misile и целью от одной секунды до следующей. Если этот наклон не меняется, вы находитесь на курсе столкновения. если оно меняется, рассчитайте изменение и поверните ракету на пропорциональную угловую скорость ... вы можете использовать любые метрики, которые представляют ракету и положение цели.

Например, если вы используете константу пропорциональности 2 и LOS перемещается вправо со скоростью 2 град / сек, поверните ракету вправо со скоростью 4 град / сек. ЛОС влево на 6 град / сек, ракета влево на 12 град / сек ...

В 3-й задаче проблема идентична, за исключением того, что «Изменение скорости LOS» (и результирующая скорость разворота ракеты) само по себе является вектором, т. е. имеет не только величину, но и направление (поворачиваю ли я ракету влево, вправо или вверх или вниз или на 30 градусов выше горизонтали вправо и т. д. ... Представьте себе в качестве пилота ракеты, где вы бы "установили крылья", чтобы применить подъемную силу ...

Ракеты с радиолокационным управлением, которые "знают" скорость закрытия. отрегулируйте константу пропорциональности на основе закрытия (чем выше закрытие, тем быстрее попытается развернуть ракета), чтобы ракета вращалась более агрессивно в сценариях с высоким закрытием (когда время полета меньше) и менее агрессивно при низком закрытии (погоня за хвостом), когда это необходимо для сохранения энергии. Другие ракеты (например, Sidewinders), которые не знают замыкания, используют постоянную заранее определенную величину пропорциональности). FWIW, во Вьетнамской эры AIM-9 использовали константу пропорциональности 4.

Другие советы

Я уже использовал эту статью CodeProject раньше - в ней есть несколько действительно хороших анимаций для объяснения математики.

" Математика нацеливания и моделирования ракеты: от исчисления до формулы четвертого типа " http://www.codeproject.com/KB/recipes/Missile_Guidance_System.aspx

(также в комментариях внизу этой статьи скрыта ссылка на некоторый код C ++, который выполняет та же задача из вики Unreal)

Взгляните на OpenSteer . У него есть код для решения подобных проблем. Посмотрите на 'steerForSeek' или 'steerForPursuit'.

Рассматривали ли вы отрицательные отзывы о недавнем изменении отношения с течением времени?

Детали оставлены в качестве упражнения.

Предложения совершенно серьезные: если цель не маневрирует, это должно привести к почти оптимальному перехвату. И оно должно сходиться, даже если цель активно уклоняется.

Нужно больше подробностей?

Решение в двумерном пространстве для удобства обозначений. Возьмем \ vec {m} как местоположение ракеты и вектор \ vec {t} как местоположение цели. Текущий курс в направлении движения за последнюю единицу времени: \ vec {h} = \ bar {\ vec {m} _i - \ vec {m} _i-1}} . Пусть r будет нормализованным вектором между ракетой и целью: \ vec {r} = \ bar {\ vec {t} - \ vec {m}} . Подшипник имеет вид b = \ vec {r} \ dot \ vec {h} . Вычислять подшипник при каждом такте и его изменении, а также менять курс для минимизации этого количества.

Математика сложнее в 3d из-за необходимости находить плоскость действия на каждом шаге, но процесс тот же.

Вы захотите интерполировать траекторию как цели, так и ракеты как функцию времени. Затем найдите время, в которое координаты объектов находятся в пределах допустимой ошибки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top