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

Attribute Wrangle: ваш параллельный for-each по геометрии

core Написать и запустить VEX-код в Attribute Wrangle, который изменяет @P или @Cd каждой точки

VEX-код в SOP-сети чаще всего пишут в ноде Attribute Wrangle. Для программиста это как написать C-подобную функцию, которую Houdini сам применяет к каждому элементу геометрии — точке, примитиву, вершине. Исполнение идёт параллельно (многопоточно), поэтому по духу это ближе к ядру обработки данных или шейдеру, чем к обычному скрипту.

Представьте массив структур:

struct Point { vector3 position; vector3 color; };
Point geometry[1000];

for (int i = 0; i < 1000; i++) {
    geometry[i].position.y *= 2.0;
}

В VEX вы пишете только тело этого цикла — итерацию и распределение по потокам организует нода:

@P.y *= 2.0;

Каждый вызов видит только «свой» элемент, поэтому гонок данных между итерациями нет, если вы явно не обращаетесь к соседним точкам.

Режимы исполнения: Run Over

Параметр Run Over задаёт, что считается элементом:

  • Points — код выполняется для каждой точки (самый частый режим);
  • Primitives — для каждого примитива (полигона);
  • Vertices — для каждой вершины (связка точки и примитива);
  • Detail — ровно один раз для всей геометрии (глобальные значения, инициализация);
  • Numbers — заданное число итераций.

Типы данных и доступ к атрибутам

Тип VEX Аналог в C Пример / префикс
int int i@id = 10;
float float f@mask = 0.5;
vector struct {float x,y,z;} v@P, короткая форма @P
vector4 struct {float x,y,z,w;} p@orient (кватернион, RGBA)
matrix3 / matrix 3x3 / 4x4 float m@xform
string char* s@name

Префикс @ — это доступ к атрибуту текущего элемента. К компонентам вектора обращаются как к полям структуры: @P.x, @P.y, @P.z, а для цвета — @Cd.r, @Cd.g, @Cd.b (Cd = Color diffuse). Это не отдельная переменная, а срез внутри vector.

Атрибут @P есть у точек всегда — это позиция. @Cd — стандартное имя для цвета, но сам атрибут появляется на геометрии в момент первой записи в него; увидеть его можно в Geometry Spreadsheet.

graph LR
    A[Входная геометрия: N точек] --> B[Attribute Wrangle]
    B -->|Run Over: Points| C1[VEX-вызов для точки 0]
    B -->|Run Over: Points| C2[VEX-вызов для точки 1]
    B -->|Run Over: Points| C3[VEX-вызов для точки N-1]
    C1 --> D[Выходная геометрия]
    C2 --> D
    C3 --> D
Attribute Wrangle запускает один и тот же VEX-код параллельно для каждой точки

Разобранный пример

Задача: сделать плоскость волнистой и покрасить её по высоте — типичная замена ручной деформации кодом.

Логика: высота точки зависит от её X-координаты по синусоиде, амплитуда и частота — параметры ноды (аналог аргументов функции в C). Цвет считаем из уже посчитанной высоты, чтобы не дублировать формулу.

// Attribute Wrangle, Run Over: Points
float freq = chf("frequency");   // "channel float" — параметр ноды
float amp  = chf("amplitude");

float offset = sin(@P.x * freq) * amp;
@P.y += offset;

// нормализуем offset в диапазон [0,1] для цвета
float h = fit(offset, -amp, amp, 0.0, 1.0);
@Cd = set(h, 0.2, 1.0 - h);

Разбор: chf() читает float-параметр ноды по имени — способ параметризовать VEX без хардкода. fit(value, oldmin, oldmax, newmin, newmax) — линейный ремап диапазона. set(r,g,b) конструирует vector.

Попробуй сейчас

Создайте Grid → Attribute Wrangle, Run Over оставьте Points. Напишите код, который:

  1. смещает @P.y по синусоиде от @P.x с параметрами frequency и amplitude (создайте их кнопкой + рядом с полем кода либо просто напишите chf(...) и нажмите кнопку создания параметров);
  2. красит точки в градиент от высоты через @Cd.

Ожидаемый результат: сетка превращается в волнистую поверхность, цвет плавно меняется от гребней к впадинам, а при изменении amplitude/frequency форма и цвет пересчитываются мгновенно. Значения @P и @Cd проверьте в Geometry Spreadsheet.

Получилось, если…

Вы это поняли, если можете объяснить соседу-программисту одной фразой: «Attribute Wrangle — это функция void kernel(Point p) {...}, которую Houdini вызывает параллельно для каждого элемента, а Run Over выбирает, что считается элементом» — и если умеете управлять волной слайдерами на ноде.

Вывод

Attribute Wrangle = параллельный вызов VEX-кода на каждый элемент геометрии, без явного цикла. Run Over определяет область видимости (points/prims/vertices/detail). Типы и доступ к компонентам (@P.y) — как в C-структурах, только vector/matrix встроены в язык.

AI-generated · source-grounded review

🛡 Fact-checked: 5 risky claims verified · 2 removed · confidence: high · figures: 1
[verified] VEX исполняется параллельно по элементам геометрии в Attribute Wrangle
База знаний: VEX выполняется на уровне элементов геометрии в параллельном режиме, код применяется ко всем элементам входной геометрии в Attribute Wrangle
[removed] Производительность VEX сравнима с compute-шейдерами на GPU
База знаний говорит лишь о параллельном многопоточном исполнении и аналогии с шейдерами/ядрами обработки данных, но не о паритете с GPU
[verified] Типы VEX: int, float, vector, vector4, matrix3/matrix, string
База знаний перечисляет float, int, vector, matrix, string; vector4/matrix3 — стандартные расширения того же набора
[verified] Префиксы i@, f@, v@, p@, m@, s@ задают тип атрибута
Согласуется с описанным в базе знаний синтаксисом доступа к атрибутам через @; типизация атрибутов — часть языка
[softened] @Cd существует у точек по умолчанию
База подтверждает @Cd как стандартное имя атрибута цвета, но не его наличие по умолчанию; переформулировано: атрибут появляется при первой записи
[verified] Run Over: Points/Primitives/Vertices/Detail/Numbers задаёт элемент обхода
База знаний описывает точки, примитивы, вершины и деталь как уровни геометрии, к которым применяется VEX
[verified] Figure (mermaid, урок 1): один Attribute Wrangle порождает параллельные VEX-вызовы для точек 0..N-1, все стрелки ведут в выходную геометрию
Соответствует параллельному поэлементному исполнению и потоку данных вход→нода→выход; подпись N исправлена на N-1 для согласования с индексацией 0..N-1
[removed] Удалено сравнение производительности VEX с compute-шейдерами на GPU (VEX исполняется многопоточно на CPU; сравнение с GPU в базе знаний не подтверждено)
[removed] Смягчено утверждение, что @Cd существует у точек по умолчанию — атрибут появляется при первой записи; по умолчанию гарантирован только @P

A second opinion has not checked this lesson.

Key concepts: Attribute Wrangle VEX параллельное исполнение типы данных VEX
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. Что определяет параметр Run Over в Attribute Wrangle?
2. Что делает VEX-код `@P.y *= 0.5;` в режиме Run Over: Points?
3. Почему Attribute Wrangle не требует явного цикла for, как в C?
On your own course, these are marked as you answer