Найти тему
Stronghold of gamedev

Как устроена разрушаемость машин в играх

Оглавление

Гонки - одно из тех направлений видеоигр, что достигли технического совершенства и двигаются отныне лишь по пути улучшения графики.

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

Тем не менее, огромное количество игр в наши дни имеет как минимум адекватную систему деформации транспортного средства и не только в безумных гоночках, но и открытых мирах.
А почему? Потому что сделать её не сложно, к тому же она имеет несколько вариантов реализации о которых я расскажу в статье.

Стекло

Начнем с наименее вариативного и самого простого из трех пунктов.
Вариаций биения оных кстати тоже всего три, две из которых можно увидеть в GTA:

  • Изменение текстуры и исчезновение. Самый простенький вариант, встречающийся в основном в стареньких играх, либо там, где над машинками особо не запаривались. Возьмем в пример GTA San Andreas
-2

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

  • ЭФФЕКТное исчезновение и декали. Наиболее распространенный, визуально адекватный и оптимизированный вариант где при нанесении урона стеклу, в конкретном месте получения урона создается декаль поверх него в виде пнг-картиночки с трещинами :
-3

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

  • Маленькие твердые тела. Вероятно один из самых очевидных вариантов : почему бы не позволить осколкам просто реалистично упасть и валяться себе там? Потому что оптимизация. Да и с визуальной частью все не так гладко.
    Во-первых в системе частиц осколки вовсе не прозрачные и не отражают света, это просто маленькие светлые кусочки. В этом же случае им бы пришлось быть такими в двух состяниях, иначе минус фпс.
    Во-вторых стекло обычно ломается вокруг точки получения урона. Такую точку легко сделать заранее, да вот вдруг игрок решит выстрелить в тысячу других? К динамическому Cell Fracture пока что медленно подступают.

Вот вариант биения с центром в левом углу :

-4

И да, таким красивым может быть пока лишь рилтайм рендер вне игры.

Всё, что висит и отваливается

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

-5

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

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

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

Тем не менее ребята из Bugbear, что сделали Wreckfest ака современный FlatOut, поступили немножко продуманней :

-6

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

Деформация кузова и вмятины

Вероятно самый интересный из пунктов, но, не смотря на это, самый легкий в реализации. Да да, всего один скрипт может решить все вопросы, но как?

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

-7

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

-8

Если же вы больше хотите узнать о принципах деформации модели движком, то советую почитать мою статью,посвященную конкретно этому:
Деформация модели внутри движка