Создание отзывчивой системы растительности в The Riftbreaker

Проработка адекватной реакции на ветер, взрывы и другие эффекты.

The Riftbreaker — это экшен-RPG с элементами выживания и строительства, в которой игроку предстоит исследовать неизвестную планету в дальних уголках нашей галактики. На планете Galatea 37 можно встретить пышные джунгли, неизвестную флору и фауну. Чтобы сделать элемент исследования ещё более интересным, разработчики внедрили интерактивную систему поведения растительности.

Комьюнити менеджер EXOR Studios Пётр Бомак опубликовал на сайте Gamasutra текст о процессе создания системы растительности в игре The Riftbreaker. Он рассказал о самых важных аспектах, которые следует учитывать, чтобы сформировать реалистичную реакцию растений на внешние факторы. Мы выбрали из текста самое интересное.

Внимание: в материале «тяжёлые» гифки, которые лучше смотреть с ПК.

Создание отзывчивой системы растительности в The Riftbreaker

Riftbreaker работает на последней версии самописного игрового движка — Schmetterling 2.0. Команда создала его во время работы над предыдущими играми — Zombie Driver и X-Morph: Defense.

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

С помощью debug commands можно посмотреть, как растительность ведёт себя в различных условиях

В игре можно встретить траву разного размера — это важно, потому что от этого зависит реакция на факторы: ветер, силу наклона и взрывную волну.

На данный момент движок позволяет использовать два вида ветра — локальный и глобальный. Локальный ветер воздействует только на объекты в определённом радиусе. Примером такой силы выступает торнадо.

Торнадо — пример погодного эффекта с локальными свойствами ветра

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

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

Если ветер слишком сильный, деревья начинают ломаться, а не гнуться

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

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

Большие взрывы сопровождаются мощными ударными волнами

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

Пример, в котором показан вектор изгибающей силы и сферы применения этого эффекта

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

  • покой — никакие силы, кроме ветра, не оказывают влияние;
  • влияние изгибающей силы;
  • восстановление — эффект изгибания больше не оказывает влияния, и растение постепенно возвращается в состояние покоя.

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

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

  • время восстановления — сколько времени потребуется, чтобы перейти из наклона в состояние покоя;
  • ослабление колебаний — с какой скоростью будет затухать сила колебания на каждом цикле;
  • количество фаз колебаний — сколько раз меш будет двигаться вперёд и назад, прежде чем вернуться в состояние покоя;
  • коэффициент наклона — «упругость», которая определяется скоростью движения растения после сгибания.

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

Также в игре есть возможность поджигать окружение — в этом помогает FlammableComponent. Каждый объект, у которого есть этот компонент, может воспламеняться. Для имитации реального огня разработчики задают определённую вероятность возгорания объекта, если в данный момент на него воздействует источник огня, например, огнемёт. Также определяется временной промежуток, в течение которого объект будет гореть.

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

Использование огнемёта может привести к неконтролируемому распространению огня по всей сцене

Как только объект объят пламенем, ему присваивается иной набор свойств — BurningComponent, благодаря которому загоревшаяся часть растительности становится источником пожара. С помощью этого компонента можно контролировать диапазон, до которого объект может распространять пламя — чем больше сам горящий объект, тем дальше огонь разойдётся. Также с помощью этого компонента контролируется скорость горения, которая определяет частоту попыток распространения огня.

Помимо BurningComponent также применяются соответствующие эффекты частиц и меш постепенно исчезает. Что примечательно — на распространение огня влияет ветер: центр сферы пламени слегка смещён в соответствии с глобальными свойствами ветра.

5858
12 комментариев

Когда деревья ломаются, а персонаж остается на месте как ни в чем не бывало - это выглядит нереалистично и странно.

6
Ответить

...а гизмо и дебаг консоль странно не выглядят, конечно. Крайне реалистичная деталь

5
Ответить

Хм, я думал, что вещи засасываются в торнадо, а выглядит так, будто наоборот.

Ответить

это не торнадо, а оданрот

8
Ответить

Выглядит шикарно. Очень надеюсь что подобное в следующем поколении станет стандартом в индустрии.

1
Ответить

Эта фраза мелькает в каждом поколении (с)

1
Ответить

Комментарий недоступен

1
Ответить