habrahabr

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

  • среда, 20 ноября 2019 г. в 00:36:38
https://habr.com/ru/post/475420/
  • Разработка игр
  • Игры и игровые приставки


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

Hitscan


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


Пример raycasting

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

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

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


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

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

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


View post on imgur.com