Gamedev Владимир Семыкин
18 020

Один выстрел — один труп: основы механики стрельбы в FPS

Основные принципы hitscan и баллистики снарядов.

В закладки
Аудио

Шутеры от первого лица стали неотъемлемой частью индустрии видеоигр с момента выхода Wolfenstein 3D в 1992 году. С тех пор этот жанр развивался благодаря выдающейся эволюции графики, огромным бюджетам и экосистеме киберспорта. Вместе с этим менялось и геймплейное ядро жанра — стрельба.

Участник блог-платформы Medium Тристан Юнг в своём тексте рассказал про три основных подхода для создания системы стрельбы. Он упомянул про методы hitscan, баллистику снарядов и гибридный подход. Мы выбрали из материала главное.

Hitscan

Раньше многие игры использовали технику рейкастинга для рендеринга 3D-окружения для 2D-изображения (экрана пользователя). Рейкастинг позволяет движку определять первый объект, на который падает луч. Разработчики придумали подход, в котором луч исходит из дула оружия и позволяет имитировать пулю. Так и родилась идея hitscan.

Пример рейкастинга

Если игрок стреляет, то физический движок:

  • определяет, в какую сторону направлено оружие;
  • создаёт луч от дула до точки;
  • использует рейкастинг, чтобы определить, попал ли луч на объект.

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

Из точки A исходит луч в точку B. Если луч пересекает куб, то он регистрирует попадание

Hitscan прост по своей сути, но эту систему можно дополнить разными способами:

  • если продолжить луч после первого столкновения, то можно поразить сразу несколько целей, стоящих друг за другом. Так, например, работает railgun в Quake;
  • можно увеличить максимальную дальность луча, чтобы он тянулся до того момента, пока не встретит препятствие. Это свойство можно использовать для создания лазерного оружия;
  • можно изменить свойства некоторых поверхностей, чтобы пули от них отражались.
Genji из Overwatch, например, может отражать выстрелы

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

Неудивительно, что многие игры используют hitscan для стрельбы. Wolfenstein 3D и Doom являются классическими примерами, но даже многие игры последних лет используют эту технологию. У таких персонажей, как Soldier 76, McCree и Widowmaker из Overwatch, есть hitscan-оружие. Это же касается и большинства оружия в Call of Duty.

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

В Halo, например, можно увидеть, что вспышки от выстрела и от попадания появляются одновременно

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

Многие казуальные игры используют метод hitscan, поскольку он упрощает процесс обучения для большинства начинающих пользователей. Но для более хардкорных шутеров такой метод подходит не во всём.

Баллистика снарядов

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

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

Поскольку пули в этой системе не движутся моментально, можно изменять скорость полёта снаряда:

  • можно добавить эффект «Bullet-time» как в Max Payne, Sniper Elite или Superhot;
  • из-за этого игроку приходится предугадывать движение цели, чтобы попасть куда нужно;
  • это позволяет добавить гранатам эффект отложенного взрыва.

Существует множество способов оптимизации этого подхода для снижения влияния на производительность. Например, для этого может использоваться пул снарядов, загруженных заранее: в нужный момент они просто телепортируются на поле боя.

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

  • tick рассчитывается отдельно от логики рендеринга. Это означает, что игра будет более точно отображать объекты, даже если некоторые кадры пропускаются;
  • расчёт tick в каждом кадре. Физика имеет привязку к частоте кадров. Если отключить ограничение частоты кадров или начать пропускать кадры, можно увидеть ускоренные или прерывистые эффекты в мире.

Интересно, что эта система появилась раньше, чем hitscan. До FPS уже было много шутеров с видом сверху, таких как Asteroids, Space Invaders или Galaxian. В этих аркадах уже в 1970 годах применялась примитивная баллистическая стрельба.

Гибридная система

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

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

Разработчики могут также смешивать две технологии, чтобы убрать слабые стороны каждой системы, а также обеспечить более реалистичный геймплейный опыт. Например, это можно встретить в серии Sniper Elite: после нажатия на спусковой крючок движок использует hitscan, чтобы определить, достаточно ли метким получится выстрел, чтобы вызвать замедление времени. Если это так, то будет произведён выстрел пулей, которая учитывает баллистику.

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

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

#геймдизайн

{ "author_name": "Владимир Семыкин", "author_type": "editor", "tags": ["\u0433\u0435\u0439\u043c\u0434\u0438\u0437\u0430\u0439\u043d"], "comments": 47, "likes": 136, "favorites": 197, "is_advertisement": false, "subsite_label": "gamedev", "id": 42140, "is_wide": false, "is_ugc": false, "date": "Fri, 08 Mar 2019 12:15:24 +0300" }
{ "id": 42140, "author_id": 94357, "diff_limit": 1000, "urls": {"diff":"\/comments\/42140\/get","add":"\/comments\/42140\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/42140"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 64954, "last_count_and_date": null }

47 комментариев 47 комм.

Популярные

По порядку

Написать комментарий...
70

Статья ни о чем, честно. Есть хмтскан,это моментально прилетающие пули, которые фактически и не пули, а есть реально отсчитанная баллистика. Ну крч есть игры с хитсканом, а есть с баллистикой

Ответить
35

есть еще и с хитсканом и с баллистикой! Забыл упомянуть!

Ответить
3

не все проджектайлы это балистика, есть балистика из нескольких хитсканов, например. статья любителя который толком не лазил в движки.

Ответить
26

Расскажите в комментариях, в каких шутерах от первого лица вам больше всего запомнилась механика стрельбы?

Там где противники реагируют на попадания, а не поедают пули как губка.

Ответить
3

Да это вообще другая тема. И в синглах просто, любую анимацию при попадании можно включить. А в мультиплеере нужно чтобы тот в кого попали не терял управление, по крайней мере если это не смертельно попадание

Ответить
9

И в синглах просто, любую анимацию при попадании можно включить.

Расскажи это 9 из 10 современным ааа разработчикам.

Ответить
17

Жаль, нет упоминания Армы и качества используемой баллистики.

Ответить
2

Про королей опять забыли. Я смотрю пк игры тут идут лесом (в целом), даже про длс для хой4 не упомянули нигде.

Ответить
6

Да, дтф по моему почти полностью состоит из людей которые в детстве вспоминют какую нибудь зельду и игры с пс1 и 2. В моем понимании жто какой то забугорный космос от золотой молодёжи. О приставках в детстве не смел и мечтать. В плане гейминга от денди у друзей перешел к спектруму дома, от которого к пк где первой игрой были герои3. Геймпада в руказ не держал примерно никогда - в плане аксессуаров с джойстика денди перешел к окулус рифту.

Ответить
1

Пиши, буду читать и лайкать.

Ответить
5

Странно что hitscan везде в тексте по английски, а баллистика по русски :) Вообще устоявшиеся английские термины это hitscan/projectile

Ответить
2

А какой устоявшийся русский термин для хитскана?

Ответить
5

А мне было интересно почитать, спасибо!

Ответить
3

Мне больше всего подходит стрельба в Дивижн и в Бордерлендс. Разного оружия много и ведет оно себя по разному. Думаю механики стрельбы сильно зависят от жанра шутера, для скоростных лучше подходит хитскан, для скил- и лутер-шутеров наверно баллистика. В реальном оружии "настильность" один из важных параметров, который влияет на шанс успешного попадания в цель. Так что, не только в игровых механиках наблюдается поиск оптимума среди нескольких решений.

Ответить
1

В Дивижне отличная великолепная стрельба, когда в одного моба-человека можно всадить 3-4 магазина патронов. Идеально просто.

Ответить
1

В голову если стрелять, то 1-2. Скилами вообще можно взвод уложить и пройти миссию без единого выстрела.

Ответить
1

АХахахах, ну это в корне меняет дело. Если в голову требуется всего пара магазинов, то это прям вообще идеальная стрельба, образец для остальных игр.

Ответить
1

1-2 попадания. Заявленные 3-4 магазина на моба это из какой то другой игры видимо

Ответить
2

Если противник на 2 лвла выше чем ты, и ты играешь на харде, то эти 1-2 попадания в голову превращаются в 3. Из снайперки. Или в 1-2 магазина из чего-то послабее. Собственно, стрельба в дивизии2 - причина, по которой я решил не брать эту игру. Поиграл в бету, и, в 2019 эти жрущие пули парни в майках уже выглядят странно.

Ответить
0

Мобы, у которых уровень гораздо выше уровня игрока (так называемые "черепа"), боссы и тому подобные запросто могут "принять на грудь" сотню пуль, прежде чем отдадут концы.

Ответить
1

а стрельба-то тут при чем?

Ответить
2

Так в дивижине хитскан. Да и жрущие пули враги особого удовольствия стрельбе не придают.

Ответить
3

Вспоминается BFG, которая после попадания основного заряда рисует исходящие из игрока лучи, и всему, что попадётся на их пути доставляется дамаг. Т.е. можно выпустить снаряд, развернуться спиной - лучи будут выходить в сторону выпущенного снаряда. Плюс рекомендую ролики о внутриигровой баллистике ARMA 3. Там уже 7,62х54 прошивают однослойные укрытия из мешков с песком.

Ответить
0

Хитскан атаки в Overwatch иногда очень странно засчитывают попадание. Особенно заметно на Вдове, у которой от выстрела остается след - на записи видно, что снаряд прошел мимо, но логикой засчитался, или наоборот. Видел упоминания, что так получается из-за зависимости хитскана в ОВ от пинга, но на нормальные объяснения, как именно зависит, не натыкался. Никто, случаем, не в курсе?

Ответить
5

Почитай про тикрейт, в шутерах с низким тикрейтом такое обычно происходит.

Ответить
1

Нашел на примере кс:го, думаю понял, спасибо. Но тогда вроде тикрейт и на проджектайл влиять так же должен, а в игре не ощущается
Возможно, когда не ожидаешь мгновенного отклика на действие, с точки зрения восприятия большие допущения к точности расчета. В духе "я, вроде, должен попасть, но пока летело, может и правда не попал - правдоподобно". Если так, то интересное не очевидное различие, влияющее на экспириенс

Ответить
3

Скорее всего это связано с системой favor-the-shooter и тем, с чьей перспективы смотреть запись. Как правило, если стрелок видит попадание — значит он попал. Ну и кроме того, еще это зависит от того, как создается сам трассер — это ведь чисто визуальный эффект, никак не связанный с самой атакой. Не исключено, что он создается неточно.

Ответить
2

https://www.youtube.com/watch?v=W3aieHjyNvw c 36 минуты про регистрацию попаданий в овере с учетом задержек. Там довольно подробно механизам объясняется

Ответить
0

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

Ответить
0

Просчёт попадания всегда (по-крайней мере в нормальных играх) производится на сервере. Задача клиента сводится к передаче действий игрока на сервер и максимально возможном точном воспроизведении того, что происходит на сервере. Но из-за пинга, потерь пакетов и т.п. то, что наблюдается на клиенте может всегда хоть немного но отличается от того, что на самом деле произошло на сервере. Поэтому никогда не стоить верить клиентским повторам. А серверных демок сейчас почти ни у кого нет.

Ответить
0

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

Ответить
1

Ну, в Max Payne 3 довольно реалистично ведут себя болванчики, когда в них пули попадают, в GTA4. В шутерах от первого лица доже вспомнить не могу. Нормальной системы ранений толком нет щас. Вспоминаю самые первые Мадальки, еще на PS1, так там немцы реагировали на попадания в ноги и руки. Хромали, не могли ходить, роняли из рук оружие, ползали, если ноги прострелить. Сейчас ничего этого и в помине нет.

Ответить
0

Спасибо за статью. Мне, как человеку крайне далёкому от шутеров было интересно. Магия боевая в любимых мной РПГ кстати работает по такому же принципу? Ещё интересно было бы узнать как учитывается поражение по площади от гранаты или файербола - каждый осколок считается отдельно или есть иные механики?

Ответить
2

Обычно сфера рисуется, внутри нее начисляется дамаг.

Ответить
2

В большинстве игр с сеткой урон наносит константный урон по ячейкам.
Там где сетки не видно (Герои 4, современные пошаговые РПГ) каждый юнит стоит на квадратной площадке или круговой зоне, состоящей из квадратных ячеек меньшего размера. Например если ячейка 5см, то базовый юнит в Героях 4 занимает 5х5 ячеек, дракон - 15х15 (размер драконов в Г4 я когда-то помнил, сейчас взял с потолка просто для примера). Взрыв же указывается в ячейках, например 25 ячеек в диаметре, дальше тригонометрия. Урон не скажу за Г4 (не помню), но можно засчитывать за количество ячеек, которыми юнит попал в зону взрыва - больше попало в взрыв, больше урон.
Третий вариант - вся видимая зона в момент взрыва покрывается невидимыми треугольниками, координаты которых отталкиваются от точки взрыва. Похоже на "ячеистый" вариант, но сетка не существует постоянно, а просчитывается заново тогда, когда нужна на лету. Используется в экшен РПГ и стратегиях. К примеру, это заметно по тому, как в дьяблоидах или стратегиях типа Starcraft 2 мы видим зону видимости юнита или освещения от факела в руках персонажа - эта зона не идеально круглая, а скорее многогранник, с большим количеством ровных линий. При этом она ровно и плавно перемещается вместе с юнитом. Размер треугольников выбирается достаточно небольшим, чтобы в том же SC2 в него влез тот же, к примеру, зерлинг, а радиус освещения/взрывов тогда высчитывается исходя из некоего "количества треугольников по прямой от точки факела/взрыва". При таком подходе как правило урон одинаков везде или в пределах треугольника, и может только меняться при отдалении от эпицентра по правилу, например, "-10% за треугольник".

Ответить
0

Я правильно понимаю, что сетка из треугольников строится аналогично построению сетки при численных вычислениях?

Ответить
0

ХЗ что за "масло масляное".

Ответить
1

Сам задавался похожим вопросом. Знакомый геймдизайнер подсказал, что урон по области игрок видит анимацией "пожара" в радиусе, а противник получает статус "горит", моментальный урон равный Х и DOT Y/секунду, например. Статус поверхности может сохраняться определенное время, любой противник, попадающий в маркированную зону получает моментальный урон и/или такой же DOT и визуальный эффект. Примерно так оно устроено в большинстве случаев, примерно так работают горящие поверхности в D:OS или жаровня в Скайриме.

Ответить
0

В UE4 это называется "Line trace" они там есть разных видов, сферические, боксовые.

Ответить
0

Эскейп фром тарков фореве)

Ответить
0

Топовая стрельба в Escape from Tarkov.

Ответить
0

А мне в батле четвертой больше всего нравилась стрельба, из сетевых.

Ответить
0

В Destiny 2 очень комфортная стрельба

Ответить
0

Статья про стрельбу в Овере прямо-таки.

Ответить
0

Причем здесь хардкорные игры? Даже в казуалках, где надо показать сам "снаряд" - какой нибудь фаербол - придется использовать projectile.

Ответить
0

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjog" } } }, { "id": 10, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-250597-0", "render_to": "inpage_VI-250597-0-1134314964", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=clmf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudo", "p2": "ftjf" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvc" } } } ]
Невероятно! Skyrim портировали на...
Подписаться на push-уведомления