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

86

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

  1. Когда NPC выпускает пулю из своего оружия, действительно ли пуля перемещается из своего оружия в заданную цель, или они полностью игнорируют эту часть и просто делают дыру от пули в цель?

  2. Если пуля действительно движется от орудия к цели, с какой скоростью она действительно движется?

mahen23
источник
25
Кровавый экран, такой реальный!
AttackingHobo
6
снимает : BOOOOORRRIIIING
mahen23
1
Я не уверен, что вы можете назвать пули Megaman Legend пулями, но в Megaman они используют медленные снаряды для пули. В них вы можете четко видеть искривление снимков, если во время стрельбы бегаете по кругу (эффект Кориолиса).
Ложь Райан

Ответы:

84

Большинство игр FPS используют raycasting для реального игрового процесса; пули мгновенно попадают в цель и попадают в цель при выстреле.

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

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

Некоторые игры, такие как ARMA II, STALKER (вся серия), используют более реалистичную физику пули со временем прохождения, рикошетами и проникновением с углами отклонения. Я полагаю, что эти системы используют лучевое вещание, но с пределом, который определяется скоростью пули. В этих играх скорость морды может быть реалистичной, как в ARMA II, или выглядит примерно так же, как в STALKER.

Я предпочитаю иметь реалистичную физику пули, поскольку оружие стреляет снарядами, а не лазерами.

AttackingHobo
источник
1
Не сыграв ни в одну из упомянутых игр, как это влияет на игровой процесс? Я имею в виду, если вы используете физику пуль в такой игре, как Call of Duty, вы действительно видите заметную разницу? Углы проникновения меняют игру? Могут ли игроки понять, что их персонаж не совпадает с пулевым отверстием по отношению к стрелку? Просто любопытно, какие выгоды есть, чтобы оправдать накладные расходы. Заранее спасибо.
Dutchie432
Это добавляет слой непредсказуемости и глубины к механике стрельбы, что мне нравится. Пули не мгновенные !!! chuckhawks.com/rifle_ballistics_table.htm Слизняк, движущийся со скоростью 2644 фута в секунду в течение 600 футов, занимает 0,2 секунды, чтобы поразить цель, не учитывая дополнительного замедления. Бегущая цель будет пропущена, если вы нацелитесь прямо на нее. Дальнейшее расстояние позволит слагу двигаться медленнее, чем скорость звука, позволяя людям прыгать на землю или на другое, если они услышат выстрел.
AttackingHobo
В этом ответе сделано несколько неточных утверждений, и их следует удалить. Проверьте мой ответ ниже.
EddieV223
1
Пули в ArmA 2 являются смоделированными снарядами; они могут быть изменены (изменение скорости, изменение направления) в полете и сталкиваться с объектами во время движения. Независимо от того, делается ли это путем литья лучей или нет, они действуют как реальные физические объекты.
замедленная
так mw2? радиовещание или нет? Потому что они явно отлично справляются с симуляцией пулевых отверстий и разрушением окружающей среды
mahen23
51

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

На коротких дистанциях пули будут перемещаться вместе с промежутком времени между кадрами, в любом случае они будут попадать от стрелка к цели между или в пределах 1 кадра.

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

jhocking
источник
44

Я написал код маркера для PlanetSide. У нас было несколько «снайперских» снарядов, но в основном они имитировались как можно лучше, учитывая ограничения процессора и огромное количество пуль в игре в любое время.

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

Пули, не являющиеся хитовыми, отмечены тиканем либо по времени графического кадра, либо по фиксированному временному шагу с применением вычислений для ускорения (например, ракеты), силы тяжести, воздушного трения, наведения (например, тепловыделяющих снарядов) и т. Д. Цель состоит в том, чтобы создать конечную позицию снаряда для временного шага. Как только начальная и конечная точки установлены, один или несколько лучей могут быть наложены, чтобы приблизиться к траектории полета и обнаружить любые столкновения, которые произошли бы во время полета.

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

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

Дон Нойфельд
источник
2
Я играл в Planetside до того, как занялся программированием хорошей игры, и звучит так, что было бы интересно писать код.
Энтони
18

Это зависит от игры и уровня точности / реалистичности.

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

Поэтому я подозреваю, что когда это возможно, игровые дизайнеры упрощают ситуацию, рассматривая некоторые кадры как мгновенные (так что вам нужно учитывать местоположение каждого в один момент времени), или ограничивая дальность пули. К счастью, это часто соответствует реальной физике. Например, снайперские винтовки стреляют высокоскоростными снарядами.

Многие игры могут имитировать многоступенчатый путь из нескольких снимков медленно движущегося объекта (например, артиллерии, бомб, маркеров и т. Д.), Но это очень дорого, и проблемы с синхронизацией встречаются чаще, что приводит к забавным видео на YouTube.

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


источник
14

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

Джош
источник
11

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

С другой стороны, в Torque 3D Engine DID используются реальные снаряды, и дизайнер может повлиять на их индивидуальные модификаторы скорости, массы и силы тяжести. Все, что делал двигатель - обновлял значения каждые 32 миллисекунды.

РЕДАКТИРОВАТЬ

В дополнение к использованию объектов-снарядов, Torque 3D Engine также позволил использовать лучи в качестве альтернативы. (Я сделал несколько игр, в которых «снаряд» на самом деле является эффектом частиц, который не имеет поддержки, оказываемой объектами снаряда, поэтому требовалось применение лучей.)

Casey
источник
классная история, братан однако, я уверен, что движку Torque 3D потребовалось больше вычислительной мощности, чтобы вычислить всю эту физику.
mahen23
@ mahen23 Ты бы удивился. У него были Меньшие физические расчеты, чем у Source Engine, отчасти потому, что он вообще не обрабатывал столкновения Softbody, только простые ограничивающие и коллизионные блоки.
Кейси
10

В вики Team Fortress 2 есть довольно классная статья о поведении их снарядов и оружия для сканирования ударов.

http://wiki.teamfortress.com/wiki/Mechanics#Hit_detection

lunixbochs
источник
2
Эта вики хороша для чтения.
mgiuca
Несмотря на то, что этот раздел короткий, он объясняет как совпадение совпадений, так и отсутствие совпадений, и объясняет, что такое хитбоксы и как они используются.
Джоккинг
не забудьте прочитать под-статьи "Проекция" и "Hitscan" прямо под заголовком этого раздела
lunixbochs
6

На самом деле во многих играх используется алгоритм проверки попадания в gpu. Вот основной способ, которым это работает:

1) Вне экрана создайте рендеринг текущего вида, где вся местность черная, а каждый символ не черного цвета. 2) Получите цвет пикселя под перекрестием. 3) Если это не черный поиск, то цвет > отображение игрока и нанесение удара по этой цели.

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

Тимоти Болдридж
источник
Поиск цвета-> игрока звучит больно? Если бы вы произвели это, не будет ли это такой же эффективностью?
замедленная
На самом деле, это очень быстро. Большая часть времени, затрачиваемого на рендеринг, связана с затенением реальных полигонов. В случае рендеринга хит-теста используются только сплошные цветные полигоны. Кроме того, этот хит-тест может быть полностью выполнен в графическом процессоре, и он идеально подходит для пикселей. Ничто так не привлекает игрока, как идеальное попадание в цель, а затем тест на попадание, сообщающий, что это был промах.
Тимоти Болдридж
Но как вы преобразуете пиксельное пространство в мировое пространство в соответствующий объект, который вы ударили.
замедленная
@ Даниель: Как говорится в ответе, цель, которая попадает в цель, определяется цветом. Каждый персонаж отображается как отдельный (сплошной) цвет, так что вы можете просто проверить цвет и черный = пропустить, что-нибудь еще = посмотреть, кто был отрисован в этом цвете, потому что он получил удар.
Дейв Шерохман
@ Дэйв Шерохман, я, должно быть, изначально прочитал это неправильно, после прочтения вашего объяснения стало ясно, что он имел в виду ... ура
замедленная
4

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

Для игры, которая совершает прямое перемещение пули (без падения), это мгновенно, игра прослеживает воображаемую линию (вектор) от точки ствола вперед. Затем он вычисляет, с чем пересекается эта линия, и регистрирует «попадание» пули в этот момент. Это может быть твердый объект, такой как стена, где удар вызывает такой эффект, как наклейка о попадании пули и «дым» / обломки. Это может повлиять на хрупкий объект, что приведет к его поломке, или это может повлиять на физический объект и дать ему «удар». Или, конечно, это может ударить игрока или другого NPC и нанести урон здоровью. Моделирование жесткого ядра будет моделировать проникновение пули через стены и вызывать эффект попадания со стороны выхода, вероятно уменьшая урон пули при выходе.

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

Чтобы визуализировать распространение пули, представьте конус, выходящий из пистолета вместо прямой линии (вектор). Фактическое направление пули рандомизировано и находится где-то внутри этого конуса. Если стрелок действительно близко к цели, разброс невелик, а точность высокая. Если цель находится далеко, конус добавляет больший разброс, поэтому у стрелка меньше шансов поразить цель.

Эта идея конуса выстрела может быть использована для моделирования точности стрелка (навыка), точности оружия и других условий. Например, NPC низкого уровня может получить выстрел с низкой точностью, в то время как NPC с высокой квалификацией будет иметь точность высокого уровня. Игрок, бегущий из пистолета-пулемета, стреляющего из бедра, будет иметь широкий конус выстрела, который уменьшится, если он остановится или прицелится. Снайперские винтовки будут иметь более плотные выстрелы, чем пистолет.

Тим Холт
источник
+1 хорошая информация. Но я думаю, что это может быть визуально более приятным, если ИИ на самом деле плохо нацеливается на игрока, а не на большой конус. Или, если вы хотите сделать конус больше, сделайте его переменного размера с учетом отдачи и дайте врагам нижнего уровня более быстрый темп увеличения размера, чтобы они просто казались неопытными.
AttackingHobo
1

Говоря об исходном коде Nexuiz с того времени, как я посмотрел, на самом деле они не посылали объект «пули» из точки А в точку Б. Если я правильно помню, это относится только к некоторым видам оружия - другие виды оружия отсутствуют ». t Мгновенное оружие, когда оно выстреливает, код смотрит на то, куда направлен ваш пистолет. Если он нацелен на человека (и является оружием мгновенного попадания), когда вы нажимаете «огонь», вы наносите удар.

Также примечательно то, как у Nexuiz была серверная опция для вычисления попаданий на клиенте или на сервере. Если вы подозреваете, что клиенты обманывают, вы можете переключиться на подсчеты попаданий на стороне сервера, чтобы помочь смягчить это.

Джефф Веллинг
источник
1

Другая стратегия - гибрид рендеринга всего и трассировки лучей. Вам не обязательно рендерить каждую пулю. Например, если ваша пушка стреляет со скоростью 30 выстрелов в секунду, стрельба может генерировать несколько сотен частиц ... вы можете уменьшить рендеринг, используя «эффект трассировки», рендеринг каждого 3-го выстрела, трассировка лучей двух других. Игрок все еще видит 10 выстрелов в секунду по врагу.

Твик для вашей конкретной ситуации, рендеринг больше для более низкой скорости стрельбы, меньше для более высокой.

Стивен
источник
1
Вы должны включить некоторую информацию о том, почему каждый третий выстрел или около того будет иметь трассировщик. Это не разработка игр для разработчиков. Это были военные. Трассирующие пули с фосфором, встроенным в заднюю часть пули. Когда выстрел идет, порох зажигает фосфор, создавая яркий след позади пули. Пули Tracer стоят дороже, чем обычные, поэтому они используются только для выстрелов по Х или около того, чтобы сэкономить деньги, но при этом имеют целевой эффект - легче прицеливаться.
AttackingHobo
Кроме того, вы не хотите разделять его на рендеринг и обновление, как вы говорите. Вы хотите, чтобы вся физика пули была полностью сделана с помощью метода обновления. Вы хотите, чтобы каждый выстрел X или около того также вызывал эффект трассировки, который намного медленнее, чем пуля, чтобы показать движение и направление.
AttackingHobo
@ AttackingHobo Я специально не думал о фосфорных снарядах, а скорее о некотором визуальном признаке того, что пули летят. Идея состояла в том, чтобы использовать выборочное сжатие ... удаляя уровень детализации, который игрок никогда не зарегистрирует как «пропавший», но это облегчает нагрузку на систему. Бит "каждая третья пуля" является произвольным ... вам придется экспериментировать, чтобы увидеть, что работает хорошо. В своем ответе вы сказали «поддельные трассеры», что также имеет большой смысл.
Стивен
1

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

В любом случае, я думаю, что может быть очень проблематично компенсировать реалистичные пули в многопользовательской среде, если не невозможно, если задержка начинает превышать 30 или 50 мс.

Однажды, однако, ISP может немного больше заботиться о задержке и предоставлять различные предложения ... но без FTTH это все еще мечта ...

jokoon
источник
1

Я считаю, что в таких играх, как «плохая компания», «Battlefeild 3» и «Сталкер», пуля - это отдельная сущность, запускаемая как «ракета». Я только думаю, что трассировка лучей необходима, если пуля мгновенно поразит цель. Когда сущность сама по себе в реалистичных пулях будет просто тикать, чтобы увидеть, ударит ли она кого-нибудь.

JAMOY
источник
0

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

Если вы хотите получить эффект рикошета, как сказал Хобо, просто играйте в любую из игр Halo. Если вы стреляете в металлическую стену из более близкого положения, вы можете увидеть пули, рикошетирующие от металла. Снайпер в нем оставляет след туда, куда попадает.

Завершенный ответ закончен, я могу вернуться позже, чтобы исправить.

Джек, проворный
источник
-5

Пули и вся физика в серии игр сталкеров использует библиотеку с открытым исходным кодом под названием «Open Dynamics Engine».

http://en.wikipedia.org/wiki/Open_Dynamics_Engine

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

Другие игры, которые используют это BloodRayne 2, Call of Juarez, World of Goo, X-Moto и OpenSimulator.

Еще одним хорошим выбором станет физическая библиотека «Пуля». http://en.wikipedia.org/wiki/Bullet_%28software%29

Он использовался в грандиозной краже авто 4, красный мертвый выкуп и многое другое.

PS Arma 2 использует внутренний движок физики, их следующая игра Arma 3 будет использовать физический движок PhysX

EddieV223
источник
3
Вводить в заблуждение список игр, которые используют ODE для целей, не имеющих отношения к пулям.
Джоккинг
4
Также вводит в заблуждение тот факт, что сталкер использует ODE для маркеров, когда на самом деле игра использует собственные проприетарные тесты на столкновение, но использует только решатель ODE.
AttackingHobo