Как создать «ракету-перехват» для игры? - PullRequest
13 голосов
/ 29 июля 2009

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

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

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

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

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

Следующим будет ИИ для уклонения от них ...

Ответы [ 5 ]

21 голосов
/ 29 июля 2009

То, что вы предлагаете, называется «Командное руководство», но есть более простой и лучший способ.

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

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

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

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

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

16 голосов
/ 29 июля 2009

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

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

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

5 голосов
/ 29 июля 2009

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

1 голос
/ 29 июля 2009

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

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

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

Нужно больше деталей?

Решение в двумерном пространстве для удобства обозначений. Возьмите \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 из-за необходимости находить план действий на каждом этапе, но процесс тот же.

0 голосов
/ 29 июля 2009

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

...