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Разобранный пример
Задача: сделать плоскость волнистой и покрасить её по высоте — типичная замена ручной деформации кодом.
Логика: высота точки зависит от её 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. Напишите код, который:
- смещает
@P.yпо синусоиде от@P.xс параметрамиfrequencyиamplitude(создайте их кнопкой+рядом с полем кода либо просто напишитеchf(...)и нажмите кнопку создания параметров); - красит точки в градиент от высоты через
@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
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