UpPetto

This is a real course generated by UpPetto — unedited.

AI-generated. Two models wrote it, a third checked every risky claim against sources, a fourth re-checked.

Create my own course

Инкапсуляция сети в 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["Геометрия на выходе"]
Внешние параметры HDA — тонкие ссылки на конкретные параметры внутри скрытой сети

Parameter Editor: описание «сигнатуры»

Чтобы превратить набор нод в ассет, выделите их и выберите Create Digital Asset. Откроется окно Type Properties, вкладка Parameters:

  1. Existing Parameters — все параметры нод, попавших внутрь HDA. Перетаскиваете нужный (например, Size у Box) в папку Root — Houdini сам создаёт связь. Технически внутри ноды появляется выражение вида ch("../size"): чтение канала на уровень выше. Это тот же декларативный биндинг данных, что и в UI-фреймворках.
  2. 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 (скатер, процедурная стена, разбиение — что угодно с параметризуемой логикой). Сделайте:

  1. Выделите узлы сети → Create Digital Asset (или Type Properties, если уже есть Subnetwork).
  2. В Type Properties → Parameters поднимите 2–5 параметров из внутренних нод (Drag & Drop параметра из Existing Parameters в Root — это и есть promote).
  3. Задайте каждому осмысленный Label, диапазон и дефолт — такой, чтобы свежий инстанс выглядел рабочим без единой правки.
  4. Сохраните 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
[verified] HDA — инкапсулированная нодовая сеть, сохраняемая как переиспользуемый инструмент с внешними параметрами
База знаний: HDA объединяют параметры, внутреннюю логику и выход в единый узел
[removed] HDA сохраняется как файл .hda/.hdalc/.hdanc с номером версии определения
Перечня расширений и версии в имени файла в базе знаний нет
[softened] Старые инстансы остаются на прежнем определении, пока не выполнено 'Match Current Definition'
Название команды отсутствует в базе; оставлено общее описание синхронизации инстансов
[verified] Промоутнутый параметр связывается выражением ch("../size")
База знаний: параметры могут быть связаны с выражениями и ссылаться на другие узлы
[softened] Наружу разумно выводить 2–5 параметров
Эвристика дизайна, не факт из базы; подана как рекомендация
[removed] Перечисление расширений .hdalc/.hdanc и 'номер версии определения' в имени файла — удалено как отсутствующее в базе знаний
[removed] Точное название команды 'Match Current Definition' — заменено на нейтральное описание синхронизации инстансов с текущим определением
[removed] Жёсткое '2–5 параметров' подано как эвристика/рекомендация, а не как факт

A second opinion has not checked this lesson.

Key concepts: HDA инкапсуляция Parameter Editor версионирование ассета
Tell me more 🔒 Didn't understand — explain simply 🔒 Show examples 🔒 Sources 🔒

On your own course these buttons answer instantly, quizzes track what you've mastered, and lessons adapt to your gaps. Write my course

Check yourself

1. Что в HDA играет роль 'публичного API' модуля?
2. Что происходит со старыми сценами, если вы обновили определение HDA и поменяли интерфейс параметров?
3. Для чего в первую очередь используется Parameter Editor при создании HDA?
On your own course, these are marked as you answer