Как рассчитать поворот курсора к ракете?

14

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

РЕДАКТИРОВАТЬ

Прежде чем запускать ракеты, мне нужно рассчитать и нарисовать траектории полета. Таким образом, в прилагаемом примере ракета-носитель имеет курс 90 градусов, а цели находятся за ней. Обе ракеты запускаются с относительным курсом -45 градусов или + 45 градусов к курсу ракеты-носителя. Ракеты первоначально поворачиваются к цели с известным радиусом поворота. Я должен вычислить точку, в которой поворот переводит ракету в курс, в котором она поворачивает, чтобы непосредственно атаковать цель. Очевидно, что если цель находится под углом 45 градусов или близко к нему, то первоначального поворота ракеты не будет, и она направится прямо к цели.

После запуска ракеты на карте также будет отображаться отслеживание ракеты на этой линии в качестве указания ее траектории полета.

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

Две ракеты нацелены на две цели

В этом примере цели находятся позади ракеты-носителя, но предварительно рассчитаны пути.

Тони
источник
1
Предварительно рассчитан ли курс или он изменяется во время траектории? (как самонаводящаяся ракета?)
Джонатан Коннелл
1
Разве это не было бы, когда (x2-x1) ^ 2 + (y2-y1) ^ 2 = r ^ 2, где (x1, y1) - текущая позиция ракеты, а (x2, y2) - цель?
Коммунистическая утка
Может быть, вы должны сделать рисунок того, что вы хотите.
аааааааааааа
3
Это проблема 2D или 3D?
Стив Х
Если вы ищете что-то похожее на самонаводящуюся ракету, вы можете сделать это без использования тригонометрии. Посмотрите этот вопрос
BlueRaja - Дэнни Пфлугхофт

Ответы:

9

Моя математика может быть немного неправильной, поэтому я викинул ответ.

Я предполагаю, что вы хотите выполнить сценарий непрерывного наведения - когда ракета P1, движущаяся со скоростью V1, постоянно пытается повернуться к игроку P2; но с ограниченной скоростью поворота.

  1. Определите вектор между игроком и ракетой.

    V2 = P2 - P1
  2. Преврати их в единичные векторы.

    V3 = UNIT(V1)
    V4 = UNIT(V2)
  3. Определить угол между векторами.

    a = ARCCOS(V3 * V4) (* indicating dot product)
  4. Ограничьте значение угла между ними (помните, что ваши функции триггера, вероятно, работают с радианами, поэтому попробуйте 0,1 в качестве скорости поворота).

    a = SIGN(a) * MINIMUM(ABS(a), MaximumTurningRate)
  5. Создайте новый вектор движения.

    V1 = UNIT(V3.x + SIN(a), V4.y + COS(a)) * MissileSpeed

РЕДАКТИРОВАТЬ: Это не имеет «отправной точки», так как это более надежная (и более легкая реализация) для сценария постоянного возвращения. Вам не нужно искать отправную точку для круга - просто ограничьте скорость, с которой ракета может менять направление, а остальное происходит из-за призрака в машине.

Джонатан Дикинсон
источник
1
Ммм ... если память не изменяет, я думаю, что вам нужно сделать перекрестное произведение, чтобы получить направление угла. Если вы просто делаете точечное произведение, вы будете знать величину угла, но не направление (поскольку точечные произведения могут иметь V3 * V4 = V4 * V3, кажется, нет никакого способа заметить разницу в ориентации). Итак, сделайте скалярное произведение, а затем сделайте перекрестное произведение - проверяя знак координаты Z - чтобы найти ориентацию.
ChrisE
@ChrisE Пример представлен в 2D (см. 5.), поэтому исходной ориентации и величины угла должно быть достаточно.
Keeblebrox
Правильный расчет угла между точками, но я не уверен, что ваше заявленное намерение на шаге 5 ИЛИ что он производит. Предполагается, что шаг 5 добавит угол a к v3, потому что я не понимаю математику.
Дает
Шаг 5 @dlots должен добавить новый «ограниченный угол поворота» к текущему вектору движения - в основном он меняет направление ракеты.
Джонатан Дикинсон
Что находится SIGNв шаге 4?
Даниэль Каплан
2

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

Я должен предположить, что вы можете поворачивать с одинаковым радиусом поворота во всех направлениях (это упрощение, которое трудно увидеть в реальных ракетах).

Самое простое решение состоит в том, чтобы использовать изгиб на 90 ° : ракета перемещается, пока ее траектория не образует прямой угол с целью. если вы повернете точно в точку 90 °, вы пропустите цель точно по радиусу поворота, потому что вы должны принять во внимание сам поворот. Решение состоит в том, чтобы начать точно поворачивать метры «радиуса поворота» (?) До достижения точки 90 °, а затем повернуть, образуя (попытаться угадать) дугу 90 °, чтобы перейти прямо к цели.

Это решение не всегда выполнимо, например, когда у вас нет видимости на трассе 90 ° (здания или другие препятствия).

Хорошая новость заключается в том, что решение работает для всех углов (не только для мифических 90 °), а хитрость заключается в том, чтобы учесть пространство, необходимое для поворота, прежде чем начать разворот.

Сколько раньше? Вот почему 90 ° материал является самым простым решением ...

Допустим, вы достигли видимости или наилучшего целевого направления, когда траектория стрельбы образует угол θ °, тогда вам следует ожидать поворота на:

(sec(90° - θ°) + tan(90° - θ°)) * turning_radius

... где секущий является обратной косинусом. Доказательство тривиально и оставлено читателю.

Серьезно, формула исходит из простой геометрической конструкции.

График поворота

Черная линия - это путь стрельбы, в то время как тонкая черная линия - это тот же путь, который двигался к цели единицами turn_radius; то же самое для красных, которые являются целевым путем.

Зеленые сегменты имеют длину turn_radius, поэтому вы должны увидеть, что:

AB - тангенс угла 90 ° - θ °

До н.э.

Обе зеленые линии, которые идут от точки поворота, имеют длину turn_radius и перпендикулярны двум путям; Это означает, что радиус поворота является правильным, а дуга касается обеих траекторий (как и должно быть, если вы совершаете поворот при физических ограничениях).

Дайте мне знать, если увидите ошибку.

РЕДАКТИРОВАТЬ:

На опубликованном вами рисунке показано, что есть несколько вариантов пути даже с фиксированным стрелком и целью, как вы можете видеть здесь:

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

Как только цель выбрана, вы можете применить то, что я сказал выше, с правильными углами.

FXIII
источник
Обратите внимание, что это не система постоянного обновления. Так как самонаведение требует большего количества процессоров (много), это должно быть правильным подходом для фиксированных целей или, если нужно, конечно, реализовать «полутонкую» ракету. Траектория может быть просто параметризована по t, разделяющему траекторию на 3 подпути, и дуга может быть аппроксимирована кривой Безье.
FxIII
1

Я бы реализовал «поведение руля» для ракеты. Ракета имеет: скорость (число), положение (вектор) и (текущее) вращение. При каждом обновлении в вашей игре / в каждом кадре вращение ракеты изменяется немного (по направлению к цели). Затем ракета движется вперед в соответствии с ее текущим вращением и текущей скоростью.

Работает для 2D и 3D, очевидно, поскольку единственное отличие заключается в дополнительном измерении.

Другой возможностью было бы рассчитать траекторию полета ракеты до ее запуска. Посмотрите кривые Безье или сплайн .

Riki
источник
Проблема с использованием сплайна заключается в том, что вам необходимо постоянно обновлять контрольные точки, если цель перемещается. Простой алгоритм управления здесь может быть вычислительно дешевле.
ChrisE
На самом деле я пытаюсь пересчитать путь к цели. Я работаю на симуляторе для реального оборудования и пытаюсь имитировать поведение реального оборудования.
Тони
0

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

Лорен Печтель
источник
2
Ракета реального мира, особенно более поздние виды оружия, имеют инерциальные системы наведения или GPS или обе, так что они запрограммированы на то, чтобы отправиться в зону поиска и начать поиск цели. Горе, если рядом находится дружественный. Предполагается, что программирование позволит вам отправить ракету по пути, избегающему дружественных и других препятствий, таких как наземные массивы и невинные свидетели.
Тони
0

Я думаю, что самый простой алгоритм будет следовать двум правилам:

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

  2. В противном случае поверните к цели, пока вы не указываете на нее.

Чтобы вычислить точку, где поворот заканчивается в 2D:

  1. В точке, где вы хотите начать поворот, центр круга поворота расположен в направлении, перпендикулярном текущему курсу на расстоянии вашего радиуса поворота. Обратите внимание, что есть две из этих точек - вы, вероятно, хотите ту, которая ближе всего к вашей цели. Рассчитайте эту позицию и назовите ее P.

  2. Теперь вы можете построить прямоугольный треугольник с прямым углом к ​​касательной и двумя известными точками - P и пункт назначения. Это позволяет вам вычислить расстояние от касательной к вашей целевой точке с помощью Пифагора. Назовите это D.

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

Адам
источник