Houdini

Houdini — процедурный пакет SideFX для разрушений, огня, дыма, жидкости и генерации миров. Вся работа строится на нодах, которые переиспользуются без правок.

Уровень: средний 20 разделов ⏱ 5–6 часов

1. Что такое Houdini

В отличие от Maya и Blender (ручное моделирование) Houdini работает процедурно: каждое действие — нода с параметрами. Изменение параметра пересчитывает весь граф. Поэтому Houdini — стандарт для FX в кино и процедурной генерации в играх.

Версии: Houdini FX (всё, включая симуляции) и Houdini Core (моделирование до симуляций).

2. Интерфейс и навигация

Главное окно:

Навигация: так же как в Maya — Alt + ЛКМ/СКМ/ПКМ. Просмотр выбранной ноды — H (fits), зум колесом мыши.

3. Нодальная сеть

Ноды соединяются «данными»: выход одной становится входом другой. Ключевые контексты:

КонтекстТип данных
Object (obj)объекты сцены (модели, камеры, lights)
SOP (sop)геометрия: полигоны, точки, атрибуты
DOP (dop)симуляции частиц/жидкостей/RBD
COP (cop)2D-операции (composting)

Базовый граф: Box = Polygon → Transform → Wrangle — и так далее. Ноды вниз по потоку пересчитываются автоматически.

4. Геометрия и атрибуты

Минимум: точки (points) — позиция P, рёбра, примитивы (polygons) и атрибуты — данные, прикреплённые к любому элементу.

Группы (Groups) — именованные наборы точек/примитивов: @group_name = 0/1.

5. Процедурное моделирование

Собери на примере города из кубов:

// Point Wrangle: каждый третий куб выше
@P.y += sin(@ptnum * 3.0) * 0.5;
if (@ptnum % 3 == 0) @P.y += 2.0;

// Форс: прибить к сетке
@P = rint(@P * 10.0) / 10.0;

Ключевые инструменты: Copy to Points (инстанс копий по точкам), Attributes Wrangle/wrangle, Scatter, Resample, Polybevel.

6. VEX — главный язык

VEX — C-подобный язык, исполняемый на CPU по каждому элементу (точка/примитив). Синтаксис ближе к C, чем к Python.

float r = rand(@ptnum + 123);
vector n = normalize(@P);
@Cd = set(r, n.y, 1.0 - r);

int npts = npoints(0);
float avg = 0.0;
for (int i = 0; i < npts; i++) {
    float t = float(i);
    avg += t > 100.0 ? 1.0 : 0.0;
}
Пиши Wrangles поверх сетки в тысячи точек — VEX исполняется параллельно, поэтому операции над атрибутами почти мгновенны.

7. Вращение, копирование и инстансинг

Copy to Points ставит копию объекта на каждую точку. Управлять поворотом можно атрибутами @orient (кватернион) и @scale.

// Point Wrangle: ориентация по нормали поверхности
v@orient = quaternion(@N, @P);
f@scale = 1.0 + 0.2 * sin(@ptnum);

Для движков выгоднее Instancing: рисуется одна копия, копии в сцене — ссылки. В Houdini используй Copy to Points с флагом «instanced» или Instance node.

8. Симуляция частиц

Самый короткий путь к частицам — контекстное меню SOP ноды → подменю «with POPs»:

  1. POP Net — сеть частиц.
  2. POP Source — источник (точки).
  3. Через POP Wrangle добавь силы и ограничения.
@v.y -= 0.98;   // гравитация вниз
@v *= 0.99;     // сопротивление воздуха

9. Разрушения: RBD и Voronoi

Разрушаемые тела — ключевая фишка Houdini:

  1. Модель → Voronoi Fracture — разрезает на куски по случайным точкам.
  2. Куски + симулирующий объект → RBD Solver в DOP.
  3. Задай Glue Constraint — склейка до удара.
  4. Подключи RBD Material Fracture для материала-стенки.
Сохраняй результат симуляции через ROP Output в фоновых кадрах: DOP-симуляции не интерактивны, пересчёт идёт поблочно.

10. Жидкость и дым

Для дыма используй Smoke Solver, для жидкости — FLIP Solver (частицы) или APIC. Начни с готового примера: File → New Example → FLIP Tank.

Основа: объём и его разрешение (voxel size) и источник частиц. Чем мельче воксель — тем детальнее, но в разы дороже по памяти.

11. Террейн и процедурные ландшафты

Террейны делаются через Heightfield сеть:

Эрозия требует DOP-симуляции: она медленная, поэтому сначала уменьши плотность сетки, затем увеличь для финала.

12. Экспорт в Unreal и Unity

Способы переноса:

Для RBD/симуляций запекай Alembic (.abc) с нормалями и расскомпонуй по островкам — движки не умеют кривые интерполяции частиц FLIP без записи кэша.

13. Освещение и рендер: Karma

Современный Houdini рендерит через ядро Karma (XPU — гибрид CPU+GPU) или классический Mantra. Освещение собирается нодами в контекстах Light Mixer и VOP: Sun Light, Dome Light (HDRI), Area Light.

Схема графа:
Lighting (/stage) → Material Library
        ↓
Karma Render → EXR (OpenEXR) выход
Считай рендер в EXR с AOV-масками (diffuse, specular, normal): финальную цветокоррекцию и свет удобнее править в After Effects или Nuke.
Для игр освещение часто «запекают» в текстуры — bake lighting → набор текстур для Substance Painter.

14. HDA: переиспользуемые ноды

HDA (Houdini Digital Asset) — упакованная нода с параметрами, интерфейсом и документацией. Хорошо собранный HDA используют в команде и в движке без знания внутренностей.

  1. выдели подграф нод → Create Digital Asset;
  2. задай тип, например scatter_rocks::1.0;
  3. вынеси ключевые параметры на вкладку Interface;
  4. добавь иконку и короткое описание изнутри.
Где живётКак используется
HDA-файл (.hda)переносится между проектами
Командная полка (Shelf)общий набор для всей команды
Unreal/UnityHoudini Engine подхватывает тип напрямую
Версионируйте тип: изменение интерфейса ассета ломает старые сцены. Мажорную версию меняйте при несовместимых правках интерфейса.

15. Кеширование и производительность

Тяжёлые симуляции и сетки нельзя пересчитывать при каждом открытии сцены. Houdini «замораживает» результат нодами File Cache и ROP Output в формате Bgeo/HDC.

File Cache   → путь: $HIP/geo/sim.$F.bgeo
ROP Output   → Write to: $HIP/geo/sim.$F.hdc

Переменные кадров: $F, $FSTART, $FEND
Финальный просчёт запускай из командной строки: hrender сцены оставляет рабочее окно свободным для правок.
Береги диск: кеш в сотни гигабайт на большой симуляции — норма. Следи за квотами и чисти неиспользуемые кеш-папки.

16. Автоматизация через Python (hou)

Python API Houdini — модуль hou. Скрипты массово создают ноды, правят параметры, переименовывают и экспортируют.

import hou

node = hou.node("/obj/geo1")
node.createNode("box")
box = node.children()[-1]
box.parm("sizey").set(2.0)

for n in node.children():
    if n.type().name() == "wrangle":
        print(n.parm("snippet").eval())

Запуск возможен без интерфейса — бинарник hython, что удобно для пайплайна и CI:

hython my_script.py
hython -c "import hou; print(hou.applicationVersion())"
Скрипты в связке с Houdini Engine образуют полноценный пайплайн экспорта — база языка в курсе Python.
Пиши скрипты идемпотентно: повторный запуск не должен плодить лишние ноды в одной сцене.

17. Камеры: фокус, глубина резкости и motion blur

Две самые недооценённые детали в кадре — фокус и размытие. Без них рендер выглядит «пластиковым», даже если геометрия и свет идеальны.

# параметры камеры (Camera ROP → Main)
focal:       35 мм          # portrait 50–85
aperture:    2.8            # глубина резкости
ortho:       off            # перспектива

Depth of Field (DOF) в Karma включается через параметр камеры: фокусируйтесь на главном объекте, всё остальное мягко уходит в размытие.

Снимайте тест одного кадра после каждого изменения камеры: рендер с DOF в 10 раз дороже без него.
Завышенный стоп-motion (sample rate) на blur без нужды вздувает время рендера. Замеряйте наименьший визуально приемлемый sample.
Экспозиция и отсветы подробнее — в разделе 13 про Karma.

18. Экспорт в PNG/EXR и постобработка

Финальный рендер редко уходит «в лоб». Правильный формат и постобработка за композитором решают половину качества картинки.

ROP Output → формат:
EXR:  многослойный, AOV, HDR   (основной)
PNG:  быстрый превью, веб      (для тестов)

AOV (Arbitrary Output Variables) — отдельные проходы: diffuse, specular, reflection, z-depth, normal. Они позволяют пересобирать свет в Nuke/AfterEffects без пересчёта.

блок-main.n.0001.exr  →  main_beauty_0001.exr
                          main_diffuse_0001.exr
                          main_zdepth_0001.exr
Храните AOV в одном EXR-файле — так проще синхронизировать кадры и версии.
Не путайте LDR и HDR: EXR содержит значения выше 1.0. «Выжигание» света в JPEG отбрасывает информацию, которую не вернуть.
Композитинг и цветокоррекция — в курсах After Effects и Nuke.

19. Шейдеры и материалы: Karma MaterialX

Материалы в Houdini строятся на ноде MaterialX — открытом стандарте шейдинга, который Karma понимает нативно. Это замена старому Principled Shader.

MaterialX Shader → Principled BSDF
  base_color     (текстура Albedo)
  subsurface     (кожа, воск)
  roughness/metallic (PBR-пары)

Ключевые параметры:

# навесить материал на объект
/obj/geo → Material Library → MaterialX Shader → Bind
Начинайте с готовых библиотек (Karma Material Palette) и подправляйте числом — это быстрее, чем строить шейдер с нуля.
Физически некорректные пары roughness+metallic дают мутный картинок. Держите их согласованными с текстурой.

20. Версионирование проекта и работа в команде

Проект в одиночку и проект в пайплайне — разные вещи. Пара правил спасёт от потери версий и конфликтов.

# имена файлов
/hip/terrain_v001.hip   → terrain_v002.hip
/cache/sim_001.bgeo     # версия кадра явно в имени
Перед сдачей запустите «чистый» просчёт с нулевого кадра: доказательство, что проект собирается, а не держится на кэше.
Не храните тяжёлые кэши (bgeo, alembic) в git — их место в центральном хранилище. Иначе любая клонирование репозитория взорвёт диск.
Совместная разработка ассетов описана в разделе 14 (HDA), скриптование — в разделе 16.

21. Риг и кинематика: IK/FK и ограничения

Houdini умеет не только разрушать: игровой пайплайн часто требует персонажной анимации. Риг строится нодами — каждый сустав, кость и ограничение становится узлом графа.

// VEX: цель IK как атрибут точки
v@pivot = @P;
i@target_pt = @ptnum + 1;
Делайте риг «по минимуму для продакшена»: несколько контролов, закрывающих 80% поз, удобнее, чем тысяча кнопок, которые никто не помнит.
Риг-анимация считается в симуляционном времени: перед рендером окончательно кешируйте деформации (USD-версии), как в разделе 15.

22. CHOP-ноды: работа с данными анимации

CHOPs (Channel Operators) — узкая, но мощная область Houdini: каналы создаются, фильтруются и комбинируются как сигналы, а затем управляют любым параметром сцены.

// типичная цепочка CHOP:
// Channel CHOP → Noise CHOP (сигнал)
// → Math CHOP (умножение/сдвиг)
// → Export CHOP → параметр объекта
Звук в CHOPs — это видимая волна: синхронизация анимации с ритмом занимает минуты, а не часы ручной подгонки.
Традиционные ключевые кадры (раздел 5) тоже работают в Houdini, но CHOPs дают тот самый процедурный контроль, за который любят фреймворк.

23. Crowds: толпы, агенты и клоны

Сцены «городская толпа» или «армия» решаются через Crowd Solver: тысячи агентов с собственной анимацией, обходом препятствий и состояниями поведения.

// VEX для агента: случайное смещение скорости
v@velocity += fit01(rand(@id), -0.5, 0.5) * v@up;
Начинайте с простого: цель + поле препятствий, прежде чем настраивать кривые поведения и состояния.
Crowd-агенты с множеством клипов тяжелы для памяти: ограничивайте число агентов и используйте лёгкие меши для низкоприоритетных фоновых.

24. Композитинг в Houdini: COP и финальный фрейм

Финальную сборку кадра обычно делают в Nuke, но базовая коррекция, ключинг и сборка слоёв доступны прямо в Houdini через ноды COP (Compositing Operators).

// типичная цепочка COP
Render → Keyer (фон) → Transform (рамка)
      → Grade (цвет) → Composite (слои)
      → ROP Output
Экспортируйте слои отдельно (раздел 18) и собирайте их в COP: так вы сможете пересветить кадр без полного пересчёта 3D.
COP — не полная замена Nuke для больших пипл-пайплайнов (глубокие AOV, версии кадров). Для сложной композиции есть отдельный курс композитинга.

Что дальше

Процедурный подход Houdini прекрасно дополняет модельный пайплайн Blender и Maya. Текстуры для FX-сцен рисуй в Substance 3D Painter, а модели выгружай в Unreal Engine через USD.

← Вернуться к курсам