У меня есть ракета, которая преследует поведение, чтобы отследить (и попытаться ударить) ее (стационарную) цель.
Он отлично работает, если вы не стреляете, когда запускаете ракету. Если вы стреляете, ракета имеет тенденцию вращаться вокруг своей цели.
Я исправил это, сначала тангенциально ускорившись к цели , убив сначала тангенциальную составляющую скорости, а затем направившись к цели.
Поэтому я ускоряюсь в -vT до тех пор, пока vT не достигнет почти 0. Затем ускоряюсь в направлении vN.
Хотя это работает, я ищу более элегантное решение, где ракета способна поразить цель без явного уничтожения тангенциального компонента.
steering-behaviors
orbit
bobobobo
источник
источник
Ответы:
Похоже, проблема в том, что ракета просто указывает на цель, не обращая внимания на ее текущую скорость. Назначьте своей ракете максимальный угол, на который тяга может отклоняться от линии движения.
На каждой итерации навигации вы рассчитываете ее скорость, перпендикулярную цели. Выясните, сколько он должен опрокинуть двигатель, чтобы обнулить этот компонент его скорости, а затем обрезать его до максимума, чтобы он мог опрокинуть его двигатель.
Во время первой части полета он будет немного двигаться вправо от прямой линии на рисунке №2, но, пока он летит, двигатель обнулит этот компонент и в конечном итоге направится прямо к цели.
Обратите внимание, что в этом сценарии будет только один кадр, в котором двигатель отклоняется от нуля или максимума. Если бы вы отслеживали движущуюся цель, вы могли бы получать меньшие отклонения на каждом цикле при перемещении цели.
источник
Возможно, это не то элегантное решение, к которому вы стремитесь, но я обнаружил, что если я замедляю ракету, если она собирается промахнуться, когда она приближается к цели, она эффективно отслеживает и поворачивает быстрее и может поразить цель. Вы можете увеличить скорость поворота ракеты по мере приближения, а не уменьшать скорость, но это может дать игрокам «вау, я уверен, что пропустит» неприятный сюрприз.
Это может выглядеть не так здорово, но это, безусловно, мешает ракетам вращаться вокруг ракеты и обстреливать ее противником, пока не кончится топливо.
Вот демонстрация, которую я собрал в своей реализации (третья или четвертая ракета демонстрирует это, и снова в 1:05): http://www.youtube.com/watch?v=9uiGMC_nH2w
Вы также можете повысить точность ракеты по мере приближения к цели (поскольку она имеет более близкую сигнатуру для привязки). Это показано на видео тоже примерно через минуту. Красный кружок показывает фактическую цель ракеты. Это дает ему хаотическую траекторию полета, когда он находится на большом расстоянии, а затем выравнивается по мере приближения.
Как я уже сказал, это может быть не тот ответ, который вы ищете, но я надеюсь, что он поможет, хотя бы немного.
источник
Интуиция
Вот один из способов: давайте повернем вашу диаграмму.
Теперь ракета - это пушечное ядро !
физика
Он имеет фиксированное ускорение «вниз», то есть перпендикулярно вектору от места его стрельбы до цели. Я нарисовал его сверху пунктирной зеленой линией. Давайте назовем это опорным горизонтом . (Обратите внимание, что этот контрольный горизонт является постоянным! Ракета была запущена из фиксированного положения с фиксированным положением в качестве цели.)
Мы знаем (из Википедии ) для пушечного ядра без сопротивления воздуха, что
d = v^2 * sin(2 * theta) / g
, гдеd
горизонтальное пройденное расстояние (расстояние от места стрельбы до цели)v
скорость, с которой был выпущен снарядtheta
есть угол относительно горизонта снаряда выстреливает ( угол направления вектора пожара от опорного горизонта )Переставляя уравнение для
g
трюковg = v^2 * sin(2 * theta) / d
.Константа в уравнении пушечного ядра
g
- ускорение силы тяжести . Мы можем принять это как ускорение, вызванное движением ракеты . Это тоже хорошо - это все еще постоянное ускорение в постоянном направлении .Что теперь?
Запустите это уравнение,
g
когда вы запускаете ракету. Он скажет вам, насколько ускорить ракету перпендикулярно к контрольному горизонту, чтобы поразить цель. Поскольку направление этого ускорения постоянное, орбита не будет образовываться.Boom.
источник