[Перевод] Как работают пули в видеоиграх?

Игры FPS (first-person shooter, шутер от первого лица) стали неотъемлемой частью видеоигровой индустрии ещё с момента появления в 1992 году популярнейшей Wolfenstein 3D. С тех пор жанр эволюционировал: улучшалась графика, увеличивались бюджеты на разработку, развивалась экосистема киберспорта. Но что насчёт их фундамента — механики стрельбы? Как проходило развитие на этом фронте? Почему в некоторых играх оружие кажется реальными, а в других похоже на игрушки?

Hitscan

В предыдущую эпоху многие игры для рендеринга 3D-сцен в 2D-изображения использовали технику под названием raycasting («бросание лучей»). Raycasting позволяет движку определять первый объект, с которым пересечётся луч. Но потом разработчики задались вопросом: «Что, если выпустить луч из ствола оружия, чтобы имитировать пулю?» Благодаря этой идее родился hitscan («сканирование попадания»).

Пример raycasting

В большинстве реализаций оружия с hitscan при выстреле игрока физический движок выполняет следующие операции:

  • Определяет направление, в котором указывает оружие.
  • Выпускает из ствола оружия луч на заданное расстояние.
  • Использует raycasting для определения того, попал ли луч в объект.

Если движок определил, что объект находится на линии огня, то он сообщит ему об этом, сказав, что в него «попала» пуля. Затем цель может выполнить все вычисления, необходимые для регистрации повреждений.

Из Unity. Точка A обозначает оружие, испускающее луч до максимальной точки B. Луч сталкивается с кубом, которому движок сообщает, что в него попали.

Hitscan по своей природе прост, но для добавления другой логики можно внести множество различных модификаций:

  • Если мы продолжим луч за первый объект, в который он попал, то сможем пронзать несколько объектов на линии, как рельсовая пушка (railgun) в Quake
  • Если убрать у луча максимальную дальность, то мы получим лазер, который будет лететь вечно, пока во что-то не попадёт
  • Можно программно сделать некоторые поверхности отражающими, чтобы от них отскакивали пули

Overwatch. Способность персонажа Гэндзи deflect — пример отражающей поверхности.

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

Поэтому неудивительно, что в логике стрельбы многих игр используется hitscan. Классическими примерами являются Wolfenstein 3D и Doom, но эта технология используется и в современных играх. Такие персонажи, как Солдат 76, Маккри и Роковая вдова из Overwatch используют оружие с hitscan, а большинство оружия в Call of Duty тоже основано на hitscan.

Overwatch, Call of Duty, Wolfenstein 3D

Так почему же такой подход не используется во всех играх?

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

Halo. Заметьте, что дульная вспышка и эффекты попадания по земле происходят одновременно.

Во-вторых, в большинстве реализаций hitscan используются прямые лучи. Это значит, что сложно учесть ветер, гравитацию и другие внешние факторы, которые могут влиять на пулю после вылетания из ствола. Программисты могут добавлять всякие хитрости, чтобы луч имитировал настоящие пули, но как только игрок «выстрелил» лучом, нет никакой возможности изменить его путь посередине.

Во многих «казуальных» играх всё равно используется hitscan, потому что он упрощает кривую обучения для большинства игроков-новичков. Но как насчёт игр, стремящихся передать «реальные» ощущения от стрельбы? При таких ограничениях этого добиться невозможно, поэтому необходим другой метод.

Баллистика летящего предмета

Этот термин может показаться сложным, но на абстрактном уровне идея довольно проста. Каждая выстреливаемая из оружия пуля или снаряд создаёт в сцене новый физический объект. Он обладает собственной массой, скоростью и ограничивающим параллелепипедом контакта (hitbox), которые отслеживаются движком игры.

Max Payne 3

Преимущества баллистики в полной мере проявляются в играх, в которых реализм имеет наивысший приоритет. Так как каждый летящий объект существует сам по себе, мы можем учесть влияние на него ветра, трения, гравитации, температуры — любой силы, которая должна действовать на пулю. Теперь, когда мы способны менять физику, игрокам можно пользоваться более разнообразным вооружением, а не только простыми пистолетами и лазерами; мы можем добавить в свой арсенал гранаты и ракеты.

Так как пули в такой системе не движутся со скоростью света, можно также реализовать и временны́е свойства:

  • «Буллет-тайм», применяемый в Max Payne, Sniper Elite и Superhot.
  • Время перемещения пуль, то есть при стрельбе на дальние расстояния (или стрельбе медленно двигающимся снарядом) критически важным становится упреждение.
  • Отложенные взрывы снарядов, например гранат

Из-за этих дополнительных вычислений обработка становится более затратной, чем при использовании hitscan. Для обеспечения синхронизации серверам приходится выполнять намного больше работы, необходимо устранять расхождения или конфликты в логике на стороне клиентов, чтобы все игроки в пределах одного сервера находились в одинаковых условиях.

Superhot, Battlefield 1, Overwatch

Существует множество обходных путей для максимального повышения производительности. Например, движок может хранить пул объектов, загруженных до начала игры и «включать» их по мере необходимости. После попадания в поверхность можно воспроизвести анимацию баллистики и отключить пулю, сохранив её на будущее. Этот способ позволяет экономить вычислительные ресурсы и память, занимаемые многократным созданием и уничтожением объектов.

Также существует множество способов выполнения вычислений, но на высоком уровне разница заключается в том, где они решают обрабатывать «такт» игры — единицу измерения времени:

  • Такт вычисляется отдельно от логики рендеринга, то есть игра будет иметь более точное воспроизведение объектов даже при пропуске кадров. Для вычисления точного времени, прошедшего с момента предыдущего рендеринга, требуется больше логики.
  • Вычисление такта в каждом кадре; привязка физики к частоте кадров. Если отключить ограничение на максимальную частоту кадров или если игра начнёт пропускать кадры, то физика мира ускорится или будет тормозить.

Последствия привязки движения к тактам чётко заметны, когда снаряды движутся достаточно быстро, чтобы перемещаться между тактами на довольно большое расстояние. Могут возникать ситуации, когда объекты «проходят» сквозь друг друга, потому что в движке они никогда не пересекались.

Всё это кажется сложным, поэтому многие люди думают, что это относительно новый метод; однако на самом деле он возник раньше, чем hitscan! До игр жанра FPS существовало множество шутеров с видом сверху, например Asteroids, Space Invaders или Galaxian. Это аркадные игры 70-х годов, в которых уже была реализована баллистика снарядов, хотя и довольно примитивно.

Asteroids. Снаряды довольно сложно увидеть, но они есть!

Но даже со всеми этими функциями мы не может воссоздать реалистичную модель реального мира. Можно ли как-то воспользоваться преимуществами обоих методов?

Гибридные системы

Большинство игровых движков способно обрабатывать оба типа симуляций пуль: hitscan и баллистику. Это позволяет реализовать огромный выбор оружия; в таких играх, как Halo, GTA и Half-Life есть оружие, которое может поддерживать оба типа физики.

Halo. В Assault Rifle используется hitscan; в Needler используется баллистика снарядов

Разработчики также могут смешивать обе техники, чтобы закрывать слабые места каждой из систем и обеспечивать более реалистичное поведение. Например, для устранения проблемы прохождения объектов сквозь друг друга каждая пуля в каждом такте движка может испускать луч. Это позволяет движку увидеть, пересекутся ли какие-то из лучей между тактами, сталкиваясь в воздухе.

Также их можно объединять для улучшения особенностей игры. Отличным примером подобного является серия Sniper Elite; после нажатия на спусковой крючок движок использует hitscan, чтобы определить, сделан ли выстрел достаточно близко к любому обнаруживаемому объекту для включения slow motion. Если да, то выстрел пулей производится с расчётом баллистики в режиме «буллет-тайм».

Sniper Elite

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

Что же дальше? Как будет развиваться эта область в дальнейшем?

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

 

Источник

ballistics, first person shooter, hitscan, raycasting, игровая физика, шутеры от первого лица

Читайте также