Процедурная генерация простого Леса в Unreal Engine 5.7

Создание природного окружения - сложный и трудоемкий процесс, тем не менее современные инструменты способны упростить задачу.
Ниже размещен небольшой гайд по процедурной генерации в Unreal Engine 5.7 на примере окружения, созданного для небольшого Cinematic CG-short'a по мотивам мобильного шутера.

Сам Cinematic:

Итак: вам необходим Лес в качестве окружения, а ресурсы ограничены. FAB.com по поисковому запросу "Megaplants" выдает несколько бесплатных пресетов PVE (Procedural Vegetation) сгенерированных деревьев, доступных помимо Unreal и в USD формате. Возьмем один из них за отправную точку и добавим пресет в проект на Unreal Engine 5.7 и новее. В настройках проекта нужно включить Nanite Foliage и активировать необходимые плагины.

Первым шагом добавим в сцену PCG Volume объект. Генерация происходит в границах этого объема.
PCG1.jpg

Объем может использовать разные PCG-graph'ы (Связки нод, формирующие генерацию). Создадим новый PCGgraph ассет. В появившемся диалоговом окне
из обширного списка пресетов выберем Showcase_SimpleForest и добавим его в уже созданный объект объема.
PCG2.jpg

Открыв созданный граф, увидим заботливо подготовленный пресет с описанием функции каждой ноды.
Принцип довольно простой: Граф генерирует точки - ноды определяют их расположение, параметры трансформации, взаимодействие - на финише, "точки" (отображаются серыми кубами) заменяются на статичные или скелетные меши нодами - Spawner'ами
Выбранную ноду можно активировать/деактивировать клавишей "E", увидеть непосредственный эффект на сгенерированные "точки" - инспекцией, нажав клавишу "A"(контекстное меню правого клика)
Все начинается с ноды "World Ray Hit Query" которую можно интерпретировать как "дождь", падающий внутри объема, но вместо брызг - генерация объектов по инструкции от последующих нод. Выбрав ноду "Surface Sampler", нажав "A" и изменяя плотность распределения точек (Points per Squared Meter), мы увидим как "точки"(серые кубы)- прокси для будущих камней перераспределяются.

PCG_Dense.jpg

Инспектируя(выбрав ноду и нажав "A") следующую ноду "Transform Points" мы увидим, как изменение её параметров придает рандомность нашим прокси- камням. Нода "Self Pruning" предотвращает пересечение точек друг с другом, а с помощью ноды "Difference" мы избегаем пересечения с точками, предназначенными для генерации других наборов сеток, например деревьев.
На самом уровне пока отображаются упрощенные меши камней, их можно заменить в деталях ноды "Static Mesh Spawner", добавив желаемые в разделе "Mesh Entries"

PCG_SM_Mesh.jpg Аналогично можно настроить распределение, случайность трансформации и заменить упрощенные на желаемые Статичные меши в остальных наборах - рамка "Деревья" и рамка "Трава".
Если же необходимо добавить в генерацию процедурные деревья со скелетной анимацией, как в технодемо Ведьмака 4, тогда в наш граф нужно добавить параметр - переменную, содержащую список таких деревьев.
Для этого:
1.Кликнем "+" в разделе Graph Parameters 2.Сменим тип параметра на "референс Скелетной сетки" 3.Сменим одиночный референс на множество

PCG_GParam123.jpg

Переименуем наш параметр и добавим в него несколько сгенерированных с помощью PVE-ассета, или из Megaplants пресета скелетных мешей деревьев.
Правым кликом на поле графа Вызовем ноду для генерации инстансов скелетных сеток "Instanced Skeletal Mesh Spawner"
Перетянем нить со входа "Static Mesh Spawner" через ноду "Match and Set Attributes" на вход "Instanced Skeletal Mesh Spawner"
также с помощью ноды "Get Graph parameter" вызовем наш "список деревьев" и подключим его ко входу "Match Data" на ноде "Match and Set Attributes"

В деталях ноды "Instanced Skeletal Mesh Spawner" в поле Mesh Attribute укажем имя нашего параметра.

PCG_SK_Trees.jpg

Теперь на месте точек для генерации камней - сгенерированы деревья из списка в нашем Параметре. Осталось только добавить ветра в поле
Transform Provider

PCG_Wind.jpg

Нода "World Ray Hit Query" способна фильтровать объекты уровня, которые будут использованы для генерации, но когда необходимо разом исключить любую генерацию в конкретной области внутри объема - можно использовать вход "Bounding Shape" на нодах "Surface Sampler"

Добавим на уровень объект "Location Volume" и попросим граф вычесть объем "Location Volume" из объема для генерации (сам PCG Volume).
Для этого вызовем с помощью ноды "Get Actor Data" сам PCG Volume - настройки выбора Self. Второй нодой "Get Actor Data" вызовем только что созданный объем "Location Volume".
Настроим фильтр выбора объекта второй ноды по классу(типу): Actor Selection = By Class, Actor Selection Class = Location Volume. Таким образом будут вычитаться любые "Location Volume" на уровне. Ноду "Difference" необходимо настроить на вычитание как скриншоте (желтая рамка)

PCG_Exc.jpg

Также возможно "прорубить просеку" c помощью сплайна:
Добавим на объект PCG Volume компонент "сплайн"
PCG_SplineCom.jpg

Выбирая, добавляя и перемещая контрольные точки сплайна, "протянем" его через лес. Теперь, пересэмплировав сплайн и увеличив размер полученных "точек" средствами нод "Spline Sampler" и "Transform Points", добавим их к вычитаемому объему на вход ноды "Difference"
PCG_Exc2.jpg
"Просека" готова.

Надеюсь, этих базовых шагов хватит, чтобы не затеряться в дебрях PCG генерации окружений в Unreal Engine 5.7. Множество PCG Graph пресетов, идущих в комплекте с любым лотом Megaplants с Fab.com, помогут освоить технику нодоплетения на более продвинутом уровне.

PCGenv.jpg

Спасибо за внимание.






,

497 0 850 1
0
RENDER.RU