Год назад я закончил Московский Авиационный Институт и получил квалификацию «Инженер». Но поскольку к тому времени я уже год отработал программистом и знал, что в этой области буду работать и в дальнейшем, получение «корочки» не стало для меня чем-то переломным, в отличие от моих многих одногруппников. Знания, полученные на 4-5 курсах, казались мне довольно интересными и расширяющими кругозор, но не слишком полезными для работы программистом. Однако есть несколько тем, которые мне помогли и в работе. Про одну из них я и хочу рассказать, и имя ей — методы наведения летательного аппарата.
Под летательным аппаратом в наших курсах всегда подразумевалась управляемая авиационная ракета, чаще всего типа воздух-воздух. Наведение ракеты на цель — это управление её полётом таким образом, чтобы она оказалась в области встречи с целью. Цель, само собой, этой встречи не желает и может совершать различные маневры.
Так каким же образом методы наведения могут помочь в игростроении? Первое и основное, что может прийти на ум — это управление одним объектом в игре таким образом, чтобы он столкнулся с другим объектом. Например, самонаводящиеся снаряды, выпускаемые врагами в игрока, или же бот, который собирает двигающиеся в пространстве объекты… Ну или как управление ботом-хоккеистом в Russian AI Cup 2014, чтобы он побыстрее захватывал шайбу или бежал бить соперника).
Поскольку координаты у нас меняются не непрерывно, а дискретно, то областью встречи объекта с целью будем считать окружность с радиусом в перемещение объекта за шаг и с центром в координатах цели.
Итак, начнём с самого простого метода наведения, который многие наверняка использовали:
Метод прямого наведения
Принцип заключается в том, что на каждом шаге игрового цикла объект должен стремиться («смотреть») прямо на цель:
На изображении я постарался показать, что вектор скорости не всегда совпадает с линией визирования, несмотря на то, что объект постоянно «смотрит» на цель.
Это самый неэффективный метод среди рассматриваемых, поскольку с его помощью получается самая длинная и кривая траектория движения наводимого объекта. Также у этого метода самая большая вероятность срыва наведения. Однако, этот метод вполне себе применим — например, если не хочется, чтобы игроку приходилось сильно напрягаться, чтобы уйти от ракеты. Ну или у вас есть всего 30 секунд на реализацию.
Метод погони
При наведении этим методом на каждом шаге у объекта должны совпадать вектор скорости и направление на цель (линия визирования).
Ходит слух, что своё название метод погони получил потому, что на охоте собаки преследуют цель именно таким образом. Метод достаточно прост и даёт чуть лучшие результаты, чем метод прямого наведения.
Надо сказать, что если ваш объект мгновенно приобретает и теряет скорость, то два вышеперечисленных метода эквивалентны. Оба этих метода имеют модификацию: объект (вектор скорости) направляется не прямо на цель, а с неким углом упреждения. Это позволяет снизить кривизну траектории, а значит, увеличить эффективность наведения. Первые управляемые ракеты с автоматическим наведением использовали именно эти методы (например, в американской ракете Sidewinder использовался метод погони с постоянным углом упреждения).
Метод параллельного сближения
При этом методе объект постоянно стремится сохранить угол линии визирования цели (т.е. линии объект-цель).
Если цель будет двигаться равномерно прямолинейно, то наш объект будет двигаться по самой эффективной траектории — по прямой, и время полёта до цели будет минимальным. Таким образом, этот метод — самый эффективный из перечисленных. Именно его я чаще всего и применяю, тем более что программная реализация получается гораздо проще, чем реализация в реальной жизни (нет ошибок измерения параметров, нет рассогласования между расчётной и реальной траекториями).
Метод пропорционального сближения
При наведении по этому методу угловая скорость вращения вектора скорости объекта будет пропорциональна угловой скорости вращения линии визирования цели, т.е.:
При этом коэффициент K можно подобрать эмпирическим путём (обычно это несколько единиц).
На самом деле, этот метод является общим методом наведения. Ведь если взять коэффициент пропорциональности К за 1, то мы получим метод погони (вектор скорости будет всегда направлен на цель), если же K=∞, то получится метод параллельного сближения.
Собственно, на этом обзор методов наведения заканчивается.
Надеюсь, статья окажется полезной, ну или по крайней мере небезынтересной.