Я пытаюсь реализовать простейшую из возможных форм пропорциональной навигации , то есть ракета поворачивается в направлении, в котором изменяется ее отношение к цели, и как только ее отношение к цели не меняется, она находится на пути перехвата.
Итак, у меня есть двумерная ракета, движущаяся с постоянной скоростью в направлении, в котором она находится, которая может вращаться с постоянной скоростью, и каждый интервал я обновляю ракету чем-то вроде:
Position += VectorProduct (Direction * Speed * TimePassed)
PreviousTargetBearing = TargetBearing
TargetBearing = AngleBetween(TargetPosition, Position)
TargetBearingDelta = TargetBearing - PreviousTargetBearing
If TargetBearingDelta > 0: MissileDirection += TurnRate * TimePassed
If TargetBearingDelta < 0: MissileDirection -= TurnRate * TimePassed
Проблема в том, что ракета всегда колеблется вокруг направления запуска, потому что, как только ракета поворачивается в первый раз, это меняет знак TargetBearingDelta, заставляя ее вращаться в противоположном направлении, и так далее ...
Как проще всего решить эту проблему? Я уверен, что упускаю что-то простое.
Связанный вопрос StackOverflow: Как создать «ракету-перехват» для игры?
Повторюсь, я заинтересован именно в реализации алгоритма пропорциональной навигации , а не в алгоритмах самонаведения в целом.
Обновление: я предполагаю, что очевидный ответ - не проверять направление и корректировать курс на каждом повороте, а переключаться между ними. Я попробую это.
Как говорит Нейлер, вы можете каким-то образом ограничить изменение движения.
Проверьте PID , хороший способ заставить вещи двигаться к определенному «значению» быстро, но без превышения его, это может дать вам некоторые идеи.
Вы также можете проверить этот вопрос , немного ниже объяснение «кривой собаки», очень точный алгоритм поиска, используемый собаками.
источник
По моему мнению, был бы другой метод, включающий два вектора: один для направления удара ракеты, а другой для самого себя (или, скажем, для изменения направления в соответствии с первым вектором).
Таким образом, мы можем создать время задержки, позволяющее ракете плавно менять свое направление в соответствии с изменением первого вектора. Я верю, что это устранит проблему в «знаке» математической операции.
PS. Суть в том, что мы переносим собственный вектор ракеты на вектор направления (чтобы попасть) относительно некоторого небольшого лага во времени.
источник
Пропорциональная навигация проста для реализации в играх.
Пример реализации в игре:
Требуемое ускорение = LOS * LOS_Rate * NC + APN_bias
LOS = Vector3 (TargetPosition) - Vector3 (MissilePosition)
NC = множитель постоянной навигации (в зависимости от частоты кадров)
APN_bias = LOS_Rate / delta_T * (NC / 2)
LOS_Rate = LOS Rotation Rate - угловая скорость изменения линии визирования между ракетой и целью. Это измеряется путем записи положения вектора ракеты и цели в каждом кадре в delta_T и вычитания каждого, чтобы получить разницу. Delta_T - это временная привязка (то есть частота кадров), с которой ваша самонаводящаяся ракета запускается в игре.
Чтобы получить LOS_Rate, просто сделайте свой цикл наведения ракеты для каждого кадра следующим образом (delta_T):
Вы можете найти больше информации о том, как мы реализовали PN для игры World in Conflict, по следующим ссылкам ниже. Надеюсь, вы найдете это полезным.
http://www.moddb.com/mods/wicmw/features/flint-lead-pursuit-guidance-principles
http://download.wicmwmod.com/Fun_Mod/presentations/FLINT%20Jul%202012.pdf
-blahdy
источник
Разве вы не можете просто ограничить скорость поворота, чтобы она никогда не могла превзойти TargetBearing в одном кадре?
Если из-за поворота ракета пройдет мимо своей цели, вы просто устанавливаете новую опору равной цели.
Имеет ли это смысл?
источник