Что такое баллистика в играх
Вычисляем баллистические траектории в играх
При разработке видеоигр часто встречается задача вычисления угла выстрела для попадания в цель. Она настолько распространена, что я писал код для её решения в буквальном смысле для каждой игры, над которой работал.
Когда возникала эта проблема, я обычно брал ручку с блокнотом и решал её с нуля. Мне это надоело. Чтобы сэкономить себе из будущего немного времени, я выложу это решение в Интернет. Кроме того, я расскажу о необычной «фишке», которую предпочитаю использовать из соображений эстетики.
Уравнения движения
Существует четыре основных уравнения движения. В статье мы воспользуемся только одним.
Если объяснять на словах, то конечная позиция РАВНА исходной позиции ПЛЮС скорость, умноженная на время ПЛЮС половина ускорения, умноженная на время в квадрате. Это простое уравнение, для его решения необходимо немного алгебры и несколько тригонометрических тождеств.
Освежим знания
Прежде чем начать, давайте вкратце освежим память.
Мы используем алгебру.
Мы часто будем пользоваться формулой корней квадратного уравнения.
Дальность
При разработке видеоигр нам, вероятно, нужно будет знать максимальную дальность полёта снаряда. Искусственный интеллект должен понимать, насколько близко нужно подойти, а игрокам нужны чёткие наглядные индикаторы опасных зон.
Существует очень простое уравнение максимальной дальности на плоской поверхности. Мы сразу же ринемся в омут с головой и начнём с обобщённого вида.
Для тестирования и визуализации я создал демо на Unity. В нём используются чайники, стреляющие чайниками. Пиф-паф!
В демо есть несколько ползунков. В видео показан индикатор дальности стрельбы нашего чайника-турели. При увеличении скорости увеличивается дальность. При снижении гравитации дальность тоже растёт. Всё довольно просто.
Угол стрельбы для попадания по неподвижной мишени
Теперь начинается интересное.
Бах. Теперь у нас есть два уравнения и два неизвестных. Давайте их проанализируем.
Визуальное несовершенство
Однако при увеличении дальности всё становится не таким красивым. Низкая дуга почти плоская. Высокая дуга чрезмерно высока. В этом и заключается проблема снаряда с постоянной скоростью. Он выглядит красиво, только когда цель находится на границах его радиуса дальности.
Существует ли способ получше?
Скорость горизонтального перемещения
Я часто предпочитаю задавать горизонтальную скорость снаряда, только в плоскости земли. Тогда я могу явным образом задать высоту дуги. То есть переменной становится скорость и гравитация.
Такой подход имеет множество преимуществ. Во-первых, он всегда выглядит красиво!
Во-вторых, его дизайн более интуитивен. Дизайнеров не волнует абсолютная скорость. Им важно, что турель имеет дальность 20 метров и что для перемещения на это расстояние снарядам требуется 1 секунда. Они не обязаны пользоваться строящим графики калькулятором, чтобы менять значения баланса. А художественные изменения не должны влиять на геймплейные механики.
В-третьих, так проще попадать по движущейся мишени. Чуть позже я раскрою это подробнее.
Вот как это выглядит:
Вычисление скорости горизонтального перемещения
Пункты (3) и (4) — это ещё два уравнения с двумя неизвестными. Я ленивый и не хочу их записывать. Плюс я запутаюсь и перепутаю знак, поэтому позволю компьютеру решить их за меня.
Точнее, я воспользовался Wolfram Alpha. Рекомендую каждому иметь Wolfram в своём инструментарии, он довольно полезен.
Скорость горизонтального перемещения при подвижной мишени
Итак, у нас есть два разных вычисления траектории. Однако враги обычно не стоят на месте, они перемещаются. Нам нужно вычислять траекторию, чтобы поражать подвижную мишень.
Именно здесь проявляются все достоинства скорости горизонтального перемещения. Задав скорость в плоскости земли, очень просто выполнить вычисления для подвижной мишени.
Меня это очень радует. Пиу-пиу-пиу!
Постоянная скорость с подвижной мишенью
А что если нам нужно поразить подвижную мишень снарядом с постоянной скоростью? Ой-ёй. Это очень запутанная задача! Даже не знаю, как к ней подступиться.
В процессе написания этого поста я нашёл решение задачи снаряда с постоянной скоростью и движущейся мишени, которого не было в Интернете в готовом виде. Стоит заметить, что вам, вероятно, не понадобится реализовывать его в своей игре. Но я потратил на него много времени, поэтому не хочу, чтобы оно было потеряно впустую!
Уравнения четвёртой степени
Скорее всего, вы не захотите использовать его в своей игре именно из-за уравнений четвёртой степени. По сути, для решения требуется одно из таких уравнений.
Квадратные уравнения имеют простое и изящное решение в виде формулы корней квадратного уравнения. Кубические уравнения решаемы несколькими разными способами. Однако уравнения четвёртой степени — это настоящая головная боль.
Решение таких уравнений находится далеко за рамками этой статьи. Честно говоря, и за пределами моих математических способностей. К счастью для нас, в книге 1990 года Graphics Gems I есть код для решения уравнений четвёртого порядка. Я использовал этот код для своего демо. Не могу гарантировать его точности и численной устойчивости, используйте его крайне осмотрительно.
Способ первый
Итак, давайте его решим. Каким должен быть угол выстрела снарядом с постоянной скоростью по движущейся мишени? Этот способ взят из поста 2007 года Джеймса Макнейлла и дополнен информацией Райана Джакетта.
Способ второй
Прежде чем я нашёл первый способ, я вывел решение другим способом. Оно состоит из гораздо большего количества шагов. Однако я нахожу конечный результат более изящным. Плюс я потратил примерно восемь листов бумаги и не хочу, чтобы эти деревья пожертвовали собой зазря.
Чёрт возьми. 32 шага!? Это хуже, чем кажется.
1–7 — объявляем переменные.
8–11 — объявляем систему уравнений. Четыре уравнения, четыре неизвестных — d, e, f, t.
12–15 — вычисляем по (8) величину d. Перемножаем d^2 на будущее.
16–19 — вычисляем по (10) величину f. Перемножаем f^2 на будущее.
20–24 — вычисляем по (9) величину e. Перемножаем e^2 на будущее.
25–27 — вычисляем по (11) величину e^2. Подставляем d^2 и f^2.
28–30 — приравниваем (27) к (24). Умножаем на t^2 и преобразуем в уравнение четвёртой степени.
31 — подставляем коэффициенты в SolveQuartic.
32 — подставляем положительные вещественные корни в (14), (18), (23) для d, e, f.
Код довольно короткий. Объявлению переменных отведено больше строк, чем самим вычислениям! Разумеется, кроме SolveQuartic.
Предупреждение
Код, написанный для этого теста, не проверен в бою, а пост никем не рецензировался. Вероятно, в нём есть несколько опечаток, ошибок и неучтённых пограничных случаев. Если найдёте подобные ошибки, пожалуйста, сообщите мне. Втайне, чтобы никто не узнал о моём позоре.
Рассматривайте этот код не как готовое решение, а как опорную точку.
Инструменты
При создании этого поста я использовал несколько инструментов. Многие из них были для меня новыми.
Заключение
Вот и всё. Я потратил на этот пост гораздо больше времени, чем ожидал. Я решил задачу, которую никогда не решал прежде и изучил несколько новых инструментов. И это того стоило.
В этом посте нет ничего нового или оригинального. Я пытался объяснять подробно, но чтобы не быть при этом слишком многословным. Мне очень нравится, что теперь полные описания можно найти в одном месте. Надеюсь, они окажутся полезными для людей.
Как пули работают в видеоиграх
Обычно игры бывают жестокими ни по какой-то одной причине, а в случае с шутерами это связано с созданием чувства остроты. Однако для этого существует множество систем позволяющих создавать симуляции. Обратимся к Counter-Strike, оригинальной части серии, и к Golden Eye 007, по нынешним стандартам, они слегка примитивные. Тогда в играх использовалась геометрия для обсчёта всех объектов (персонажи, декорации, стены). Таким образом математические вычисления могут быть использованы в качестве того, произойдёт ли соприкосновение объектов.
В большинстве более старых игр, а также и в некоторых новых, где реалистичность не так важна, используется метод называемый — Hitscan. Это своего рода версия рей-кастинга, для разработки игр, или дословно «метода бросания лучей». Это термин из математики и рендеринга, где проецируется линия, которая может тянутся бесконечно. Но если луч упирается во что-то, или если он программно может упереться во что-то, то он возвращает значение, оно показывает куда попала бы пуля.
Как пули работают в видеоиграх
Лучи несут в себе определённые ограничения. От выстрела нельзя увернуться. Если точно навестить и нажать на спусковой крючок, то этим всё и закончится. Времени между нажатием кнопки и попаданием, просто не существует. Также погодные условия не могут на это повлиять. Это переключатель где вы можете попасть или промахнуться, не существует никаких других факторов. Не стоит забывать, что шутеры от первого лица, несмотря на то, что они всегда были на передовой игровой индустрии, были немного проще. Но даже если вы сегодня сделаете игру, в которой будет такой способ перемещения пуль, то это может не иметь значения, если игра окажется хорошей.
Как пули работают в видеоиграх
Так что, развитие баллистики в играх можно прекратить? Ни в коем случае. Чтобы другие условия в игре начали играть свою роль, это понадобится если нужно сделать хардкорный шутер, вам потребуется пуля работающая не как переключатель, а как фейдер. Должна существовать некая серая зона, где вы можете избежать попадания этой пули. Возможно чудесным образом другой игрок встанет между вами и пулей, пока та летит от ружья к вам, или погода будет очень ветреная, или же из ружья так часто стреляли, что она потеряла точность при стрельбе. Поэтому здесь должно быть задействовано больше систем, чем просто проецирование луча в точку попадания и выведения результата. Чтобы это реализовать разработчики начали использовать фактические снаряды, имеется ввиду система в которой пуля действительно существует, по крайней мере в виртуальной среде.
Таким образом у пули появляется своя геометрия, она ведёт себя как объект в мире и на неё влияют все остальные системы в игре, как и на любой другой объект. Конечно же предыдущий метод рей-кастинг, может также использоваться, когда сама пуля проецирует луч, который возвращает значение для каждого отдельного кадра, что создаёт новую точку соприкосновения для каждого кадра. Также расчёты точки соприкосновения могут происходить с помощью мультисемплинга или интерполяции, как это используется во многих других системах или даже в графических программах.
Пока ваша пуля перемещается от кадра к кадру, для неё определяется каждый последующий кадр, а в промежутке между двумя кадрами высчитывается наличие столкновения. Собственно столкновение может произойти или не произойти. Если его не будет, то вычисление кадра за кадром продолжится, пока пуля не остановится. Однако на пулю могут воздействовать другие эффекты, помимо возможности столкновения. Допустим в игре есть ветер, который может слегка сместить пулю в полёте. Если так и есть, то реалистичность значительно поднимается. В такой ситуации вам приходится самостоятельно компенсировать это влияние.
Это было невозможно, когда рей-кастинг был исключительным методом расчёта попадания пули. Однако в системе, которая постоянно обновляется, по мере продвижения пули каждую долю секунды, можно делать и другие расчёты. Например, если ваши снаряды будут не пулями, а краской. Невозможно сделать игры Splatoon, где боеприпасы не являются жидкостью. В ней нет ничего похожего на поведение пули. Эту игру не смогли бы сделать 20 лет назад, даже несмотря на то, что шутеры от первого лица в тот момент уже жили собственной жизнью.
Как пули работают в видеоиграх
Тогда просто быть шутером, просто быть трёхмерной игрой, в которой есть подобное соперничество и всё это правда работает, уже одно это очень впечатляло. Но теперь когда вы знаете как работает баллистика в играх и какой путь она прошла, вы можете догадываться, какой она может стать в будущем. Многие игры станут куда более реалистичными, когда новые расчёты для пуль будут применяться в каждой игре. А большая реалистичность означает большую сложность. В шутерах завтрашнего дня, нам придётся учитывать значительно больше в процессе прохождения игры. Но в то же время не перестанут выходить игры, работающее по старой схеме отслеживания лучей, потому что честно говоря, иногда в старые игры играть веселей чем в новые.
Пули в видеоиграх: принцип работы и различные механики
«Как правильно стрелять?» — вопрос, нередко задаваемый геймерами, а «как оно вообще стреляется и как это всё происходит?» — вопрос иного характера. Действительно ли производятся в игре какие-то физические расчёты, между тем, как пуля достигает точку Б из точки А? Правда ли, что это просто статическая линия, моментально достигающая своей точки назначения или она существует в игровом пространстве как объект со своей скоростью и траекторией? Лично я считаю эту тему довольно интересной и именно поэтому мы с вами об этом и поговорим. Приветствую всех Стопгеймогородцев и гостей сайта SG!
Поехали!
Многих из нас сильно тянет к видеоиграм, а особенно к шутерам, поскольку разработчик позволяет нам пережить те ситуации, в которых мы вряд ли могли бы оказаться в реальности, например, побывать в шкуре гонщика формулы или военного, но об этом, возможно, в одном из следующих блогов. Боевые действия в реальности, к слову, очень сильно отличаются от игровой действительности. Как например, боевые действия могут проходить днями, неделями, а то и месяцами, без единого выстрела, но нам ведь нужен экшОн, правда? Поэтому разработчики и предоставляют нам симуляции таких обстановок, в которых игроку нужно чуть ли не каждую секунду держать ухо востро и отстреливаться от врагов.
Технология «бросания луча» (Ray Casting) или Hitscan
Если сравнить старые игры, примерно 10-ти летней давности и новые, то можно не особо раздумывая догадаться, что механика работы пуль и снарядов значительно поменялась за более чем два десятка лет, однако есть новые игры, использующие старую, примитивную и более привычную для огромного количества игроков технологию полёта пуль. Так давайте же её рассмотрим! Для этого, мы обратимся к первой КС. Все же точно знают о таких играх как Doom и Quake. А знали ли вы, что всемирно известный Counter-Strike когда-то был лишь фанатской модификацией для Quake? Так вот, там использовалась аналогичная механика полёта пули, да и в целом физика. Поменялось с того времени всё, включая и игровую физику и вышеупомянутый полёт пули, но эта технология была лишь немного доработана, но основа осталась той же, что и в первой версии Counter-Strike.
Впервые, в 3D-шутерах, она представляла из себя невидимый «луч», моментально долетающий до точки назначения. Был лишь один критерий: попал ты или нет. Именно это и называется Hitscan(хитскан), который использовался почти во всех старых шутерах, но и новые игры — не исключение. То есть моделируется линия, которая может иметь неограниченную длину, но если эта «линия» столкнётся с каим-либо объектом (даже тем же коллайдером (в простонародье — это невидимое препятствие, обозначающее границы карты) ), то сигнал сразу пойдёт обратно и мы увидим то самое пулевое отверстие в стене или на каком-либо объекте, каковым может оказаться и чья-то голова (главное, чтобы она не принадлежала нашему союзнику). Именно так эта система и работает в старых и некоторых новых шутерах от 1-го и 3-го лица. У хитскана есть некоторые условности, как например — вы не можете увернуться от летающей в вас пули, так как она по-сути не имеет скорости и места в пространстве, соответственно, она моментально долетает до вас. Даже условия окружения никак не влияют на происходящее, например, ветер или вода, проходя сквозь которую, пуля не меняет свою траекторию и скорость.
Прожектайл и немного о разбросе
Пуля/снаряд, как полноценный физический объект
Как работают пули в видеоиграх?
Hitscan
Hitscan по своей природе прост, но для добавления другой логики можно внести множество различных модификаций:
Overwatch. Способность персонажа Гэндзи deflect — пример отражающей поверхности.
Overwatch, Call of Duty, Wolfenstein 3D
Так почему же такой подход не используется во всех играх?
Во-первых, как вы наверно заметили, лучи имеют бесконечно высокую скорость перемещения, то есть мгновенно попадают в конечную точку. Между выстрелом пулей и попаданием в объект нет времени движения пули. Это значит, что если луч попал в объект, от пули уклониться невозможно, даже если цель находится в нескольких километрах от игрока.
Halo. Заметьте, что дульная вспышка и эффекты попадания по земле происходят одновременно.
Во-вторых, в большинстве реализаций hitscan используются прямые лучи. Это значит, что сложно учесть ветер, гравитацию и другие внешние факторы, которые могут влиять на пулю после вылетания из ствола. Программисты могут добавлять всякие хитрости, чтобы луч имитировал настоящие пули, но как только игрок «выстрелил» лучом, нет никакой возможности изменить его путь посередине.
Во многих «казуальных» играх всё равно используется hitscan, потому что он упрощает кривую обучения для большинства игроков-новичков. Но как насчёт игр, стремящихся передать «реальные» ощущения от стрельбы? При таких ограничениях этого добиться невозможно, поэтому необходим другой метод.
Баллистика летящего предмета
Max Payne 3
Преимущества баллистики в полной мере проявляются в играх, в которых реализм имеет наивысший приоритет. Так как каждый летящий объект существует сам по себе, мы можем учесть влияние на него ветра, трения, гравитации, температуры — любой силы, которая должна действовать на пулю. Теперь, когда мы способны менять физику, игрокам можно пользоваться более разнообразным вооружением, а не только простыми пистолетами и лазерами; мы можем добавить в свой арсенал гранаты и ракеты.
Так как пули в такой системе не движутся со скоростью света, можно также реализовать и временны́е свойства:
Superhot, Battlefield 1, Overwatch
Существует множество обходных путей для максимального повышения производительности. Например, движок может хранить пул объектов, загруженных до начала игры и «включать» их по мере необходимости. После попадания в поверхность можно воспроизвести анимацию баллистики и отключить пулю, сохранив её на будущее. Этот способ позволяет экономить вычислительные ресурсы и память, занимаемые многократным созданием и уничтожением объектов.
Также существует множество способов выполнения вычислений, но на высоком уровне разница заключается в том, где они решают обрабатывать «такт» игры — единицу измерения времени:
Всё это кажется сложным, поэтому многие люди думают, что это относительно новый метод; однако на самом деле он возник раньше, чем hitscan! До игр жанра FPS существовало множество шутеров с видом сверху, например Asteroids, Space Invaders или Galaxian. Это аркадные игры 70-х годов, в которых уже была реализована баллистика снарядов, хотя и довольно примитивно.
Asteroids. Снаряды довольно сложно увидеть, но они есть!
Но даже со всеми этими функциями мы не может воссоздать реалистичную модель реального мира. Можно ли как-то воспользоваться преимуществами обоих методов?
Гибридные системы
Halo. В Assault Rifle используется hitscan; в Needler используется баллистика снарядов
Разработчики также могут смешивать обе техники, чтобы закрывать слабые места каждой из систем и обеспечивать более реалистичное поведение. Например, для устранения проблемы прохождения объектов сквозь друг друга каждая пуля в каждом такте движка может испускать луч. Это позволяет движку увидеть, пересекутся ли какие-то из лучей между тактами, сталкиваясь в воздухе.
Также их можно объединять для улучшения особенностей игры. Отличным примером подобного является серия Sniper Elite; после нажатия на спусковой крючок движок использует hitscan, чтобы определить, сделан ли выстрел достаточно близко к любому обнаруживаемому объекту для включения slow motion. Если да, то выстрел пулей производится с расчётом баллистики в режиме «буллет-тайм».
Sniper Elite
Итак, мы рассмотрели основы поведения пуль в видеоиграх! Интересно, что улучшения в этой области в основном заключаются в небольших оптимизациях и усовершенствованиях, а не в масштабной переработке. После выпуска нескольких первых революционных игр мы не сделали никаких значительных шагов и прорывов.
Что же дальше? Как будет развиваться эта область в дальнейшем?
Я не думаю, что в ближайшее время гибридный подход исчезнет, ведь он обеспечивает дополнительные преимущества. Но я прогнозирую, что со стороны баллистики снарядов произойдёт множество улучшений. Частота вычисления тактов продолжает увеличиваться (ведь мощь ЦП растёт), и мы сможем приблизиться к асимптотическому пределу симуляции пули «реального мира».
Escape from Tarkov Wiki
Баллистика
Все данные, представленные ниже, являются работой NoFoodAfterMidnight. Эта страница имеет предназначение облегчить изучение игры новичками в первую очередь.
Содержание
Баллистика полёта [ ]
Полёт пуль реалистично моделируется в Escape from Tarkov. Пули имеют скорость, подвержены воздействию силы тяжести и воздушного трения и могут проникать или рикошетить при попадании в предметы, а также фрагментироваться при этом. Конкретная характеристика баллистики пули определяется типом боеприпасов, а вероятность попадания пули или рикошетирования определяется её материалом и типом пули. С увеличением расстояния, пули также теряют как урон, так и силу проникновения, так как они теряют скорость из-за трения воздуха на большие расстояния.
Раневая баллистика [ ]
Броня и проникновение пуль [ ]
Бронежилеты обеспечивают защиту всех частей тела, даже если это не выглядит так, как будто они их охватывают. Вы можете увидеть, какие части тела защищены, в описании каждого бронежилета.
Когда пуля попадает в бронированную часть тела, она либо полностью останавливается, либо пуля проникает в броню и наносит урон игроку. Если пуля остановлена броней, % урона от пули наносится этой части тела, % зависит от брони. Вероятность проникновения зависит от уровня бронежилета и % прочности бронежилета, а также от уровня проникновения пули. В большинстве сценариев пули либо не имеют возможности пробить броню, либо пробивают её почти при каждом попадании. Это означает, что выбор боеприпасов с самым высоким проникновением чрезвычайно важен для работы с тяжело бронированными игроками.
В то время как угол удара не влияет на бронежилет, пули могут рикошетить от шлема в зависимости от угла выстрела и используемого шлема.
Таблица характеристики пуль [ ]
Обозначения [ ]
Уровень эффективности | Среднее кол-во останавливаемых пуль | Объяснение | |
---|---|---|---|
0 | Бесполезно | 20+ | Не может пробить и нанести хоть какой-то урон игроку |
1 | Это возможно, но. | от 13 до 20 | Теоретически это возможно, но пробитие начинается с очень низкой вероятности и едва увеличивается |
2 | Мечтать не вредно | от 9 до 13 | Имеет очень низкий или нулевой шанс проникновения изначально и очень медленно увеличивается шанс проникновения пули |
3 | Немного эффективно | от 5 до 9 | Имеет низкий шанс проникновения изначально и медленно увеличивается шанс проникновения, либо быстро повреждает броню, пока пуля не пробьёт бронежилет |
4 | Эффективно | от 3 до 5 | Начинается с низким шансом проникновения, но быстро увеличивается |
5 | Очень эффективно | от 1 до 3 | Пробивает большая часть выстреленных пуль, часто быстро достигая> 90% |
6 | Броня игнорируется | 80% пуль |
*Сейчас есть ошибка, что если Проникающая способность ниже 20, то фрагментация не происходит, какой бы шанс не был указан
***Этот тип имеет радиус поражения, как и у гранаты, также с типом урона «Осколочная граната»