SOP-сеть как конвейер функций
core Строить линейные цепочки из 3–5 базовых нод (transform, merge, subdivide, group) и предсказывать результат до вычисления
Нода в SOP-сети — это функция с сигнатурой geometry' = Node(geometry, params): она принимает геометрию на входе и возвращает изменённую геометрию на выходе, ничего не трогая в исходных данных выше по цепочке. Сеть — это граф вызовов таких функций, где выход одной становится входом другой. Это ближе к функциональной композиции или конвейеру pipe в Unix, чем к «отредактировал меш и потерял историю».
Geometry g1 = Box();
Geometry g2 = Transform(g1, tx=2);
Geometry g3 = Subdivide(g2, depth=2);
Geometry g4 = Merge(g3, Sphere());
Geometry g5 = Group(g4, name="selected");
Каждая строка этого псевдокода — одна нода в сети. Важно: g1 никуда не «испортился» после создания g2 — он пересчитывается заново каждый раз, когда меняются параметры Box, и Houdini кеширует промежуточный результат на узлах. Поэтому подход называют неразрушающим (non-destructive): можно кликнуть на Transform в середине цепочки, увидеть именно его выход, поменять tx, и всё, что ниже по графу, автоматически пересчитается. Выделение ноды — это и есть «точка останова»: смотришь состояние данных на любом шаге через Geometry Spreadsheet.
flowchart LR
Box --> Transform --> Subdivide --> Merge
Sphere --> Merge
Merge --> GroupHoudini делит работу на контексты — по сути, разные типы графов для разных данных:
| Контекст | Что вычисляет | Аналог |
|---|---|---|
| SOP | геометрию (points/prims/attrs) | фокус этого курса |
| OBJ | трансформации объектов, иерархию сцены | сцена/scene graph |
| DOP | физические симуляции (дым, жидкости, тела) | solver-цикл |
| ROP | вывод — рендер, экспорт кэшей | «компиляция» результата |
Для быстрого старта в играх и ТВ-графике почти всё время ты будешь жить внутри SOP: SOP отвечает на вопрос «что за геометрия», OBJ — «где она в сцене», DOP — «как она движется», ROP — «куда её записать».
Разобранный пример
Задача: предсказать результат цепочки Box → Transform(tx=2) → Subdivide → Merge(+Sphere) → Group до того, как её вычислить.
Рассуждение: Box даёт куб с центром в начале координат. Transform сдвигает весь куб на 2 единицы по X (меняет @P каждой точки) — форма не меняется, только позиция. Subdivide увеличивает число точек и примитивов, сглаживая геометрию. Merge не меняет ни одну из входных геометрий — он просто объединяет два независимых набора данных (сглаженный куб + сфера) в один поток, поэтому итоговое число точек = сумма точек обеих геометрий. Group ничего не меняет в геометрии физически — он добавляет метаданные о выборке (какие элементы входят в группу), которые дальше могут использовать другие ноды.
Попробуй сейчас
Собери именно эту цепочку: Box → Transform → Subdivide → Merge (второй вход — Sphere) → Group (например, по bounding box одной из фигур). Перед тем как посмотреть на вьюпорт после каждого узла, запиши на бумаге ожидаемую форму и приблизительное число точек. Затем прокликай узлы сверху вниз и сравни с Geometry Spreadsheet.
Ожидаемый результат: твои предсказания формы совпадают с фактическим видом на каждом шаге; после Merge количество точек равно сумме точек двух входов.
Получилось, если…
Ты можешь, глядя на сеть из 4-5 нод без клика на них, словами описать, что происходит с геометрией на каждом шаге — как если бы читал последовательность вызовов функций в коде, и объяснить разницу между SOP- и OBJ-контекстом.
Вывод
Нода = функция geometry → geometry с параметрами как аргументами; сеть = граф вызовов, кешируемый на каждом шаге; SOP — контекст для геометрии, остальные контексты (OBJ/DOP/ROP) решают другие задачи и почти всегда просто вызывают SOP-сети внутри себя.
AI-generated · source-grounded review
🛡 Fact-checked: 3 risky claims verified · 2 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