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

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[Склеенный результат]
For-Each прогоняет одну подсеть N раз и склеивает результаты на выходе End; каждый проход видит свой @iteration.

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

Нужно сгенерировать 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
[verified] For-Each Begin/End выполняет подсеть по разу на элемент и склеивает результаты
согласуется с нодовой архитектурой SOP-сетей и потоком данных, описанным в базе
[softened] @iteration и @numiter доступны как метаданные и читаются через detail()
в базе отсутствует; уточнено как метаданные блока Begin (iteration/numiterations), читаемые detail()
[removed] $FF — номер текущей итерации
$FF — номер кадра, а не итерации; выражение удалено
[verified] VEX в Attribute Wrangle обрабатывает элементы параллельно за один проход, что дешевле N перекуков подсети
база подтверждает параллельное выполнение VEX по элементам и применение кода ко всем элементам в Attribute Wrangle
[softened] Оценка O(n) с векторизацией внутри одного кука
конкретная оценка сложности в базе отсутствует
[removed] «$FF — номер текущего кадра/итерации» — $FF это номер кадра, а не индекс итерации; выражение убрано, оставлен detail() к метаданным блока Begin
[removed] «O(n) с векторизацией внутри одного кука» — конкретная оценка сложности отсутствует в базе знаний, смягчено до «один параллельный проход по всем элементам»
[removed] «@iteration/@numiter доступны внутри блока и на выходе End» — уточнено: это метаданные блока Begin, читаемые через detail()
[removed] «For-Each Primitive/Piece — итерация по группам связных примитивов» — уточнено (по примитивам или кускам, задаваемым связностью либо атрибутом-piece)

A second opinion has not checked this lesson.

Key concepts: For-Each SOP итерация по piece/number метаданные итерации стоимость цикла vs 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. Что доступно внутри блока For-Each для определения текущего прохода цикла?
2. Когда For-Each оправдан по стоимости сильнее, чем VEX-подход?
3. For-Each Number отличается от For-Each Primitive тем, что:
On your own course, these are marked as you answer