У меня есть ракета, выпущенная с корабля под углом, затем ракета поворачивается к цели по дуге с заданным радиусом поворота. Как определить точку на дуге, когда мне нужно начать разворачиваться, чтобы ракета направлялась прямо к цели?
РЕДАКТИРОВАТЬ
Прежде чем запускать ракеты, мне нужно рассчитать и нарисовать траектории полета. Таким образом, в прилагаемом примере ракета-носитель имеет курс 90 градусов, а цели находятся за ней. Обе ракеты запускаются с относительным курсом -45 градусов или + 45 градусов к курсу ракеты-носителя. Ракеты первоначально поворачиваются к цели с известным радиусом поворота. Я должен вычислить точку, в которой поворот переводит ракету в курс, в котором она поворачивает, чтобы непосредственно атаковать цель. Очевидно, что если цель находится под углом 45 градусов или близко к нему, то первоначального поворота ракеты не будет, и она направится прямо к цели.
После запуска ракеты на карте также будет отображаться отслеживание ракеты на этой линии в качестве указания ее траектории полета.
Я работаю над симулятором, который имитирует операционное программное обеспечение. Поэтому мне нужно нарисовать рассчитанную траекторию полета, прежде чем я позволю запустить ракету.
В этом примере цели находятся позади ракеты-носителя, но предварительно рассчитаны пути.
Ответы:
Моя математика может быть немного неправильной, поэтому я викинул ответ.
Я предполагаю, что вы хотите выполнить сценарий непрерывного наведения - когда ракета P1, движущаяся со скоростью V1, постоянно пытается повернуться к игроку P2; но с ограниченной скоростью поворота.
Определите вектор между игроком и ракетой.
Преврати их в единичные векторы.
Определить угол между векторами.
Ограничьте значение угла между ними (помните, что ваши функции триггера, вероятно, работают с радианами, поэтому попробуйте 0,1 в качестве скорости поворота).
Создайте новый вектор движения.
РЕДАКТИРОВАТЬ: Это не имеет «отправной точки», так как это более надежная (и более легкая реализация) для сценария постоянного возвращения. Вам не нужно искать отправную точку для круга - просто ограничьте скорость, с которой ракета может менять направление, а остальное происходит из-за призрака в машине.
источник
SIGN
в шаге 4?Я предполагаю, что вы хотите изменить направление, изменив начальный курс на целевой, а затем продолжить движение прямо к цели (более забавной проблемой должно быть попадание в цель при повороте!).
Я должен предположить, что вы можете поворачивать с одинаковым радиусом поворота во всех направлениях (это упрощение, которое трудно увидеть в реальных ракетах).
Самое простое решение состоит в том, чтобы использовать изгиб на 90 ° : ракета перемещается, пока ее траектория не образует прямой угол с целью. если вы повернете точно в точку 90 °, вы пропустите цель точно по радиусу поворота, потому что вы должны принять во внимание сам поворот. Решение состоит в том, чтобы начать точно поворачивать метры «радиуса поворота» (?) До достижения точки 90 °, а затем повернуть, образуя (попытаться угадать) дугу 90 °, чтобы перейти прямо к цели.
Это решение не всегда выполнимо, например, когда у вас нет видимости на трассе 90 ° (здания или другие препятствия).
Хорошая новость заключается в том, что решение работает для всех углов (не только для мифических 90 °), а хитрость заключается в том, чтобы учесть пространство, необходимое для поворота, прежде чем начать разворот.
Сколько раньше? Вот почему 90 ° материал является самым простым решением ...
Допустим, вы достигли видимости или наилучшего целевого направления, когда траектория стрельбы образует угол θ °, тогда вам следует ожидать поворота на:
... где секущий является обратной косинусом. Доказательство тривиально и оставлено читателю.
Серьезно, формула исходит из простой геометрической конструкции.
Черная линия - это путь стрельбы, в то время как тонкая черная линия - это тот же путь, который двигался к цели единицами turn_radius; то же самое для красных, которые являются целевым путем.
Зеленые сегменты имеют длину turn_radius, поэтому вы должны увидеть, что:
AB - тангенс угла 90 ° - θ °
До н.э.
Обе зеленые линии, которые идут от точки поворота, имеют длину turn_radius и перпендикулярны двум путям; Это означает, что радиус поворота является правильным, а дуга касается обеих траекторий (как и должно быть, если вы совершаете поворот при физических ограничениях).
Дайте мне знать, если увидите ошибку.
РЕДАКТИРОВАТЬ:
На опубликованном вами рисунке показано, что есть несколько вариантов пути даже с фиксированным стрелком и целью, как вы можете видеть здесь:
Как только цель выбрана, вы можете применить то, что я сказал выше, с правильными углами.
источник
Я бы реализовал «поведение руля» для ракеты. Ракета имеет: скорость (число), положение (вектор) и (текущее) вращение. При каждом обновлении в вашей игре / в каждом кадре вращение ракеты изменяется немного (по направлению к цели). Затем ракета движется вперед в соответствии с ее текущим вращением и текущей скоростью.
Работает для 2D и 3D, очевидно, поскольку единственное отличие заключается в дополнительном измерении.
Другой возможностью было бы рассчитать траекторию полета ракеты до ее запуска. Посмотрите кривые Безье или сплайн .
источник
Я чувствую, что вы решаете не ту проблему здесь. Ракета реального мира не будет беспокоиться о том, куда повернуть, она просто будет поворачиваться, пока не будет направлена на свою цель. Единственный способ расчета - когда начинать возвращать управление в нейтральное положение, поскольку реальная ракета не может мгновенно изменить скорость своего хода. Этот расчет будет принимать только указанную воздушную скорость ракеты в качестве входного значения, и я думаю, что будет рассчитан заранее.
источник
Я думаю, что самый простой алгоритм будет следовать двум правилам:
Если текущая цель ближе к ракете, чем диаметр поворота, продолжайте идти прямо. Это позволяет избежать попадания ракеты по близким целям вместо того, чтобы фактически добраться до них.
В противном случае поверните к цели, пока вы не указываете на нее.
Чтобы вычислить точку, где поворот заканчивается в 2D:
В точке, где вы хотите начать поворот, центр круга поворота расположен в направлении, перпендикулярном текущему курсу на расстоянии вашего радиуса поворота. Обратите внимание, что есть две из этих точек - вы, вероятно, хотите ту, которая ближе всего к вашей цели. Рассчитайте эту позицию и назовите ее P.
Теперь вы можете построить прямоугольный треугольник с прямым углом к касательной и двумя известными точками - P и пункт назначения. Это позволяет вам вычислить расстояние от касательной к вашей целевой точке с помощью Пифагора. Назовите это D.
Теперь вам нужно рассчитать пересечение круга радиуса D в пункте назначения с вашим кругом поворота. Вы получите два решения, которые являются двумя касательными точками на этом круге, где ракета перестанет вращаться (по одному на каждое направление движения по кругу). Выберите точку, которая находится перед ракетой - это ваш ответ.
источник