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

XK Studio. VELCRO Brand Hook & Loop



Maxim Amelko. Exploration 5
Scatter
Первым шагом в создании сцены является размещение точек, на которые позже будут копироваться растения. Для этого используется Scatter — нода, генерирующая случайное распределение точек на поверхности входной геометрии.
По умолчанию Scatter создает равномерное распределение — чтобы добиться более естественного паттерна, уменьшим значение Relax Iterations.
Во избежание пересечений копируемых объектов, Scatter позволяет автоматически вычислять радиус точек при изменении других параметров. Радиус определяется через стандартный атрибут @pscale, который можно сохранить, включив параметр Output Radius Attributes во вкладке Output Attributes. Радиус можно дополнительно настроить с помощью Scale Radii By, который работает как множитель @pscale.
Таким образом, используя релаксацию точек и регулировку радиуса, можно добиться реалистичного распределения, где растения группируются естественным образом и не пересекаются.
Паттерны распределения
Проанализировав природные референсы, можно заметить определенные паттерны распределения растений — например, мох скорее будет расти в местах с высокой влажностью или с определенной стороны кроны — попробуем воспроизвести эту деталь в своей сцене.
Такое неравномерное распределение можно задать с помощью атрибутов. Нода Scatter позволяет использовать атрибут в качестве множителя для Density Scale — параметра, который определяет сколько точек будет создано на единицу площади. Чтобы это работало, float атрибут должен находиться на входной геометрии (на точках, примитивах, вершинах или уровне detail) и иметь диапазон значений от 0 до 1, где 0 означает полное отсутствие точек, а 1 — максимальную плотность.
В демонстрационной сцене, для имитации описанных свойств мха, используется нода Mask by Feature, которая задает атрибут f@density со значениями близкими к 1 с «северной» стороны.
Вариативность
Важной частью референсов является разнообразие видов полевых растений — эффект разнотравья, который важно сохранить.
Для управления вариативностью копируемых объектов используется Piece Attribute — целочисленный атрибут, который определяет, какой именно объект будет размещен в каждой точке. Настроить распределение можно следующим образом:
Свойства объектов
Хотя распределение объектов выглядит довольно реалистично, все они имеют одинаковый размер, наклон и ориентацию в пространстве, чего нельзя встретить в природе.
Вариации размера растений можно настроить, изменяя f@pscale с помощью шумовых паттернов: атрибуты на основе различных типов шума удобно создавать с помощью Attribute Adjust (Float, Vector, Integer) и Attribute Noise. В данном случае основной тренд в вариации размеров растений задает шумовой паттерн: более высокая трава находиться в центре кочек, а по краям — более низкая.
Для добавления более мелких вариаций на основе рандома в указанном диапазоне, в сцене также используется выражение в Point Wrangle:
f@pscale *= fit01(rand(@ptnum), ch(«min»), ch(«max»));
Parameter Expressions & For-Each Loops
Даже с использованием вариаций плотности распределения, трансформаций и свойств объектов, при создании большого количества копий, в сцене могут прослеживаться повторяющиеся элементы.
Чтобы избежать этого, можно вносить индивидуальные изменения в каждую копию, используя parameter experssions в связке с циклами For-Each. Этот метод позволяет динамически модифицировать параметры объектов на основе атрибутов на точках, создавая еще больший простор для вариативности.
В нашей сцене этот подход используется для управления наклоном травинок так, что в каждой копии градус наклона индивидуален и определяется атрибутом на точке (@myAttribute).
Copy To Points помещается внутрь цикла For-Each Point, а значение атрибута вызывается каждую итерацию цикла с помощью Parameter Expression:
point(»./foreach_In», 0,«myAttribute», 0)
Так, травинки в сцене получают естественный наклон, отличающийся от копии к копии. Подобным образом можно варьировать и другие свойства объектов.
Оптимизация
Чтобы не перегружать сцену, важно оптимально организовать процесс копирования объектов.
Копирование может быть реализовано несколькими способами:
Если количество дублируемых объектов велико, запаковка и инстанцирование помогут ускорить работу во viewport и уменьшить потребление памяти.
Для оптимизации сцен с использованием копирования также используется метод Level Of Detail (LOD).
LOD для 3D-моделей означает уменьшение сложности сетки по мере удаления от камеры (или других метрик). Как правило, детализированная сетка нужна на первом плане, а на среднем и дальнем планах мелкими деталями можно пренебречь. Иерархия LOD определяет, какая версия модели видна в зависимости от этого расстояния.
В нашей сцене LOD также используется для оптимизации — в соответствии с расстоянием до камеры, все точки делятся на зоны, каждой из которых соответствует свой LOD. В соответствии с принадлежностью к определенной зоне, на каждую точку копируется модель с соответствующим уровнем детализации.
Quixel Megascans, ссылка на ассет
Так как кусты черники в этой сцене являются инстансами, в зависимости от положения камеры происходит обновление атрибута s@instancepath, с помощью которого нода instance определяет путь до модели.
С помощью функции sprintf () и значений атрибутов i@Var (вариант модели) и i@Lod (уровень детализации) на каждой точке создается атрибут s@instancepath, содержащий индивидуальный относительный путь до модели.
s@instancepath = sprintf(«$HIP/props/berrieBushes/Var%d/Var%d_LOD%d.fbx», i@Var, i@Var, i@Lod);
В итоге получается легко редактируемая и оптимизированная сцена, готовая к рендеру.
Задание
Описание Создайте сцену, применяя изученные приемы распределения объектов. Настройте вариативность типов объектов, их свойств и трансформаций, а также оптимизируйте сцену.
Результат Набор референсов, .hip файл проекта
Полезные ссылки