こんにちは、篠島です。今までForループを何気なく使っていましたが、今まで詳しく説明していなかったのでこの機会に説明したいと思います。
今回のサンプルファイルです。
ForEachLoop.zip
まず、タブメニューにはForループの項目が2つあります。基本的には同じ Block Begin SOP、Block End SOPを使っていますが、設定が異なります。
For Loop と For-Each Loop のそれぞれの設定画面の違いです。デフォルトで下のような設定になっています。
今回は For-Each Loop について見てみたいと思います。For-Each Loop はその名の通り、ポイントごと、プリミティブごと、ボロノイ等で砕いた破片ごとに処理をします。Iteration Method が By Pieces or Points になっているのを確認しましょう。Gather Method はMerge Each Iteration になっているので、ループの最後にそれぞれのイテレーションで処理した物を最後に全て合成して出力します。
破片に対してループする場合は破片の Piece アトリビュートを指定してやります。破片ではなく、ポイントもしくはプリミティブ毎に処理をしたい場合は、Piece Attribute の部分をOFFにします。そして、Piece Elements のところでポイント毎に処理をするのか、プリミティブ毎に処理をするのかを選択します。
メタデータ
Forループで現在のループの情報を得ることが出来ます。Block Begin SOPで Create Meta Import Node というボタンを押すことで、新しいBlock Begin SOP の Method が Fetch Metadata になったSOPが作られます。
このSOPの Detail アトリビュートにループに関しての情報が保存されています。なのでループ内でデータにアクセスしたい場合は detail() を使ってアクセスします。下の例だと、破片毎に Transform で上にちょっと位置をずらしています。
Grid に Box をコピーしたものを、Assemble SOPでアトリビュートを作り、Box毎に位置をずらしたものが下です。
Block End SOPで Single Pass をONにして値を入力すると、特定のループだけを出力することができるので、Forループのデバッグに活用できます。