Как создать "перехватную ракету" для игры?
У меня есть игра, в которой я работаю, и в ней есть самонаводящиеся ракеты. В настоящий момент они просто поворачиваются к своей цели, что дает довольно неистовый результат, со всеми ракетами, следующих за мишенью.
Я хочу создать более смертоносный вкус ракеты, который будет нацелен на то, где цель "будет" к тому времени, когда она туда попадет, и я немного застрял и смутился о том, как это сделать.
Я предполагаю, что мне нужно будет решить, где моя цель будет в какой-то момент в будущем (так или иначе), но я не могу понять, как далеко вперед смотреть. Он должен основываться на том, как далеко ракета находится вдали от цели, но цель тоже движется.
Мои ракеты имеют постоянную тягу в сочетании со слабой способностью поворачиваться. Надеюсь, они будут быстрыми и захватывающими, но управляйте как корова (то есть, плохо, для фанатов не HitchHiker).
Во всяком случае, для Stack Overflow, похоже, была какая-то забавная проблема, которая помогла мне решить, поэтому любые идеи или предложения о лучших или "веселых" ракетах будут с благодарностью восприняты.
Далее будет AI для уклонения от них...
Ответы
Ответ 1
То, что вы предлагаете, называется "Command Guidance", но есть более простой и лучший способ.
Как обычно это делают обычные ракеты (не все одинаковы), используется система под названием Пропорциональная навигация. Это означает, что ракета "поворачивается" в том же направлении, что и линия прямой видимости (ЛОС) между ракетой и мишенью поворачивается со скоростью, пропорциональной скорости ЛОС... Это будет делать то, что вы спрашивая, как когда ставка ЛОС равна нулю, вы находитесь на курсе столкновения.
Вы можете рассчитать ставку LOS, просто сравнив наклоны линии между мишенью и мишенью с одной секунды до следующей. Если этот наклон не меняется, вы находитесь на курсе столкновения. если он меняется, вычислите изменение и поверните ракету пропорциональной скоростью angular... вы можете использовать любые показатели, представляющие ракеты и целевую позицию.
Например, если вы используете константу пропорциональности 2, а LOS движется вправо со скоростью 2 град/сек, поверните рацию вправо со скоростью 4 град/сек. LOS слева на 6 град/сек, ракета влево на скорости 12 град/с...
В 3-й проблема идентична, за исключением "Изменение скорости LOS" (и, соответственно, скорость разворота ракет) сама по себе является вектором, т.е. имеет не только величину, но и направление (поверните рацию влево, справа или вверх или вниз или на 30 градусов выше горизонтали вправо и т.д. Представьте себе, как пилот-ракетчик, где вы "установите крылья", чтобы применить лифт...
Радарные управляемые ракеты, которые "знают" скорость закрытия. отрегулируйте постоянную пропорциональности, основанную на закрытии (чем выше закрытие, тем быстрее будет запускаться ракета), так что ракета будет более агрессивно работать в сценариях с высоким закрытием (когда время полета ниже) и менее агрессивно при низком замыкании (хвостовые погони), когда это необходимо для экономии энергии.
Другие ракеты (например, Sidewinders), которые не знают замыкания, используют постоянное предопределенное значение пропорциональности). FWIW, в эпоху Вьетнама AIM-9 боковины использовали константу пропорциональности 4.
Ответ 2
Я использовал эту статью CodeProject раньше - у нее есть некоторые действительно приятные анимации, чтобы объяснить математику.
"Математика таргетинга и моделирования ракеты: от исчисления до квадратной формулы":
http://www.codeproject.com/KB/recipes/Missile_Guidance_System.aspx
(также, скрытый в комментариях в нижней части этой статьи, является ссылкой на некоторый код С++, который выполняет ту же задачу из Unreal вики)
Ответ 3
Посмотрите OpenSteer. У него есть код для решения таких проблем. Посмотрите на "steerForSeek" или "steerForPursuit".
Ответ 4
Вы считали отрицательную обратную связь относительно недавней смены подшипника на изменение времени?
Детали, оставленные как упражнение.
Предложения абсолютно серьезны: если цель не маневрирует, это должно получить почти оптимальный перехват. И он должен сходиться, даже если цель активно уклоняется.
Вам нужно больше деталей?
Решение в двумерном пространстве для удобства обозначений. Возьмите \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 из-за необходимости находить плоскость действия на каждом шаге, но процесс тот же.
Ответ 5
Вы хотите интерполировать траекторию как цели, так и ракеты как функцию времени. Затем найдите моменты, в которых координаты объектов находятся в пределах допустимой ошибки.