For-Each: циклы по кускам геометрии
core Построить For-Each цикл, генерирующий N вариаций объекта с разными параметрами, и объяснить, когда цикл дороже атрибутного подхода
For-Each SOP — это цикл над коллекцией кусков геометрии или над диапазоном чисел: одна подсеть между блоками Begin и End выполняется по разу на каждый элемент, а результаты автоматически склеиваются на выходе End. Это прямой аналог for (piece : pieces) { subnet(piece); } — но с оговоркой: подсеть здесь не код, а такой же граф нод, как и снаружи.
Два основных режима:
- For-Each Primitive/Piece — итерация по примитивам или по кускам входной геометрии (куски задаются связностью или атрибутом-piece); внутри блока доступен только текущий кусок.
- For-Each Number — итерация по числовому диапазону без входной геометрии на каждой итерации; используется генеративно — «сделай N вариаций объекта».
Блок Begin отдаёт метаданные итерации: индекс текущего прохода (iteration) и общее число итераций (numiterations, в выражениях часто пишут как @iteration/@numiter). Их читают через detail() в VEX-выражениях внутри подсети, чтобы менять параметры каждой итерации (высоту, seed, количество делений).
Освежим связь с VEX (модуль 2): VEX в Attribute Wrangle обрабатывает все точки/примитивы одним параллельным проходом — код применяется ко всем элементам входной геометрии сразу. For-Each же перекукивает всю внутреннюю подсеть N раз — если внутри блока стоит сложная цепочка нод, вы умножаете стоимость этой цепочки на N. Поэтому правило простое: если операция — это унифицированная функция атрибутов (масштаб, цвет, ориентация, выбор варианта) — делайте её в VEX или Copy to Points за один проход; если каждая итерация должна порождать разную топологию или проходить через операции, которые нельзя выразить как атрибут (булева операция с разным профилем, fuse с разным порогом, отдельный remesh) — нужен настоящий цикл.
flowchart LR
S["Вход: N чисел / N кусков"] --> B[For-Each Begin]
B --> N1["Подсеть: обработка, @iteration"]
N1 --> E[For-Each End]
E -->|повтор N раз| B
E --> O[Склеенный результат]Разобранный пример
Нужно сгенерировать 8 коробок разной высоты для разрушенной стены, где высота каждой коробки зависит не только от случайного числа, но и от разного числа делений по высоте (чтобы потом каждую по-разному ломать).
For-Each Number, 8 итераций. Внутри: Box, у которого высота берётся из выражения вида 1 + fit01(rand(detail("../foreach_begin1", "iteration", 0)), 0.5, 1.5), а число делений по Y зависит от того же индекса итерации — например, чётные итерации получают дополнительное подразделение перед последующим Voronoi Fracture внутри той же подсети.
Рассуждение: если бы нужна была только разная высота без разного числа делений — это решается через Copy to Points + VEX (масштаб по Y) без единого For-Each. Но здесь каждая итерация проходит через разную операцию (разное число подразделений перед fracture) — это не выражается атрибутом одной точки, значит нужен цикл.
Попробуй сейчас
Постройте For-Each Number с 8 итерациями. Внутри блока создайте Box, высота которого выражается через индекс итерации, полученный из метаданных блока Begin: detail("../foreach_begin1", "iteration", 0). На выходе объедините все коробки. Затем повторите тот же визуальный результат (только вариацию высоты, без разной топологии) через один Copy to Points + Attribute Wrangle с масштабом — и сравните число нод и время кука в Performance Monitor.
Ожидаемый результат: For-Each даёт 8 коробок разной высоты, но использует больше нод и время кука выше, чем эквивалентный Copy to Points-вариант для того же простого случая.
Получилось, если…
Вы поняли тему, если можете на конкретном примере объяснить, почему для «просто разного масштаба/цвета N объектов» дешевле обойтись VEX/Copy to Points, а не For-Each, и привести пример, где без For-Each не обойтись (разная топология на каждой итерации).
Вывод
For-Each — это цикл по кускам/числам, где на каждой итерации доступны индекс итерации и общее число итераций, а результаты сшиваются автоматически. Используйте его только когда операция меняет топологию или алгоритм по итерациям — иначе атрибутный подход (VEX + Copy to Points) дешевле.
AI-generated · source-grounded review
🛡 Fact-checked: 2 risky claims verified · 4 removed · confidence: medium · 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