Процедурная генерация простого Леса в 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 объект. Генерация происходит в границах этого объема.
Объем может использовать разные PCG-graph'ы (Связки нод, формирующие генерацию). Создадим новый PCGgraph ассет. В появившемся диалоговом окне
из обширного списка пресетов выберем Showcase_SimpleForest и добавим его в уже созданный объект объема.
Открыв созданный граф, увидим заботливо подготовленный пресет с описанием функции каждой ноды.
Принцип довольно простой: Граф генерирует точки - ноды определяют их расположение, параметры трансформации, взаимодействие - на финише, "точки" (отображаются серыми кубами) заменяются на статические или скелетные меши нодами - Spawner'ами
Выбранную ноду можно активировать/деактивировать клавишей "E", увидеть непосредственный эффект на сгенерированные "точки" - инспекцией, нажав клавишу "A"(контекстное меню правого клика)
Все начинается с ноды "World Ray Hit Query" которую можно интерпретировать как "дождь", падающий внутри объема, но вместо брызг - генерация объектов по инструкции от последующих нод. Выбрав ноду "Surface Sampler", нажав "A" и изменяя плотность распределения точек (Points per Squared Meter), мы увидим как "точки"(серые кубы)- прокси для будущих камней перераспределяются.
Инспектируя(выбрав ноду и нажав "A") следующую ноду "Transform Points" мы увидим, как изменение её параметров придает рандомность нашим прокси- камням. Нода "Self Pruning" предотвращает пересечение точек друг с другом, а с помощью ноды Difference мы избегаем пересечения с точками, предназначенными для генерации других наборов мешей, например деревьев.
На самом уровне пока отображается упрощенные меши камней, их можно заменить в деталях ноды "Static Mesh Spawner", добавив нужные в разделе "Mesh Entries"
Аналогично можно настроить распределение, рандомизацию трансформации и заменить на желаемые Статические меши в остальных наборах - рамка "Деревья" и рамка "Трава".
Если же необходимо добавить в генерацию процедурные деревья со скелетной анимацией как в технодемо Ведьмака 4, то для удобства добавим в наш граф параметр - переменную, содержащую список таких деревьев.
Для этого:
1.Кликнем "+" в разделе Graph Parameters 2.Сменим тип параметра на "референс Скелетной сетки" 3.Сменим одиночный референс на множество
Переименуем наш параметр и добавим в него несколько сгенерированных или идущих с 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 укажем имя нашего параметра.
Теперь на месте точек для генерации камней - сгенерированы деревья из списка в нашем Параметре. Осталось только добавить ветра в поле
Transform Provider
Когда необходимо разом исключить любую генерацию в области внутри объема - можно использовать вход 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 необходимо настроить на вычитание как скриншоте (желтая рамка)
Также возможно "прорубить просеку" c помощью сплайна:
Добавим на объект PCG Volume компонент сплайна
Выбирая, добавляя и перемещая точки сплайна, "протянем" его через лес. Теперь пересэмплировав и увеличив точки из сплайна с помощью нод "Spline Sampler" и "Transform Points" добавим их к вычитаемому объему на вход ноды Difference
"Просека" готова.
Надеюсь, этих базовых шагов хватит, чтобы по началу не затеряться в дебрях PCG генерации окружений в Unreal Engine 5.7. Множество PCG Graph пресетов идущих в комплекте с любым лотом Megaplants с Fab.com помогут освоить технику нодоплетения на более продвинутом уровне.
Спасибо за внимание.
,