
UE Mesh Terrain теория и практика
- Подготовка к работе
- Основы работы в режиме Mesh Terrain Mode
- Практика
- Подробнее о возможностях
Содержание:
MeshTerrain – это новый инструмент в Unreal Engine доступный (пока в экспериментальном режиме) с версии 5.8. Более тридцати лет (с 1992 года) разработчики использовали карту высот для создания и хранения ландшафта в играх. И вот UE, наконец-то, сделали следующий шаг: теперь при использовании MeshTerrain поверхность хранится как огромный единый трехмерный мегаобъект.
В целом это было ожидаемо после представленной системы Nanite, но как же долго мы этого ждали. Такой подход решает главные проблемы существовавшей доныне системы:
1) карта высот при резких перепадах высоты растягивает текстуру и это нужно прятать;
2) сетка, основанная на картах высот, имеет жесткую решетку, и это неизбежно создает лесенки на сгибах (под определенными углами);
3) невозможно создать что-либо находящееся одно над другим в рамках террейна (читай: минус пещеры и нависающие утесы). Все это приходилось создавать отдельными статическими конструкциями.
Данная статья предполагает, что вы достаточно хорошо знакомы с интерфейсом UE и хотите научиться пользоваться конкретно этим инструментом.
Мы кратко опишем возможности данной технологии, дадим инструкции по работе с местными инструментами и опишем популярные подводные камни, встречающиеся при их использовании.
Подготовка к работе
Ставим UE не ниже версии 5.8.1.
Если у вас язык системы не английский, пропишите в консоль: -culture=en

В первую очередь открываем плагины проекта и подключаем плагин Mesh Terrain Mode.

После перезагрузки в редакторе появился соответствующий режим управления.

Создаем новый уровень с пресетом "Empty Open World".
Поскольку в пустом проекте нет освещения, необходимо его добавить. Делаем это через специальное окно настройки освещения в сцене:

Последовательно подключаем все аспекты освещения. За 5 кликов получаем базовую настройку освещения:
DirectionalLight - глобальное освещение от солнца;
SkyAtmosphere - рассеивание света через атмосферу в зависимости от положения солнца;
SkyLight - псевдоотраженное освещение, используемое для бликов и преломляющих поверхностей (жидкость, стекло, блеск);
VolumetricCloud - облака и их процедурное состояние;
ExponentialHeightFog - дистанционный туман и объемный туман(взаимодействующий с освещением).
Для понимания происходящего далее рекомендую сразу открыть вспомогательные окна: World Partition и Mesh Partition Outlinner на втором экране.


Сохраните уровень и дайте ему название на этом этапе. Перезагрузите уровень.
Пора создавать мир! Пока небольшой. Переходим в режим управления Mesh Terrain Mode и жмем "Создать Mega Mesh".


Изначально UE предлагает создать территорию в 1км*1км (100 юнитов = 1 метр).
Плотность создаваемой сетки указана в графе Resolution = 1000*1000 (сетка поверхности с шагом в 1 метр).
"Save and Unload" поставить рекомендуется, если вы сразу же зачем-то создаете карту большого размера.
В окне World Partition вы увидите подобную картину (если отдалите там камеру).

Стрелка здесь - это камера, выделяемая рамка с названием LastLoadedRegion - зона, в которую мы последний раз смотрели до перезапуска, серый контур - границы созданной территории.
Выделите область (ЛКМ), с которой будете работать, и через контекстное меню загрузите этот участок. В дальнейшем, когда карта разрастется, это поможет вам работать только с тем регионом, который вам нужен именно сейчас. Пока загрузите всю существующую территорию.


Как видите, наш квадратный километр уже разбит на 4 секции по 500 квадратных метров. Давайте расширим границы и добавим новые секции.



Добавьте секции с каждой стороны и доведите их количество до 16.
Обращу внимание: "секция" и "выбранный регион" - это разные вещи.
Секции - это те кусочки, на которые автоматически разбивается наша карта. Их размер и форму в дальнейшем мы сможем изменить.
Регион - это область, с которой мы хотим работать в редакторе. Все секции, задетые (хотя бы за край) нашим "регионом просмотра", подгружаются, а вот объекты нет. Только те, что попали в выделенную зону.
Нам это пригодится как сейчас, так и в дальнейшем, когда мы будем работать с PCG.
Раскидайте по карте несколько огромных примитивов.

Поиграйте с мини-картой и зонами загрузки. Загружайте и выгружайте разные участки.

Обратите внимание, что загружаются только те объекты и секции, которые попадают в зону загрузки.
Возможны баги. Если секции не выгружаются, сохраните уровень и перезагрузите UE.
Если это по-прежнему не так, возможно, объекты закреплены, как на картинке ниже. Это мешает им выгружаться.

Поехали дальше.
Поскольку мы создаем террейн, продолжать без смарт-материала не вижу смысла. В свойствах созданного MeshPartition найдите MPD.

MPD - это новый тип ассетов, внутри которого задаются глобальные параметры применяемого материала, сам материал, слои для рисования по террейну и слои для компоновки модификаторов.

1) Материал Террейна
2) В Mesh Terrain данные о том, "какой материал нанесен", хранится в текстурных каналах. Это их разрешение.
3) Текстурные слои
4) Слои компоновки модификаторов
На текущий момент уже есть один смарт-материал, созданный под функционал MeshTerrain, в свободном доступе.
Скачайте его тут: https://www.unrealsensei.com/asset/senseiterrainmaterial (возможно, потребуется VPN).
Не будем касаться его настройки и работы. Об этом, при желании, можете найти видеоурок на соответствующем сайте.
Вот краткая инструкция по использованию:
1) Распакуйте архив.
2) Запустите файл проекта из архива.
3) Выделите содержимое папки Content в UE и нажмите Migrate. Укажите путь к папке Content своего проекта.
4) Создайте материал-инстанс для M_SenseiTerrain_NaniteEx и подключите его в MPD_SenseiTerrain.
5) Используйте MPD_SenseiTerrain как свой MPD в свойствах террейна.

Дальше... небольшой ликбез по модификаторам.
Основы работы в режиме Mesh Terrain Mode

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

1) Создание террейна
2) Управление разметкой секций, операции с разбивкой
3) Список доступных модификаторов (которые активируются перетаскиванием)
4) Инструменты для скульптига и моделирования, доступные в зоне действия модификатора "Brush"
5) Инструменты для рисования по различным слоям текстур
6) Набор быстрых примитивов, которые могут пригодиться в процессе
Наибольший интерес представляет список модификаторов(3). Кратко по их назначению:

1) Проецирование кастомного меша на поверхность террейна
2) Проецирование текстуры или карты высот на поверхность террейна
3) Инструмент изменения террейна посредством системы сплайнов (каньоны, тропы, русла, дороги, ущелья - сюда)
4) В зоне действия этого модификатора доступны инструменты скульптинга
5) Модификатор процедурного шума
6) Булевы операции, благодаря которым мы можем как припекать к террейну наши статик-меши, так и вырезать ими же нужный нам рельеф
7) Модификатор, позволяющий менять плотность сетки в выделенной области. Он используется для адаптации сетки под создаваемый рельеф (фиксит растяжение сетки)
8) Такой же модификатор, но применимый к конкретному сплайну
Вот тут важно понять философию, заложенную разработчиками:
Любые необратимые изменения, которые вы совершаете с ландшафтом, называются "деструктивными". Это старый подход, который всячески порицается, но все же он вам доступен. Да, вы можете просто взять кисти и начать менять поверхность, но это будет неправильно.
"НЕ-Деструктивный" подход, рекомендуемый разработчиками, заключается в использовании модификаторов слой за слоем. Окно для просмотра слоев мы открыли ранее и пока его не касались. Создаем модификатор, определяем область его применения и делаем наши дела внутри него.
На территорию в одном и том же месте может воздействовать множество модификаторов. С модификаторами можно работать как с любыми объектами, а также определять порядок их применения.
Посмотрим на практике:

(Это стандартный шум с Intensity = 120)
Обратите внимание на предупреждение в верхнем углу экрана. Это напоминание о том, что вы видите "предпросмотр". Сами изменения будут пересчитаны движком в меше только после того, как вы снимете выделение с модификатора(клик в небо).

В нижней части экрана можно увидеть процесс пересчета (2) после клика, снимающего выделение. Под (1) скрывается окно с диагностикой, где можно почитать о нагрузке на систему.
Теперь вы столкнетесь со следующими вещами:
1) Ошибка расчета теней.

Это бага, пока её не пофиксили разрабы - чиним самостоятельно (просто перезагрузите освещение: выключите свет и включите его обратно). Готово.

2) Недостаточная полигональность и растяжение текстур (интенсивность шума повышена до 220, для большей наглядности).

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

(Ctrl+2 = вид сетки. Ctrl+4 = Lit Shader)
Это не ошибка. По задумке разработчиков, в тех местах, где нам потребуется повышенная плотность полигонов, нужно добавить модификатор Remesh.
Добавьте его, указав в свойствах шаг желаемой сетки - 1 вершина на каждые 20 см поверхности (1).

Вообще модификатор Remesh работает в двух режимах (2): Remesh или Tessellate.
Tessellate - более дешевый по производительности и обычно применяется до изменения поверхности. Он подразделяет сетку до заданного размера.
Remesh - более требовательный и применяется обычно после изменений. Он работает иначе: пересобирает сетку в трехмерном пространстве, делает её однородной. В отличие от Tessellate, он способен работать с перекрывающей геометрией и исправлять ошибки.
В данном случае неважно, в каком порядке применяются модификаторы и какой режим ремеша мы используем. Результат будет примерно такой:

В режиме просмотра сетки видны изменения. Также можно отметить работу Nanite, которую нельзя отключить. Отмечу, что реальная сетка показывается только у близких к камере объектов.

Дисплейсмент материала (тесселяцию) в ходе работы над ландшафтом можно временно отключать, так как он вызывает "жир" и шум в сетке (не спрашивайте почему и зачем - я без понятия).

Самый удобный способ - временно отключить тесселяцию тут.
Итак, давайте создадим холм модификатором Brush.

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

Берем инструменты скульптинга, убираем Gizmo в сторону и творим.
Настройки инструментов для скульптинга вы увидите внизу. Кнопка с тремя черточками открывает подробные настройки. Галочка завершает работу.
Напоминаю, что размер кисти в UE изменяется горячими клавишами "[" и "]".

Копируем наш холм через Ctrl+C, копируя сам модификатор. Ведь горки как таковой не существует - существует лишь модификатор, который изменяет поверхность.

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

поскольку это отдельные модификаторы, которые применяются последовательно, при смешивании высота будет перемножаться, что неизбежно вызовет артефакты (особенно в сложных конструкциях).
К сожалению, на текущий момент у инструмента Brush нет настроек смешивания (которые, как ни странно, есть у некоторых других инструментов) и потому у вас есть два решения данной задачи:
1) Создавать задуманную конструкцию в рамках одного браша.
2) Исправлять косяки подобных перекрытий добавлением еще модификатора поверх предыдущих.

Вот три горки, объединенные и выровненные посредством четвертого модификатора.
Не забываем, что при плохой топологии (без использования Remesh) после пересчета модели нас будут ждать артефакты и растяжения.
Также предупреждаю, что долгая работа в модификаторах без остановки на пересчет приведет к крашам.

Что же, теперь у нас достаточно различных модификаторов, чтобы разобраться со слоями.
Во втором "полезном" окне, что я рекомендовал ранее (Mesh Partition Outlinner), вы можете наблюдать порядок "слоев модификаторов" (как в каком-нибудь фотошопе). Обратите внимание, что порядок в этом списке - это и есть порядок применения модификаторов. Чем выше модификатор по списку, тем ПОЗЖЕ он применяется.

1) Отмеченный столбик переключает видимость работы модификатора во вьюпорте.
2) На текущий момент все наши модификаторы не отсортированы и лежат в неопределенной, но последовательной куче.
3) Тут каждый из модификаторов может определить свою группу выполнения.
4) Тут меняется приоритет внутри группы (на случай, когда вы хотите поднять какой-то слой выше другого).
Названия и последовательность групп модификаторов назначается в MPD, но поскольку мы работаем с уже настроенным вариантом - они уже есть.
Раскидаем наши моды по полочкам:

Благодаря работе через модификаторы мы можем в любой момент времени вернуться к нужному слою и переделать интересующий нас участок. Это и есть принцип не-деструктивных изменений.
С теорией на самом-то деле все. Все основополагающие моменты и важные детали мы разобрали.
Закрепим теорию небольшой демонстрацией. Подумайте, как получить подобную форму:

Правильный ответ: через булевы операции. Лишь базовую форму холма да мелкие правки мы делаем кистью.
В данном случае для вырезания были использованы камни из бесплатного набора: https://fab.com/s/be644e8517fa. Просто копируем модификатор и вырезаем пещеру интересующей нас формы.
Попробуйте любопытства ради добиться сложных форм (пещер, утесов), используя просто кисть, и сразу всплывут различные подводные камни, не очевидные на первый взгляд:

подобные растяжения и искажения поджидают вас при недостаточной плотности исходной сетки перед началом работы. Фиксится заблаговременным накидыванием Remesh до начала скульптинга.

А вот пример сетки, которая будет вызывать непредсказуемое поведение кистей. Это когда вы слишком сильно искажаете сетку даже при достаточной изначальной плотности. Фиксится завершением работы Brush -> Remesh (с целью заново получить однородную сетку) -> продолжаем работу уже в новом модификаторе Brush.

Вот так будут выглядеть попытки работать кистью с вогнутыми поверхностями. Разница в плотности сетки, образующаяся на таком повороте, не позволит продолжить работу. Фиксится также ремешем (с продолжением работы в новой итерации Brush).
В итоге, чтобы получать удовлетворительный результат, придется работать примерно таким образом:

Работа с булевыми операциями намного чище, так как ландшафт в зоне слияния (или вычитания) получает сетку используемого объекта.
Но и тут вас могут поджидать досадные артефакты:

Они появляются после того, как на результат булевых операций набрасывается Remesh. Связано это с тем, что объекты, которые участвовали в операции, передали свою сетку рельефу, а она где-то отличается, а где-то может и совпадать с условиями ремеша. Фиксится повышением разрешения\сглаживания в ремеше или, что проще и надежнее, через Brush.
Теперь точно все. Теорию донесли.
Перейдем к практике.
Практика
Сразу же оговорюсь, что расписывать параметры всех инструментов и модификаторов я не буду - с этим вы можете поиграть самостоятельно. Поехали.

Удалим все созданные модификаторы и добавим в проект парочку карт высот для гор и холмов (созданы в GAEA).
- H_Hills1
- H_Hills2
- H_Mountain1
- H_Mountain2
Технически надо создать лэндскейп, криво-косо накидать желаемый рельеф, сохранить его как HeightMap и импортировать в GAEA, чтобы там серией модификаторов доработать его до "реалистичного рельефа". Но сейчас это не входит в наши задачи. Возможно, позже опишу эту тему.
Одно из главных преимуществ по сравнению со старой системой террейнов - это то, что теперь мы можем использовать карты высот как кисти и смешивать их между собой, как нам заблагорассудится.

Горы и холмы создавались в километровом диаметре и соответствуют базовой плотности нашей сетки.
Обратите внимание: у рельефа, созданного с помощью проекции карты высот, ЕСТЬ свойства смешивания. Используем значение MAX.



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

Давайте создадим небольшую локацию под горой.
Выбрав место работы, создадим примитив высотой 30 метров и отмерим с его помощью уровень, на котором будут находиться наши склоны.

Зададим форму нашей локации через Brush, используя указанные кисти.

После ремеша(50) создадим нависающие склоны.

Не забыв докинуть ремеш, используем кисти по назначению:
1) SkulptN используем аккуратно, чтобы не завернуть поверхность в бублик; это скорее палочка-выручалочка, нежели основной инструмент.
2) Играя с размером кисти и силой нажатия, меняем основную форму, делая её более живой.
3) Сглаживаем неудобные моменты, что позволяет нам оттянуть время до следующего ремеша.
4) Стирает результат работы в текущем Brush`е в случае ошибок.
5) Отдельно отмечу технику одиночных кликов для создания перехода между высотами.
Когда при работе вы видите артефакты (складки на краю обрывов или склонов), это знак, что для дальнейшей работы следует сделать новый ремеш. Пока остаемся на том же уровне ремеша в 50 юнитов (напомню, это 1 вершина на каждые 50см).
Не забывайте проверять наличие ошибок. Всегда ищите причину их возникновения. Если проблемы в сетке - ОК, ремеш справится. Но…

... вот пример на картинке "выше" в дальнейшем привел к тотальному рассинхрону между превью модификаторов и результатом их работы. Ремэшить такое бесполезно.
Решение данного косяка: в свойствах модификатора Brush нужно поставить проецирование изменений на ближайшие точки!!!

Внесем необходимые правки и в остальные склоны. Не забывайте сохраняться перед каждой новой задачей - режим экспериментальный и может вылетать!

Подробнее о возможностях
Добавим небольшой уступ перед входом с помощью булевой операции:



Сам камень, с помощью которого мы примерялись, можно удалить. Возьмём кисть и немного подправим форму, которой бы нам хотелось. Внимание! Если в дальнейшем вы будете применять ремеш(50) в этой области, - большинство деталей камня будет сглажено и уйдет. Не забывайте про это. Если есть необходимость сохранить форму, - следует в следующем после правок ремеше отключить сглаживание и сделать ремеш достаточно мелким.
При попытке интегрировать уступ с поверхностью мы столкнемся с проблемой: некоторые моменты исправить кистью не получится из-за изгибов.

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

Но вот незадача: допустим, я хочу, чтобы поверхность уступа была каменной… Как ни странно, время для очередного "Браша".
Только определив область, в которой мы будем рисовать (с выделенным модификатором Brush), мы переходим в режим рисования:
Рекомендую переименовать слой модификатора в BrushPaint во избежание путаницы.


Выбираем нужный материал из слотов, рисуем. Обратите внимание, что нам не требуется использовать VRT для смешивания, так как все это единый объект.
Также стоит отметить, что каждая текстура рисуется в своем канале (Channel) со значением от 1 до 0 (Value). И они применяются последовательно!
Если запутались - обнуляйте значение Value, начиная с последнего слоя. Просмотреть значения слоев можно в цветовом превью:

Чтобы получить плавные переходы между текстурами, играйте со значениями Strength, Falloff и размером кисти.

Давайте внесем ручные правки мелкой кистью (зададим размер вручную через поле Size). Создадим уступ для примера.
Не забываем две вещи:
1) Ремеш редактируемой области с необходимой плотностью До и После мелких правок.
2) В итоговом ремеше нужно отключать сглаживание и включать сохранение формы (Shape Preserving).

Если не соблюдать эти правила, любые косяки с сеткой обязательно всплывут, когда вы попытаетесь включить тесселяцию!
Перейдем к сплайнам.
Допустим, нам нужна горная тропа:

По какой-то причине по умолчанию ширина воздействия сплайна равна нулю, поэтому, чтобы получить подобный результат, установите значения:

Далее кликните на любую ноду сплайна, и попадем в стандартный для UE режим работы со сплайнами:

Новые ноды создаем ПКМ. Небольшой наклон всего модификатора (по оси Z) создаст необходимый эффект и предотвратит излишнее воздействие на поверхность склона.

Сам наклон тропы мы чуть позже легко исправим выравнивающей кистью. Но сначала нам нужен ремеш!

Обычный боксовый ремеш тут не подойдет, так как наша тропа виляет и может тянуться довольно далеко. Нужен тот, что воздействует только на зону влияния сплайна: Spline Remesh. Однако не все так гладко: добавив соответствующий модификатор на сцену, мы увидим, что в нем необходимо указать сплайн, с которым он будет работать. Но список известных сплайнов ПУСТ! Это БАГ.

Решение: добавьте "Spline Remesh Modifier" в сам сплайн через зеленый плюсик.

Внезапно. Указываем сплайн-ремешу, где он, к какому мега-мешу относится, в каком он слое и каков его приоритет.

Наконец, выбираем сплайн - теперь он в списке есть.

Далее уже настраиваем желаемую плотность сетки и параметры сглаживания, как и в обычном ремеше.

Вот и все. Бросаем браш и дорабатываем нужные нам детали (наклон, уступы) напильником.
Готово!

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



Браш -> Ремеш -> Булиан (для фикса). Это мы уже проходили.
И вот наша гора уже стала основой для скального уступа.
Напоследок давайте закрепим работу с Boolean. Для начала набросаем сплайнами карьер и путь до шахты:

Если у вас глючит Lumen, рекомендую прописать:
r.Lumen.ScreenProbeGather.RadianceCache.GridResolution 10
r.Lumen.ScreenProbeGather.RadianceCache.ProbeResolution 64
Это временная мера - ждем стабильной версии.


Отключите отображение самого модификатора чтобы увидеть результат.
В темной пещере с освещением там будет полный "швах". Используйте Unlit shader + подсветку сетки:
Alt+3 и Alt+9

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



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

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

А на сегодня все.
©SOLOARTDEV, 2026.
