On this page | |
Since | 17.0 |
概要 ¶
For Each LOPは、一連の操作を複数回繰り返し、各反復中にパラメータを変更するオプションを備えています。 このノードは、Begin Context Options Blockノードをこのノードの3番目の入力に接続してブロックを形成し、 その開始ノードとこのノードの3番目の入力の間にあるノードがその繰り返される操作となります。 Iteration Method の設定は、このノードが数値範囲またはプリミティブパスリストのどちらに対してループを再クックするのか決めます。
For-Eachブロックはコンテキストオプション変数を使って反復回数を保持することから、この開始ノードがコンテキストオプションノードになります。 For Each SOPノードとは異なり、このノードは、ループ内で影響を受けるPrimsを元から孤立化しません。 これは単に各ループの番号またはプリミティブパスを含んだコンテキストオプション値を設定してノードをクックします。
このノードの用途をいくつか挙げると:
-
特定の数だけPrims、アトリビュート、編集、他に必要な何かを自動的に生成します。
-
一連の変更をたくさんのPrimsに適用します。
-
一連の変更をたくさんのPrims上のすべてのバリアントセットまたはすべてのバリアントに適用します。
Note
For-Eachブロックで生成されるコンテキストオプションはFetc LOPのターゲットに漏れます。 ハルがFetchで取得されたノードを網羅していなくても、それらのノードがブロック内で考慮され、それらに応じてコンテキストオプションを使用することができます。 これが期待どおりの挙動である場合とそうでない場合があります。
How to ¶
-
LOPネットワーク内で⇥ Tabを押してFor Eachを選択します。
これは、Begin Context Options Blockノードから始まってこのノードで終わるブロックを配置します。
-
入力となるノードチェーンを
foreach_end
ノードの 1番目の入力 に接続します。ステージに 追加 するだけであれば(例えば、新しいPrimsを作成するなど)、
foreach_begin
には何も接続する必要はありません。 しかし、既存のPrimsを 修正 する場合には、入力となるノードチェーンがループ内で利用できるように、さらにそのノードチェーンをforeach_begin
ノードの入力に接続してください。 -
このブロックの最後にあるFor Eachノード(
foreach_end
)を選択します。 -
このノードのパラメータエディタで、 Iteration Method を選択します。
-
foreach_begin
ノードからforeach_end
ノードの 3番目の入力 の間で、ループさせたいLOPノードを接続します。For Eachノードは、( Iteration Method に応じて)ブロックを0回以上クックします。 その結果は平坦化され、このノードの1番目の入力のステージ上にサブレイヤーとして追加されます。
ループ変数 ¶
ブロック内のノード上では、現行の反復数(ITERATION
)と反復総数(NUMITERATIONS
)を含んだコンテキストオプションにアクセスすることができます。
他にも、一部の Iteration Method はITERATIONVALUE
変数を設定します。
この変数の内容は、その Iteration Method によって異なります。
例えば、Primsに対する反復の場合、このITERATIONVALUE
には、現行Primのシーングラフパスが格納されます。
以下の Iteration Method パラメータのヘルプを参照してください。
Tip
For Eachノードのパラメータを使ってループ変数の名前を変更することができます(以下参照)。 For-Eachループを入れ子化 している場合、ループレベル毎に異なる変数名になるように変数の名前を変更してください。そうすることで、それらのループ変数を分けることができます。
例えば、“For-Eachバリアントセット”ループがあって、そのループの中に“For-Eachバリアント”ループがあるとします。
外側ループの変数の名前をVARSET_ITERATION
、NUM_VARSETS
に変更し、内側ループの変数の名前をVARIANT_ITERATION
、NUM_VARIANTS
に変更することができます。
エクスプレッション内 ¶
ループ内でのエクスプレッション内でコンテキストオプションの値を取得するには、@name
を使用します。例:
@ITERATION
またはcontextoptionエクスプレッション関数を使用します:
contextoption("ITERATION")
例えば、/lights
Prim内に名前が/lights/light_0
から/lights/light_99
までの100個のライトを作成したいのであれば、ループブロック内にLightノードを配置して、その Primitive Path パラメータに以下のエクスプレッションを設定します:
/lights/light_`@ITERATION`
(文字列パラメータでは、エクスプレッションコードをバッククォートで閉じる必要があることを忘れないでください。)
Python内 ¶
ループ内でのPython内でコンテキストオプションの値を取得するには、hou.contextOption()関数を使用します。
loopnum = hou.contextOption("ITERATION")
ITERATIONVALUE
から情報を引き出すのは、Python拡張ライブラリのstring系関数とパス操作系関数を使用するのが便利だと思うかもしれません。
ループ内でhou.setContextOption()を使用しないでください。 コンテキストオプションはネットワークチェーンを下に伝搬するのではなくて 上 に伝搬します。 ループ内でエクスプレッションに使用する変数を定義したいのであれば、ネットワークのループ部分の最後でEdit Context Options LOP(通常では、For Each LOPの3番目の入力に直接接続します)を使用してください。
Tips ¶
-
ループブロックの頭にあるBegin Context Options Blockノードの Perform Layer Break パラメータのチェックを オン のままにします。
このオプションを無効にすると、Begin Context Options Blockノードより上流のすべてのノードが各ループに含まれるようになって、反復の度に無駄に結合されてしまいます(クックの度にこのデータは同じになるので無駄です)。
-
このブロックは、コンテキストオプションを使って反復系の変数を保持しているので、他のネットワークタイプのFor-Eachループとはまったく別に動作します。
-
選択したPrims上の特定のバリアントセット内のすべてのバリアントを編集するには:
-
Primsに対する外側“For Each Prim”ループを作成します。編集したいPrimsを選択するために、 Primitives パラメータを設定します。このループの
ITERATIONVALUE
変数の名前をPRIMPATH
に変更します。 -
内側“For Each Variant”ループを作成します。このループの
ITERATIONVALUE
変数の名前をVARIANTNAME
に変更します。 -
こうすることで、内側ループ内のノードにおいて、現行Primのシーングラフパスを
@PRIMPATH
、現行バリアントの名前を@VARIANTNAME
として指定してバリアントを編集できるようになります。
-
入力 ¶
First Input
この入力には、入力ステージを接続します。 このノードは、3番目の入力に接続されたノードをループさせた結果を平坦化してから、出力内でそれをこのステージ上の新しいレイヤーとしてオーバーレイします。
Second Input
Iteration Method には、1番目の入力からではなく、この入力からのPrims/バリアントセット/バリアントに対してループさせるオプションがあります。 これによって、修正されるステージとは別のステージを使って反復を駆動させることができます。
この入力内のデータは、 このノードの出力には決して含まれません 。 Iteration Method 設定に応じて反復を駆動させるために使用します。
Third Input
この入力は、反復毎に再クックされます。 このノードは、反復毎に生成されたレイヤーをまとめて平坦化し、その平坦化された結果を1番目の入力のステージ上に合成します。
パラメータ ¶
Iteration Method
このノードによるループの方法/何に対してループさせるか。
For Number of Iterations
設定した回数だけループさせます。 Iterations パラメータにエクスプレッションを使用することで反復回数を動的に駆動させることができます。
このメソッドは、ITERATION
(0から始まる現行ループカウント)と同じ値をITERATIONVALUE
に設定します。
For Each Primitive in First Input
(1番目の入力から) Primitives パラメータ内のプリミティブパターンで選択されたPrim毎にループさせます。
このメソッドは、現行PrimのフルパスをITERATIONVALUE
に設定します。
このオプションは、一連のPrimsに対して編集を行なうのに役立ちます。
For Each Variant Set in First Input
特定のPrim(またはPrims)上のバリアントセット毎にループさせます。 Primitives パラメータ内のプリミティブパターンは、(1番目の入力から)バリアントセットを保持しているPrim(s)を選択します。
このメソッドは、現行バリアントセットの名前をITERATIONVALUE
に設定します。
これを使うことで、バリアントセットにバリアントを追加または削除することができます。 “For Each Variant in First Input”を使って他のFor-Eachループを内側に入れ子化することで、各バリアントセット内のバリアント毎にループをさせることもできます。
For Each Variant in First Input
特定のPrim(またはPrims)上の指定した名前のバリアントセット内のバリアント毎にループさせます。 Primitives パラメータ内のプリミティブパターンは、(1番目の入力から)バリアントセットを保持しているPrim(s)を選択します。
このメソッドは、現行バリアントの名前をITERATIONVALUE
に設定します。
このメソッドは、バリアント選択を変更しません。
For Each String in Parameter
Iterate Over Strings パラメータで指定された文字列毎にループさせます。 反復回数は、そのパラメータで指定された別々の文字列の数によって決まります。
このメソッドは、そのパラメータから現行文字列をITERATIONVALUE
に設定します。
1番目の入力ではなく、2番目の入力のデータを使って反復を駆動するように選択することもできます。 何かしらの理由でループさせたいものが他のノードチェーン内にある場合は、そのノードチェーンを2番目の入力に接続することで、これらのオプションを使用することができます。 2番目の入力のデータは、このノードの出力には決して含まれません。 このデータは、“in Second Input”系のオプションのどれかを選択した場合に、反復を駆動させるためだけに使用されます。
Iterations
Iteration Method が“For Number of Iterations”の時、ここにはループの回数を指定します(このパラメータにエクスプレッションを使用することで、他の何かに基づいてループの回数を駆動させることができます)。
Primitives
Iteration Method が“For Each Primitive”, “For Each Variant Set”, “For Each Variant”の時、検索するPrimsを指定します。
Scene Graph TreeペインからPrimsをこのテキストボックス内にドラッグすることで、それらのパスを追加することができます。
または、テキストボックスの隣にある選択ボタンをクリックすることで、ビューア内でPrimsを選択することができます。
プリミティブパターンを使って高度なマッチングを行なうこともできて、(/path/to/prim.collection:name
を使うことで)コレクション内のすべてのPrimsにマッチングさせることもできます。
Variant Set
Iteration Method が“For Each Variant”の時、ループさせるバリアントセットの名前を指定します。
Iterate Over Strings
Iteration Method が“For Each String in Parameter”の時、ループさせる文字列のリストを指定します。 個々の文字列はスペースで区切ります。 文字列を引用符で閉じることで、スペースをその値に含めることができます。
Combine Iterations
Separate Layers
3番目の入力からの各反復が、出力内の新しいサブレイヤースタックに追加され、一番強い(最後の)反復から強い順でソートされ、次に2番目に強い(最後から2番目)の反復から強い順でソートされ、次に3番目といったようにソートされていきます。
これには、Layer Breakノードより上流にあるレイヤーが含まれるので、そのようなレイヤーを後のレイヤーすべてに対して引き続きコンテキストを用意することができます。
Separate Layers, File Layers Weakest
(上記の) Separate Layers と同様ですが、 ディスク上の既存のレイヤーファイル を参照したサブレイヤーは、LOPネットワークで純粋に作成されたどのレイヤーよりも 弱く なるように並べ替えられます。
これは、ファイルレイヤーのどれかで始まりそのレイヤーより上の新しいレイヤーに変更を適用するようなLOPノードストリームをいくつも結合する時に役立ちます。 これらのLOPノードストリームを結合した後では、LOPで編集されたすべての修正レイヤーは、ステージのサブレイヤーリスト内でお互いに隣接するようになります。 これによって、ディスクのレイヤーを平坦化することもなく、USD ROPによってそれらの新しいレイヤーすべてを単一レイヤーに平坦化することができます (通常の Separate Layers モードでは、ディスクのレイヤーはLOPsで作成されたレイヤーと交互に配置され、各LOPレイヤーはディスク上の新しい別レイヤーに保存する必要が出てきます)。
Note
ディスク上のレイヤーのオピニオンがLOPネットワークで作成されたオピニオンよりも強くなるように意図されている場合、このオプションだとステージを合成した結果を変えてしまう可能性があります。
Separate Layers, File and SOP Layers Weakest
(上記の) Separate Layers, File Layers Weakest と同様ですが、SOPノードから取り込まれたサブレイヤーもディスクから読み込まれたファイルと一緒にソートされ、LOPネットワークで純粋に作成されたどのレイヤーよりも弱くなります。
これは、SOPsから作成されたレイヤーを、LOPネットワークで作成されたレイヤーと一緒に平坦化するのではなくて、別レイヤーに保存したい時に役立ちます。
Flatten Layers
すべての反復からのすべてのレイヤーをまとめて単一出力レイヤーに平坦化します。
Layer Breakノードより上流にあるレイヤーは、平坦化する前に削除されるので、出力に寄与しません。
Flatten Into First Input Layer
すべての反復からのレイヤーを 1番目の入力 の アクティブレイヤー に平坦化します。
1番目の入力以外のLayer Breakノードより上流にあるレイヤーは、平坦化する前に削除されるので、出力に寄与しません。
Flatten Each Input
反復の度にレイヤーを平坦化して、その平坦化された反復を出力内の新しいサブレイヤースタックに追加します。
Layer Breakノードより上流にあるレイヤーは、平坦化する前に削除されるので、出力に寄与しません。
Strip Layers Above Layer Breaks
このオプションを有効にすると、このノードのすべての入力上のLayer Breakノードより上流で作成されたすべてのレイヤーを削除することができます。 通常ではLayer Breakノードは、For Eachループで生成されたデータをFor Each Beginノードよりも上流で作成されたデータから分離させたい時に使用するので、これがデフォルトのオプションになっています。 これによって、ループ外の重複するデータのコピーがステージに追加されないようになります。 しかし、異なる反復が異なるクックパスに従う時といった場合では、Layer Breakノードより上流にあるレイヤーを維持する方が都合が良い場合があります。 Combine Iterations の説明で触れられているように、そこで説明されているパラメータの値によっては、このオプションが無効になっているにも関わらずLayer Breakノードより上流にあるレイヤーが削除されてしまう可能性があります。
Set Last Modified Primitives from Iteration Input
このオプションを有効にすると、このノードの最後に変更されたプリミティブが、このノードの3番目の入力のクックのすべての反復から最後に変更されたプリミティブの和に設定されます。 このオプションを無効にすると、1番目の入力に設定されている最後に変更されたプリミティブがこのノードの最後に変更されたプリミティブとして使用されます。
Iteration Option Name
(0から始まる)現行ループ番号を格納するために、このノードが作成するコンテキストオプション変数の名前。 便宜的にこの名前を変更することで、入れ子ループが固有の名前を使用するようにすることができます。
Iteration Count Option Name
ループ回数を格納するために、このノードが作成するコンテキストオプション変数の名前。 便宜的にこの名前を変更することで、入れ子ループが固有の名前を使用するようにすることができます。
Value Option Name
Iteration Method 特有の情報(“For Number of Iterations”なら現行反復番号、“For Each Primitive”なら現行Primパス、“For Each Variant Set”ならバリアントセット名、“For Each Variant”ならバリアント名)を格納するために、このノードが作成するコンテキストオプション変数の名前。 便宜的にこの名前を変更することで、入れ子ループが固有の名前を使用するようにすることができます。
Iteration Range
これは、オプションでノードが普段実行する反復回数を特定の範囲内の開始から終了までに制限することができます。 これは、結果全体の“スライス”だけの効果を確認する時のデバッグで役に立ちます。
All Iterations
利用可能なすべての反復を実行します(これがデフォルトで、普段のオペレーションです)。
Single Iteration
First Iteration パラメータで指定されたループ番号のみを実行します。ループ番号は0
から始まります。
Range of Iterations
First Iteration 以上 Last Iteration 以下の範囲のみで反復を実行します。 例えば、 Iteration Method を“For Number of Iterations”、 Iterations を5に設定すると、0, 1, 2, 3, 4の反復番号が得られます。 Iteration Range を“Range”、 First Iteration を1、 Last Iteration を3に設定すると、1, 2, 3の反復番号のみが得られます。
First Iteration
Iteration Range が“Single”の時、この反復番号のみを実行します。 Iteration Range が“Range”の時、この番号から始まる反復のサブセットのみが実行されます。 1番目の反復の番号が0になります。
Last Iteration
Iteration Range が“Range”の時、 First Iteration 以上でこの Last Iteration 以下の反復のサブセットのみが実行されます。 1番目の反復の番号が0になります。