Я недавно играл в такие игры, как MW2, и, как программист, я склонен спрашивать себя, как они делают игру настолько захватывающей. Например, как имитировать скорость пули.
Когда NPC выпускает пулю из своего оружия, действительно ли пуля перемещается из своего оружия в заданную цель, или они полностью игнорируют эту часть и просто делают дыру от пули в цель?
Если пуля действительно движется от орудия к цели, с какой скоростью она действительно движется?
projectile-physics
mahen23
источник
источник
Ответы:
Большинство игр FPS используют raycasting для реального игрового процесса; пули мгновенно попадают в цель и попадают в цель при выстреле.
Но в большинстве игр также используются «поддельные» трассеры. Каждые 3 выстрела или какой-то другой интервал трассер будет выпущен вместе с пулей, трассер будет действительно быстрым, но не мгновенным. Это сделано только в качестве визуального эффекта и не влияет непосредственно на игровой процесс, но помогает дать подсказки стрелку, стрелку и дает сторонним наблюдателям направленную ссылку на выстрелы.
Большинство игр, использующих эти виды физики пуль, нереалистичны, так как здесь нет рикошетов, фрагментов пули, и если есть какое-либо проникновение, то оно обычно линейно.
Некоторые игры, такие как ARMA II, STALKER (вся серия), используют более реалистичную физику пули со временем прохождения, рикошетами и проникновением с углами отклонения. Я полагаю, что эти системы используют лучевое вещание, но с пределом, который определяется скоростью пули. В этих играх скорость морды может быть реалистичной, как в ARMA II, или выглядит примерно так же, как в STALKER.
Я предпочитаю иметь реалистичную физику пули, поскольку оружие стреляет снарядами, а не лазерами.
источник
Что касается пуль, то они обычно не беспокоятся о том, что пуля действительно движется по воздуху, и просто наносят пулевое отверстие на цель в момент ее выстрела. Другие вещи, такие как ракеты, медленнее *, и игра показывает, что они летают по воздуху.
На коротких дистанциях пули будут перемещаться вместе с промежутком времени между кадрами, в любом случае они будут попадать от стрелка к цели между или в пределах 1 кадра.
* То есть медленнее, чем ракеты в реальной жизни, чтобы игрок видел, как они летят по воздуху.
источник
Я написал код маркера для PlanetSide. У нас было несколько «снайперских» снарядов, но в основном они имитировались как можно лучше, учитывая ограничения процессора и огромное количество пуль в игре в любое время.
В случае сканирования совпадений воздействие определяется в том же кадре, в котором принимается входной сигнал, часто с использованием одной лучевой передачи. Это подходит для оружия, такого как лазеры или другие чрезвычайно быстрые снаряды. Мы сделали хитскан, просто проворачивая начальную скорость снаряда настолько высоко, что он мог пересечь игровое поле за один такт.
Пули, не являющиеся хитовыми, отмечены тиканем либо по времени графического кадра, либо по фиксированному временному шагу с применением вычислений для ускорения (например, ракеты), силы тяжести, воздушного трения, наведения (например, тепловыделяющих снарядов) и т. Д. Цель состоит в том, чтобы создать конечную позицию снаряда для временного шага. Как только начальная и конечная точки установлены, один или несколько лучей могут быть наложены, чтобы приблизиться к траектории полета и обнаружить любые столкновения, которые произошли бы во время полета.
Как при попадании в снаряд, так и при ударе не происходит, что происходит при столкновении, зависит от ваших свойств снаряда и поверхности, на которую вы воздействуете. Например, вы можете ударить по твердой поверхности, и в этом случае вы можете проверить количество отскоков и либо отрегулировать положение и скорость в зависимости от отражения, либо взорвать снаряд, если вы достигли максимального значения отказов. В этой системе ракета имеет максимальный счетчик отказов 0. Вы можете поразить мягкую поверхность и затем проверить свою проникающую способность, чтобы определить, должен ли снаряд продолжаться через материал и т. Д.
Это был забавный код для написания. Кроме того, очень полезно написать хорошую отладочную визуализацию того, что происходит, чтобы вы могли визуально просматривать траектории полета, события и т. Д.
источник
Это зависит от игры и уровня точности / реалистичности.
Синхронизация моделей стрельбы и урона в многопользовательских настройках довольно сложна, поскольку вам необходимо точно определить, где и когда именно была выпущена пуля, попала ли она в цель и прошло ли что-нибудь еще по пути.
Поэтому я подозреваю, что когда это возможно, игровые дизайнеры упрощают ситуацию, рассматривая некоторые кадры как мгновенные (так что вам нужно учитывать местоположение каждого в один момент времени), или ограничивая дальность пули. К счастью, это часто соответствует реальной физике. Например, снайперские винтовки стреляют высокоскоростными снарядами.
Многие игры могут имитировать многоступенчатый путь из нескольких снимков медленно движущегося объекта (например, артиллерии, бомб, маркеров и т. Д.), Но это очень дорого, и проблемы с синхронизацией встречаются чаще, что приводит к забавным видео на YouTube.
Другая проблема связана с играми, которые поддерживают отдельные меньшие «среды» (например, каждая комната моделируется отдельно), чтобы создать иллюзию большего пространства. В этих случаях вещи в границах "комнаты" могут быть смоделированы правильно, так что каждый в комнате будет информирован о серии переходов в пространстве, которые совершает пуля, а другие вне этой среды - нет.
источник
Для снарядов, которые движутся быстрее, чем видит глаз, часто используется лучевая передача - луч от дульного среза вычисляется в соответствующем направлении и проверяется на предмет потенциальных объектов-мишеней для определения попадания. Это может быть сложно с несколькими лучами и дополнительными вычислениями, если вы хотите смоделировать такие вещи, как падение пули и тому подобное. Вы также можете придать проектам скорость и использовать ее для добавления дополнительного реализма в вычисления (чтобы маркеры не были мгновенными).
источник
Это зависит от реализации, но я знаю, что движок Source вообще не использовал физические пули (объекты-снаряды), они просто делали лучи от игрока к цели со случайным кругом «зоны попадания» (большие или меньшие радиусы зависели от скорость, с которой оружие стреляло, и если игрок держал кнопку огня вниз), центр которого был точкой, на которую нацеливался игрок, то после определения действительного луча, наложенного игроком на случайно определенную точку, и в зависимости от других факторов (таких как «вес» пули и скорость морды (все внутренние числа), попадание объекта и т. д.) луч отбрасывался через несколько объектов или до тех пор, пока не достиг места.
С другой стороны, в Torque 3D Engine DID используются реальные снаряды, и дизайнер может повлиять на их индивидуальные модификаторы скорости, массы и силы тяжести. Все, что делал двигатель - обновлял значения каждые 32 миллисекунды.
РЕДАКТИРОВАТЬ
В дополнение к использованию объектов-снарядов, Torque 3D Engine также позволил использовать лучи в качестве альтернативы. (Я сделал несколько игр, в которых «снаряд» на самом деле является эффектом частиц, который не имеет поддержки, оказываемой объектами снаряда, поэтому требовалось применение лучей.)
источник
В вики Team Fortress 2 есть довольно классная статья о поведении их снарядов и оружия для сканирования ударов.
http://wiki.teamfortress.com/wiki/Mechanics#Hit_detection
источник
На самом деле во многих играх используется алгоритм проверки попадания в gpu. Вот основной способ, которым это работает:
1) Вне экрана создайте рендеринг текущего вида, где вся местность черная, а каждый символ не черного цвета. 2) Получите цвет пикселя под перекрестием. 3) Если это не черный поиск, то цвет > отображение игрока и нанесение удара по этой цели.
Этот метод использовался годами в играх, в основном потому, что он идеально подходит для пикселей. Если из-за стены торчит один пиксель шляпы игрока, вы можете ударить его. То есть, если вы видите это, вы можете поразить это. Этот тип точности практически невозможен при использовании простых методов литья лучей. А во-вторых, этот вид теста очень быстрый и может быть выполнен на графическом процессоре.
источник
Несомненно, некоторые игры используют реалистичную физику пуль, принимая во внимание время прохождения пули и падение, но я предполагаю, что большинство игр не используют, по крайней мере для NPC.
Для игры, которая совершает прямое перемещение пули (без падения), это мгновенно, игра прослеживает воображаемую линию (вектор) от точки ствола вперед. Затем он вычисляет, с чем пересекается эта линия, и регистрирует «попадание» пули в этот момент. Это может быть твердый объект, такой как стена, где удар вызывает такой эффект, как наклейка о попадании пули и «дым» / обломки. Это может повлиять на хрупкий объект, что приведет к его поломке, или это может повлиять на физический объект и дать ему «удар». Или, конечно, это может ударить игрока или другого NPC и нанести урон здоровью. Моделирование жесткого ядра будет моделировать проникновение пули через стены и вызывать эффект попадания со стороны выхода, вероятно уменьшая урон пули при выходе.
Просто так, что у NPC нет идеальной цели, многие игры добавляют некоторую рандомизацию к вектору для моделирования распространения пуль. Это то, что вы увидите в реальной жизни, когда пули попадают не только туда, куда вы стремитесь, но и по схеме, сосредоточенной вокруг точки прицеливания.
Чтобы визуализировать распространение пули, представьте конус, выходящий из пистолета вместо прямой линии (вектор). Фактическое направление пули рандомизировано и находится где-то внутри этого конуса. Если стрелок действительно близко к цели, разброс невелик, а точность высокая. Если цель находится далеко, конус добавляет больший разброс, поэтому у стрелка меньше шансов поразить цель.
Эта идея конуса выстрела может быть использована для моделирования точности стрелка (навыка), точности оружия и других условий. Например, NPC низкого уровня может получить выстрел с низкой точностью, в то время как NPC с высокой квалификацией будет иметь точность высокого уровня. Игрок, бегущий из пистолета-пулемета, стреляющего из бедра, будет иметь широкий конус выстрела, который уменьшится, если он остановится или прицелится. Снайперские винтовки будут иметь более плотные выстрелы, чем пистолет.
источник
Говоря об исходном коде Nexuiz с того времени, как я посмотрел, на самом деле они не посылали объект «пули» из точки А в точку Б. Если я правильно помню, это относится только к некоторым видам оружия - другие виды оружия отсутствуют ». t Мгновенное оружие, когда оно выстреливает, код смотрит на то, куда направлен ваш пистолет. Если он нацелен на человека (и является оружием мгновенного попадания), когда вы нажимаете «огонь», вы наносите удар.
Также примечательно то, как у Nexuiz была серверная опция для вычисления попаданий на клиенте или на сервере. Если вы подозреваете, что клиенты обманывают, вы можете переключиться на подсчеты попаданий на стороне сервера, чтобы помочь смягчить это.
источник
Другая стратегия - гибрид рендеринга всего и трассировки лучей. Вам не обязательно рендерить каждую пулю. Например, если ваша пушка стреляет со скоростью 30 выстрелов в секунду, стрельба может генерировать несколько сотен частиц ... вы можете уменьшить рендеринг, используя «эффект трассировки», рендеринг каждого 3-го выстрела, трассировка лучей двух других. Игрок все еще видит 10 выстрелов в секунду по врагу.
Твик для вашей конкретной ситуации, рендеринг больше для более низкой скорости стрельбы, меньше для более высокой.
источник
Не забывайте, что частота кадров в зависимости от скорости пули может быть проблемой, в некоторых случаях, если вы недостаточно хорошо закодировали свой физический движок, пуля может просто пройти сквозь объект, не задев его. В этом отношении есть решение, которое я не очень хорошо помню ...
В любом случае, я думаю, что может быть очень проблематично компенсировать реалистичные пули в многопользовательской среде, если не невозможно, если задержка начинает превышать 30 или 50 мс.
Однажды, однако, ISP может немного больше заботиться о задержке и предоставлять различные предложения ... но без FTTH это все еще мечта ...
источник
Я считаю, что в таких играх, как «плохая компания», «Battlefeild 3» и «Сталкер», пуля - это отдельная сущность, запускаемая как «ракета». Я только думаю, что трассировка лучей необходима, если пуля мгновенно поразит цель. Когда сущность сама по себе в реалистичных пулях будет просто тикать, чтобы увидеть, ударит ли она кого-нибудь.
источник
На самом деле, если вы посмотрите на видеоповторы в Call of Duty, вы можете легко увидеть оранжевые двуногие, летящие по воздуху к намеченной цели, и атакующий гобол действительно имеет правильный ответ на него по большей части.
Если вы хотите получить эффект рикошета, как сказал Хобо, просто играйте в любую из игр Halo. Если вы стреляете в металлическую стену из более близкого положения, вы можете увидеть пули, рикошетирующие от металла. Снайпер в нем оставляет след туда, куда попадает.
Завершенный ответ закончен, я могу вернуться позже, чтобы исправить.
источник
Пули и вся физика в серии игр сталкеров использует библиотеку с открытым исходным кодом под названием «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
источник