The Scouring. Разрушение зданий в RTS игре

The Scouring. Разрушение зданий в RTS игре

Здравствуйте, дорогие читатели!

Я работаю над своей RTS-игрой около 3 лет, используя свой игровой движок, и одна из вещей, о которых я бы хотел рассказать, — это то, как разрушаются здания —

Мы очень маленькая команда, поэтому у меня были некоторые важные условия для системы разрушения.

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

Эти моменты особенно важны, потому что мы рассчитываем, что сообщество будет создавать моды для нашей игры, и наше система разрушения зданий должна работать для них «out of the box».

Вот как это делается в «The Scouring».

Часть 1. Настройка.

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

The Scouring. Разрушение зданий в RTS игре

Мы используем около 100-150 кусочков для здания среднего размера, а их настройка занимает всего пару часов.

Часть 2. Обработка

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

2.1. Итак, первое, что нужно сделать, это создать пересечения кусочков-объектов с геометрией здания.

The Scouring. Разрушение зданий в RTS игре

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

2.2. Далее, мы создаем дополнительную развертку (атлас) для здания

The Scouring. Разрушение зданий в RTS игре

Существуют общедоступные библиотеки, которые могут это сделать, я использовал https://github.com/jpcy/xatlas.Для камеры RTS и такого здания атлас размером 512x512 имеет достаточную точность для альфа-отсечения (см. следующий шаг).

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

The Scouring. Разрушение зданий в RTS игре

Это самый времязатратный процесс (что относительно, потому что на моем ПК 10-летней давности весь процесс описанный в этой статье занимает 0,25 мс).

Самое важное для ускорения процесса — предположить, что все куски, которые будут отваливаться, выпуклые (и нет причин не делать этого).Проверить, находится ли данная точка внутри выпуклой трехмерной оболочки, тривиально. Есть публичная библиотека, генерирующая выпуклые оболочки — https://github.com/akuukka/quickhull

Часть 3. Во время игры

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

Нам также нужно показать «заднюю сторону» обрезанного отверстия. Мы отрисовываем “заднюю сторону”, используя проверку, обратную упомянутой выше (если кусок активен — НЕ обрезайте обратную сторону).

И, конечно же, сам кусок. Если здание находится в видимости игрока, мы создаем для него физическое тело. Если нет, то просто помещаем его в конечном положении (где-то рядом со зданием).

The Scouring. Разрушение зданий в RTS игре

Чтобы отрисовать все это, мы используем только 3 вызова:
- Само здание
- Задняя сторона отверстий
- Куски здания.
Мы помещаем всю их геометрию в один геометрический буфер и используем тот же буфер текстур в пиксельном шейдере для отсечения неактивных фрагментов через alpha-clip.

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

И последнее (но не менее важное): несколько замечаний о дополнительных эффектах.Мы разделяем здание на «сгорающую» и «статическую» части.

«Сжигаемая» часть сдвигается вниз, когда здание разрушается, и к ней применяются дополнительные шейдерные эффекты.
«Статическая» часть “растворяются” используя по-попиксельную маску alpha-clip отсечения (стандартный прием).

Спасибо за просмотр!

Добавляйте в вишлист, пробуйте Плейтест:
https://store.steampowered.com/app/3338950/The_Scouring/

Следите за новостями в ВК:

Поддерживайте на Бусти:

Если у вас будут вопросы/предложения/пожелания, пожалуйста обращайтесь [email protected]

Всего доброго и с наступающим Новым Годом!

3434
22
15 комментариев

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

4

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

2

Warcraft 3
Водяные элементали поджигают ферму?

1

Симпотично

1

О, нифига, разрабы Scouring на дтф сидят? Очень жду возможности попробовать (на плейтест заявку кинул)

1

О, а Я недавно как раз попросился в тест.

Игра хорошая, выглядит отлично. Хотя с геймлейной части оценить времени не было, попробовал скримиш, ничего не понятно, меня вынесли)
Надеюсь кампания планируется.

По поводу эффекта - выглядит занятно. Хотя как по мне часть с альфа отсечением переусложнена.
Можно сделать проще, рисуя в несколько мешей с разными материалами:
- Рисуем дыры - вывернутые меши
- Рисуем те же меши с прямым порядком, но прозрачным шейдером, который оставит след в буффере глубины, но будет прозрачным
- Рисуем строение, там, где уже нарисована дыра и продавлен след в буффере глубины, ничего нарисовано не будет.

Хотя тогда не будет таких краешков.
Естественно чтобы те же меши работали как крышечки без Z-fight, их может быть нужно чуть модифицировать - сделать со сдвигом к камере или чуть торчащими из оригинального меша.

Но очевидно уже сделано хорошо.

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

Какой поиск пути и эвристики используете?
Я немного страдаю в своих проектах похожей направленности.