Unreal Engine PCG #1: База

Unreal Engine PCG #1: База
Статья пишется на момент 5.4.4, и PCG находится в активной разработке в статусе «Beta».

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

PCG систему стоит рассматривать как 2 основных составляющих:

  1. Расстановщик точек и присвоение метаданных.
  2. Расстановщик объектов в этих точках.

Т.е. простейший PCG это просто одна точка, находящаяся там же, где и PCG Actor. Добавление спавна там, например, конуса это уже следующий этап

Простейший PCG граф, создающий одну точку и конус в ней
Результат работы графа выше

Расстановка точек

Точка

На самом деле PCG-точка это не просто 3 координаты, каждой точке так же соответствует набор данных (основные):

  • Трансформация (Позиция, Масштаб, Поворот).
  • Bounds (границы).
  • Seed.
  • Density.
  • Метаданные (остальные атрибуты).

Трансформация определяет положение точки в пространстве и ее размер.

Bounds — виртуальыне границы. Используются для задания размеров точки при масштабе 1, и используются для взаимопересечения точек.

Seed — «зерно» случайности. На основании этого значения (а так же в некоторых случаях и положения точки) происходит вся «случайность».

Density (плотность) — числовой (0.0 - 1.0) атрибут, в который может быть записан например случайный шум, по значению которого потом можно отфильтровать точки. В зависимости от способа создания точки по умолчанию в Density могут записываться разные значения.

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

Работа с точками

Все типы операций можно поделить на три основных итога:

  1. Создание новых точек.
  2. Модификация существующих точек.
  3. Отфильтровывание точек.

Разбирать каждую ноду не считаю эффективным, поэтому постараюсь передать суть на ограниченном их количестве.

Создание новых точек

Создание может происходить как на основании чистой математики:

Сетка 10 на 10 метров с шагом 1 метр

Так и на основании данных актора. Пример ниже для работы требует наличие Spline Component у актора с PCG Component и спавнит точки только внутри этого сплайна.

Точки расставляются внутри замкнутого сплайна
Точки расставляются на поверхности ландшафта

Модификация точек

К модификации точек можно отнести:

  • Изменение трансформации (в т.ч. на случайное значение в рамках).
  • Изменение Bounds.
  • Добавление/изменение/удаление метаданных.
Изменение трансформации нодой «Transform Points»
Изменение Density нодой «Attribute Noise»

На скриншоте выше внезапно можно увидеть кубы вместо адекватных форм. Это потому, что для отображения значения Density я включил режим Debug. В нём точки визуализируются кубом, у которого:

  • Трансформ совпадает с трансформом точки.
  • Размер совпадает с Bounds.
  • Цвет отображает значение Density.

Так как Bounds это внутренний размер точки, то при изменении Bounds не изменится размер соспавненой в точке модели, но изменится размер Debug-куба.

Bounds имеют разные размеры, но модели — одинаковые

Однако если изменить Scale точки, то изменится и масштаб появляющеся там модели и размер Bounds.

Т.е. World Bounds = Bounds*Scale.

Отфильтровывание точек

Отфильтровывание происходит на основе атрибутов ( к которым в целом можно отнести и трансформацию точки). К примеру можно оставить только точки, чей Density > 0.5. Это полезно, если какое-то действие нужно совершить только над частью точек, а не над всеми. Например при помощи такой фильтрации можно регулировать плотность леса. Или настроить так, что у части точек, которых спавнятся деревья так же будут спавниться кусты.

И Debug-точки и модели отображаются одновременно. Фильтрации нет
При помощи Density Filter оставлены только точки, чей Density>0.5

Расстановка объектов в точках

Сами по себе точки — абстракция. Точки нужны только для того, что бы на их месте что-то произошло. Чаще всего — спавн меша. За спавн на всех примерах выше отвечала нода Static Mesh Spawn. Она спавнит случайную модель из списка на каждой из точек. Созданные таким образом меши становятся инстансами Instanced Static Mesh.

Итог

Применений у всего этого может быть несколько: как рантаймовая генерация, так и в роли инструмента левел-дизайнера. Можно использовать PCG-графы как кисти: кнопка «Clear PCG Link» у PCG Component отвяжет созданные этим компонентом меши от PCG и сделает их независимыми.

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