Houdiniノード勉強回。
今回は、Houdini15から追加のBlock Begin(SOP) / Block End(SOP)ノードにしてみました。
「なんじゃこりゃ」、「どうやって使うのさ」、と思って調べたヤツです。
繰り返し処理のためのノードで、H14以前の”For Eeach(SOP)”と(ほぼ)同様の機能を提供するもの。
(H14以前のfor each(SOP)は”For-Each SubnetWork(SOP)”として残っています)
Tabメニューから“For Loop”もしくは、“For-Each Loop”でBlock Begin / End(SOP)をセットで作ってくれます。(違いは後述)
Block Begin / End(SOP)の間にノードを挟むとそのノードがループ処理されます。
他の処理と同一階層で行えるのが利点。いちいち階層を潜らなくてもよいと。
Block Begin/End(SOP)ループ処理は大きく2タイプに分かれます。
蓄積型とバラバラ型(by管理人呼称)
蓄積型は、一つのジオメトリを繰り返し処理し、結果を蓄積していくタイプです。
バラバラ型は、複数のジオメトリ全部に対して同じ処理を施すタイプです。
同じノードを使ってますが、それぞれ設定が異なります。
まずは蓄積型から、ざっと。
上絵のような設定。これで、蓄積型のループが出来ます。
パラメータ見てみます。
次にバラバラ型。
設定はこんな感じ。
Piece Attributeを指定しない場合は、すべてのPrimitive(またはPoint)に対して個別に処理されるようです。
さらに、蓄積型とバラバラ型を組み合わせた蓄バラ型も可能です。
マニュアルにあるサンプルでは、トーラスを球でガシガシ削ってました。
(Block Begin(SOP)のExamplesの一つ、「SwissCheese」)
ネットワークはこんな感じでした。
さて、Loop処理する度にこの設定をするのは面倒なので、プリセットが用意されています。
tabメニューの、”For Loop”と”For-Each Loop”がそれです。
“For Loop”が蓄積型、
“For-Each Loop”がバラバラ型、
これらの設定をしたBlock Begin / End(SOP)のセットが作成されます。
Block Begin(SOP)にはLoopの開始を指定する以外にも、大事な機能があります。
メタデータ(情報)を生成する、という機能です。
ここでのメタデータとは、例えば、「今何回目のループ処理をしている」、「全部で何回ループ処理する」、「今、どの破片を処理している」とか、そういった情報です。
Block Begin(SOP)にある、”Create Meta Import Node”ボタンを押すことで、Meta情報を格納するBlock Begin(SOP)を新しく作成することができます。
このノードをGeometry Spreadsheetで見てみると、detailに幾つかパラメータがあるのが分かります。
「今、何回目の反復処理中」、だとか「今、どのPieceを処理している」だとか、そういうのが分かります。
値を参照したいときは、エクスプレッションのdetail関数使って取得できます。
そんな感じ。
※一点、groupベースでのLoop処理について注意が必要。
for each subnet(SOP)だと可能だった、groupベースのPiece Loop処理の機能は提供されていません。
これはgroupが互いに素とは限らないため(構成要素に重複があり得るということ)らしい。
もしPiecesの定義にgroupを使いたい場合は、Name(SOP)等を使って、Primitiveにgroupの名前を持つNameアトリビュートを作成し、それでPieceを区別すると良いらしい。
Name(SOP)を使ってgroup名からnameアトリビュートを作成する手順は次の通り。
1:Name(SOP)を作成
2:”Name form Group”をON
3:Group Maskを*に
4:Number of Namingsを0に
これで、groupの名前を持つNameアトリビュートが作られます。
以上、間違い等ありましたらご指摘を!
サンプルファイルForLoop_Sample.hiplc
助かりました。ありがとうございます。