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


XK Studio.Timberland x Liberty
На референсах выше хорошо заметно, насколько по-разному могут выглядеть цветы одного сорта благодаря небольшим различиям в деталях (цвете, форме, количестве лепестков и т. д.). В качестве примера создадим несколько вариантов одного цветка, соответствующих разным стадиям цветения, варьируя параметры с помощью атрибутов.
Атрибуты
В Houdini большинство операций с геометрией сводятся к работе с атрибутами — данными, прикрепленными к точкам, примитивам, вершинам или объекту в целом, обозначаемыми знаком @. Например, эти данные могут описывать цвет (@Cd), положение (@P), uv координаты (@uv) или нормали (@N).
Большинство операций, выполняемых в процессе моделирования, затрагивают именно эти данные. Например, ноды-модификаторы, такие как Transform, Bend или Mountain, изменяют значение атрибута @P, который отвечает за положение геометрии в 3D-пространстве.
При работе с атрибутами важно понимать, что каждый из них принадлежит к определённому классу в зависимости от уровня геометрии, к которому он относится:
Кроме класса, атрибуты различаются по типу данных. Разные типы данных позволяют описывать разные свойства геометрии: например, float удобно использовать для масштабов или веса, int — для счётчиков и индексов, vector — для координат и направлений, а string — для имён или путей к файлам. Верно указанный тип атрибута помогает Houdini понимать, как обращаться с данными и какие операции можно к ним применять.
Атрибуты, которые есть на геометрии, можно просмотреть в детализированном формате в Geometry Spreadsheet или визуализировать во viewport, нажав на название атрибута в Info.
Создание и изменение
Создавая новые атрибуты важно помнить, что в Houdini существуют «зарезервированные» имена, которые автоматически считываются некоторыми нодами. При создании собственных атрибутов лучше не использовать эти названия, во избежание конфликтов имен.
Среди таких атрибутов f@pscale — единый коэффициент масштабирования. Как и для другие атрибутов, значения @pscale можно быстро задать с помощью ноды Attribute Create, через короткий код в Attribute Wrangle, или с помощью нескольких нод в Attribute VOP.
Способы создания атрибута f@pscale
С помощью атрибутов можно внести естественную вариативность в модель, например, варьируя размер лепестков и тычинок.
Например, выражение rand (@ptnum) сгенерирует псевдослучайное значение от 0 до 1 для каждой точки, основываясь на её уникальном номере (@ptnum). Так, каждая точка получит своё индивидуальное значение, но результат будет детерминированным — при одинаковом входе @ptnum результат работы rand () всегда будет одинаков.
Способы задания рандомного атрибута f@pscale
Внутри параметров также удобно обращаться к глобальным переменным (Global Variables) вроде времени ($T), номера кадра ($F) или номера точки ($PT).
Например, выражения rand (@ptnum) и rand ($PT) аналогичны, при использовании их в Attribute Create они зададут одинаковые значения атрибута f@pscale.
Чтение и передача
При работе с объектами, состоящими из нескольких частей, свойства различных элементов часто оказываются взаимосвязаны. Например, на референсах ниже можно заметить, что борозды и неровности на лепестках расположены неравномерно — у космеи они наиболее выражены в области, более близкой к центру бутона. Мы можем повторить этот эффект с помощью передачи атрибутов.


Используя ноду Attribute Transfer можно перенести атрибут (f@mask) с центральной части на лепестки на основе расстояния, и использовать его в качестве маски для деформации. Аналогичного результата можно добиться, используя Distance from Geometry в режиме Output Mask.


Атрибуты и параметры


Хотя лепестки уже отличаются по размеру, общая форма бутонов все еще смотрится неестественно. Чтобы сделать их немного более реалистичными, воспроизведём эффект изгиба и скручивания лепестков, хорошо заметный на референсах выше.
Один лепесток можно легко деформировать с помощью ноды Bend, но если применять к каждому лепестку одну и ту же деформацию, результат будет выглядеть неестественно. Для создания индивидуальной формы для каждого элемента, используем атрибуты в связке с parameter expressions.


На основе облака точек с атрибутом f@grad (в диапазоне от 0 до 1), в ноде Attribute Adjust Float создадим атрибут f@bend.
После этого f@bend можно считать в ветке с геометрией лепестка с помощью выражения:
point(»./foreach_In», 0,«myAttribute», 0)
В этом сетапе, значение f@bend будет индивидуальным для каждой копии (в рамках указанного в Attribute Adjust Float диапазона), и, при применении в ноде-деформере bend, создаст индивидуальный угол сгиба для каждого лепестка.
Оптимизация
По мере усложнения сцены важно не перегружать её лишними данными, которые могут влиять на производительность. В процессе работы рекомендуется:


Автоматизация
Когда ассет готов и основные параметры вариативности настроены, следующий шаг — создание нескольких моделей бутона с разной степенью раскрытия и лёгкими отличиями в форме лепестков. Менять параметры и экспортировать каждую версию вручную было бы неэффективно — вместо этого можно автоматизировать процесс с помощью контекста TOP (Task Operators).
TOPs (или PDG — Procedural Dependency Graph) позволяет управлять задачами и процессами: например, с помощью него мы можем запускать одно и тот же дерево нод несколько раз, подставляя разные значения параметров и записывая результат на диск.

В качестве вариативных параметров нашего ассета будут выступать:
Для начала создадим EXISTING_LINK_0_1761388221600_t4awo1×9x и переместимся внутрь. Нода Wedge, которую мы будем использовать для генерации вариантов параметров, создаёт несколько задач (workitems), каждая из которых содержит уникальные значения заданных атрибутов. Зададим следующие настройки:
После нажатия ПКМ → Generate Node, появляются три задачи (workitems), каждая со своим набором параметров. Наведя курсор на точку можно увидеть, какие значения были сгенерированы для @pdg_bend и @pdg_noiseOffset, а также номер задачи — @pdg_index.
Атрибуты внутри TOPs имеют свой контекст использования — они служат для управления процессами и задачами, а не геометрией

Созданные атрибуты теперь можно подставить в Attribute Adjust Float → Adjustment Value. При переключении активного workitem внутри TOPs значения будут автоматически подставляться в нодграф, а геометрия обновляться.

Чтобы записать результат на диск, подключим ROP Geometry Output. В параметре SOP Path указывается путь к конечной геометрии (например, ././Out_geo), а в Output File — динамическое имя файла.
$HIP — это переменная среды (Environment Variable), которая используется для сокращенной записи директории для файла, в котором мы работаем. @pdg_index — это атрибут, который позволит сохранить каждый вариант модели с уникальным именем, соответствующим номеру workitem:
Чтобы записать модели на диск, остается нажать ПКМ на ROP Geometry Output → Cook Node. Эта команда:
Так, с помощью TOPs мы сгенерировали и экспортировали несколько моделей, готовых для дальнейшего использования в лэйауте.
Задание
Описание Дополните созданный на предыдущем занятии ассет с помощью параметров, управляемых атрибутами, а также экспортируйте несколько вариаций готовой модели
Результат Набор итоговых моделей, .hip-файл проекта
Полезные ссылки