Инкапсуляция сети в HDA: интерфейс как публичный API
core Упаковать собранную SOP-сеть в HDA с 2–5 выведенными наружу параметрами и осмысленными дефолтами
Сеть, которую вы собрали в модуле 3, — это реализация. Пока она лежит открытым набором нод в /obj/geo1, любой, кто хочет её использовать, обязан знать внутреннее устройство: какая нода отвечает за плотность скатера, где зашит сид рандома, что будет, если поменять порядок операций. Это то же самое, что раздавать коллегам .c-файл вместо собранной библиотеки с заголовком.
HDA (Houdini Digital Asset) — это инкапсулированная нодовая сеть, сохранённая как переиспользуемый инструмент: вы сворачиваете сеть в один узел, и дальше существуют два независимых слоя.
- Внутренний слой (private) — сама сеть нод, VEX-код, промежуточные атрибуты. Он скрыт от пользователя ассета так же, как скрыта реализация функции от того, кто её вызывает.
- Внешний слой (public API) — интерфейс параметров, который вы явно «поднимаете» (promote) наружу через Type Properties → Parameters (Parameter Editor). Это ваш публичный контракт: имена, типы, дефолты, диапазоны.
flowchart LR
subgraph HDA["HDA-узел (в другой сцене)"]
P["Параметры: Density, Seed, Min Scale, Max Scale"]
end
subgraph Inside["Скрытая сеть внутри"]
A["Scatter SOP"] --> B["Attribute Wrangle: variation"] --> C["Copy to Points"]
end
P -.промоутнутые ссылки.-> A
P -.-> B
P -.-> C
HDA -->|cook| OUT["Геометрия на выходе"]Parameter Editor: описание «сигнатуры»
Чтобы превратить набор нод в ассет, выделите их и выберите Create Digital Asset. Откроется окно Type Properties, вкладка Parameters:
- Existing Parameters — все параметры нод, попавших внутрь HDA. Перетаскиваете нужный (например,
SizeуBox) в папкуRoot— Houdini сам создаёт связь. Технически внутри ноды появляется выражение видаch("../size"): чтение канала на уровень выше. Это тот же декларативный биндинг данных, что и в UI-фреймворках. - Create Parameters — параметры «с нуля», когда один контрол должен управлять несколькими значениями внутри. Типы:
Float,Integer(с диапазоном),Vector,Toggle,String,Button.
У каждого параметра есть Name (внутреннее имя, как имя переменной) и Label (то, что видит художник). Практика: Name — в snake_case, Label — человеческим языком.
Версии определения
HDA поддерживают версионирование определения. Когда вы меняете интерфейс уже выпущенного ассета, старые сцены с его инстансами не обновляются автоматически — Houdini держит их на прежнем определении, пока вы явно не попросите синхронизировать инстансы с текущей версией. Это прямой аналог версионирования API/ABI: v1 продолжает работать в старом проекте, пока команда не готова перейти на v2.
Выбор того, какие параметры поднимать наружу, — это дизайн API, а не техническая формальность. Поднимете всё подряд (30 параметров скатера) — пользователь захлебнётся; слишком мало — ассет бесполезен. Разумная эвристика: несколько (условно 2–5) параметров, которые реально меняют результат, с осмысленными дефолтами, чтобы ассет работал «из коробки» сразу после создания инстанса.
Разобранный пример
Есть сеть из модуля 3: разброс объектов по поверхности с VEX-контролем плотности и случайным масштабом. Внутри — Scatter SOP → Attribute Wrangle (пишет @scale по шуму) → Copy to Points.
Решение по API: поднимаем не все параметры нод, а только те, что реально нужны художнику:
| Внешний параметр | Тип | Дефолт | Что делает внутри |
|---|---|---|---|
| Density | float | 0.5 | Scatter SOP → Number of Points (через выражение от площади) |
| Seed | int | 0 | сид в rand() внутри Attribute Wrangle |
| Min Scale / Max Scale | float, float | 0.8 / 1.2 | границы fit01() в VEX-коде масштаба |
| Target Object | geometry input | — | вход сети, не параметр, но часть интерфейса |
Внутренние решения — например, тип шума — остаются зашитыми и не выводятся: это выбор автора ассета, а не место для эксперимента пользователя. Понадобится гибче — это следующая версия ассета.
Дефолты выбраны так, чтобы новый инстанс сразу давал разумный результат — как хорошая функция не требует от вызывающего кода настраивать все аргументы, если есть вменяемые значения по умолчанию.
Попробуй сейчас
Возьмите одну из сетей, собранных в модуле 3 (скатер, процедурная стена, разбиение — что угодно с параметризуемой логикой). Сделайте:
- Выделите узлы сети →
Create Digital Asset(или Type Properties, если уже есть Subnetwork). - В Type Properties → Parameters поднимите 2–5 параметров из внутренних нод (Drag & Drop параметра из
Existing ParametersвRoot— это и есть promote). - Задайте каждому осмысленный
Label, диапазон и дефолт — такой, чтобы свежий инстанс выглядел рабочим без единой правки. - Сохраните HDA, создайте новый инстанс через Tab-меню и убедитесь, что видите только промоутнутые параметры, а не внутреннюю сеть.
Результат: новый узел в Tab-меню с вашим именем, 2–5 полей в панели параметров, предсказуемое изменение геометрии при их правке.
Получилось, если…
Вы поняли тему, если можете создать инстанс своего HDA в чистой сцене, покрутить только внешние параметры (не заходя внутрь сети) — и получить осмысленно изменяющуюся геометрию с рабочими дефолтами с первого клика.
Вывод
HDA = инкапсулированный модуль: скрытая сеть внутри, публичный интерфейс параметров снаружи. Версионирование определения позволяет развивать инструмент, не ломая старые сцены. Выбор промоутнутых параметров — это дизайн API, а не техническая деталь.
AI-generated · source-grounded review
🛡 Fact-checked: 2 risky claims verified · 3 removed · confidence: high · figures: 1
A second opinion has not checked this lesson.
On your own course these buttons answer instantly, quizzes track what you've mastered, and lessons adapt to your gaps. Write my course