The Scouring. Разрушение зданий в RTS игре
Здравствуйте, дорогие читатели!
Я работаю над своей RTS-игрой около 3 лет, используя свой игровой движок, и одна из вещей, о которых я бы хотел рассказать, — это то, как разрушаются здания —
Мы очень маленькая команда, поэтому у меня были некоторые важные условия для системы разрушения.
- Настройка должна быть очень легкой и быстрой, потому что у нас нет времени и ресурсов, например, для разрезания зданий на подобъекты и их последующей анимации.
- Система должна работать стабильно и надежно, потому что я не могу заниматься исправлением ошибок связанных с непредвиденной конфигурацией геометрии.
- Разрушения должны выглядеть круто и выделять мою игру среди десятков других игр RTS.
Эти моменты особенно важны, потому что мы рассчитываем, что сообщество будет создавать моды для нашей игры, и наше система разрушения зданий должна работать для них «out of the box».
Вот как это делается в «The Scouring».
Часть 1. Настройка.
Все, что нужно сделать художнику, — это прикрепить геометрические кусочки к частям здания, которые должны впоследствии отваливаться, вот так:
Мы используем около 100-150 кусочков для здания среднего размера, а их настройка занимает всего пару часов.
Часть 2. Обработка
Большинство систем разрушения используют геометрические пересечения (булевы операции) для разбиения геометрии на части. Однако это очень медленный и сложный процесс, который обычно требует построения геометрии определенным, «правильным» способом. Вместо этого мы используем альфа-отсечение, чтобы разбить геометрию на части.
2.1. Итак, первое, что нужно сделать, это создать пересечения кусочков-объектов с геометрией здания.
Это части здания, которые отвалятся от здания в процессе разрушения.Мы также генерируем «заднюю сторону» для отверстий которые создаются от в процессе разрушения. Возможно, это самая хитрая часть всего процесса, но я не хотел бы вдаваться в подробности, поскольку это очень техническая часть. Свяжитесь со мной, если вам нужна более подробная информация.
2.2. Далее, мы создаем дополнительную развертку (атлас) для здания
Существуют общедоступные библиотеки, которые могут это сделать, я использовал https://github.com/jpcy/xatlas.Для камеры RTS и такого здания атлас размером 512x512 имеет достаточную точность для альфа-отсечения (см. следующий шаг).
2.3. Перебираем каждый пиксель в атласе и помечаем его идентификатором фрагмента (части здания которая отваливается), когда соответствующая трехмерная позиция на поверхности здания находится внутри этой части.
Это самый времязатратный процесс (что относительно, потому что на моем ПК 10-летней давности весь процесс описанный в этой статье занимает 0,25 мс).
Самое важное для ускорения процесса — предположить, что все куски, которые будут отваливаться, выпуклые (и нет причин не делать этого).Проверить, находится ли данная точка внутри выпуклой трехмерной оболочки, тривиально. Есть публичная библиотека, генерирующая выпуклые оболочки — https://github.com/akuukka/quickhull
Часть 3. Во время игры
Когда юнит атакует здание, мы определяем кусок здания, ближайший к месту попадания, и отмечаем его как активный. Для каждого здания мы создаем буфер текстур размером «n кусков», в котором хранится логическое значение, определяющее, активен соответствующий кусок или нет.В пиксельном шейдере мы читаем атлас, хранящий идентификаторы фрагментов, и делаем alpha-clip, если этот фрагмент активен.
Нам также нужно показать «заднюю сторону» обрезанного отверстия. Мы отрисовываем “заднюю сторону”, используя проверку, обратную упомянутой выше (если кусок активен — НЕ обрезайте обратную сторону).
И, конечно же, сам кусок. Если здание находится в видимости игрока, мы создаем для него физическое тело. Если нет, то просто помещаем его в конечном положении (где-то рядом со зданием).
Чтобы отрисовать все это, мы используем только 3 вызова:
- Само здание
- Задняя сторона отверстий
- Куски здания.
Мы помещаем всю их геометрию в один геометрический буфер и используем тот же буфер текстур в пиксельном шейдере для отсечения неактивных фрагментов через alpha-clip.
Когда здание ремонтируется, вместо того, чтобы активировать куски здания, мы их деактивируем. Таким образом получается эффект, обратный разрушению здания.
И последнее (но не менее важное): несколько замечаний о дополнительных эффектах.Мы разделяем здание на «сгорающую» и «статическую» части.
«Сжигаемая» часть сдвигается вниз, когда здание разрушается, и к ней применяются дополнительные шейдерные эффекты.
«Статическая» часть “растворяются” используя по-попиксельную маску alpha-clip отсечения (стандартный прием).
Спасибо за просмотр!
Добавляйте в вишлист, пробуйте Плейтест:
https://store.steampowered.com/app/3338950/The_Scouring/
Следите за новостями в ВК:
Поддерживайте на Бусти:
Если у вас будут вопросы/предложения/пожелания, пожалуйста обращайтесь pavzag@gmail.com
Всего доброго и с наступающим Новым Годом!