On this page | |
Since | 15.0 |
概要 ¶
通常、Houdiniは、ジオメトリネットワークでノードを上から下へ処理し、各ノードの出力を次のノードの入力へ送り、ネットワーク内でディスプレイフラグやレンダーフラグが有効になっているノードまで下がっていきます。 しかし、 ループ によって同じノードチェーンを何度も実行するほうが便利な場合があります。
ループには3つの主要な使い方があります:
-
例えば、複数のノイズレイヤーを追加したり、すべてのフェースを何度も押し出すことにより複雑なプロシージャルジオメトリを作成したい場合です。
-
例えば、同じ編集を瓦礫のそれぞれの石に適用したい場合です。
-
別のジオメトリの各ピースを使って、あるジオメトリを処理する場合。
これに関するよく知られた例は、 穴の開いたスイスチーズの課題 です。 その回答は、一連の気泡内で、各球体を何度もループさせ、チーズの塊からそれを差し引きます。
ネットワークエディタの⇥ Tabメニューにある For-Each と For-Loop のメニューアイテムを使用することで、Block BeginノードとBlock Endノードがセットアップされ、ノードチェーン内でそれらのノードの間に配置されたノードをループさせることができます。
繰り返し ¶
-
ネットワークエディタ内で⇥ Tabを押してTabメニューを開き、 For-Loop with Feedback を選択してから、ネットワークエディタ内でその新しいノードを配置する位置をクリックします。
このメニューアイテムは、お互いに接続されたBlock Begin SOPノードとBlock End SOPノードを作成します。 さらに Block Begin SOP の Method パラメータが Fetch Feedback に設定されます。 つまり、これは最初のループの後、各ループを1つ前のループの出力から開始します。
-
Block End SOP ノードを選択して、 Iterations パラメータを、実行したいループ回数に設定します。
Warning
すべてのジオメトリに作用し、 且つ ループ毎に新しいジオメトリを作成してしまうループを意図せずに作成してしまうことがあり、これはジオメトリのサイズやクッキング時間が指数関数的に増加します。 ループが思い通りに動作することが確認できるまで、最初は1、2回の反復のみから始めることをお薦めします。
-
処理したいジオメトリを Block Begin SOP の 入力 に接続します。
-
Block Begin SOP と Block End SOP の間にノードを接続してジオメトリを処理します。
Tip
ループが原因でHoudiniが長時間のクックで動かなくなった場合、 ⎋ Escを押してクックをキャンセルすることができます。
以下のサンプルでは、For-Loopは2回の反復でボックスのすべてのフェースを押し出してスケーリングしています。
Tip
このタイプのループでは、あるループの出力が次のループに対する入力になるということで、ループで作成するジオメトリは 蓄積 していきます。 あなたが実際に行ないたい事が同じノードを複数のジオメトリコピーに1度だけ適用したいのであれば、代わりにCopy to Points SOPを使用してください。
Piece順(For-Each)ループ ¶
Piece とは、通常では、同じpiece
またはname
アトリビュートの値を持つプリミティブのことです。
(例えば、Shatterシェルフツールなどの)いくつかのHoudiniツールは、このタイプのパーティションアトリビュートを自動で作成します。
Block End SOPの Piece Attribute パラメータを使用して、piece
以外のアトリビュート名を指定することができます。
piece
アトリビュートが存在しなかった場合、このブロックは、入力ジオメトリのポイント単位またはプリミティブ単位でループします。
Warning
For-Eachループオペレーションの最後にポイントとプリミティブをマージすると、それらのポイントとプリミティブがピース毎に連続する範囲に並ぶようになります。 これが原因で元々のポイント順とプリミティブ順が変わってしまう可能性があります。
-
ネットワークエディタ内で⇥ Tabを押してTabメニューを開き、 For-Each Primitive を選択してから、ネットワークエディタ内でその新しいノードを配置する位置をクリックします。
このメニューアイテムは、お互いに接続されたBlock Begin SOPノードとBlock End SOPノードを作成します。 さらに Block Begin SOP の Method パラメータが Extract Piece or Point に設定されます。 つまり、これは各ループを入力の別々のピースから開始します。
-
Block End SOP を選択し、 Piece Elements パラメータに、反復させるピースのタイプ(ポイントまたはプリミティブ)を設定します。通常では、これはプリミティブです。
Note
Block End SOP の Max Iterations パラメータを設定しなかった場合、For-Eachループは、入力内のピース毎にループするようになります。
以下のサンプルでは、For-Eachループは、砕けたトーラスのピースをループさせて、Mountain SOPを各ピースに個別に適用します。
複数入力 ¶
ループは、2個以上のBlock Begin SOPノードを持つことができます。 例えば、その入力の Piece順 を取得するネットワークのブランチもあれば、そのPieceを使用した結果を単に繰り返し蓄積するブランチもあります。
このループタイプに関するよく知られた例は、 穴の開いたスイスチーズ の作成です。 その例では、単純な繰り返しを使用して、2番目の入力ジオメトリからのピース(気泡)をループすることにより、ある入力ジオメトリ(チーズの塊)を処理する結果を蓄積します。
-
ネットワークエディタ内で⇥ Tabを押してTabメニューを開き、 For-Loop with Feedback を選択してから、ネットワークエディタ内でその新しいノードを配置する位置をクリックします。
このループブランチは、チーズの塊への変更を蓄積する処理を実行します。
-
もう1つBlock Begin SOPノードを作成します。
-
Method パラメータを Extract Piece or Point に設定します。
-
Block Path パラメータを既存ループのBlock Endに設定します。
このパラメータの横にあるノード選択ボタンを使用、または、ネットワークエディタからそのBlock Endをパラメータエディタのパラメータフィールド上へドラッグすることができます。
このループブランチは、泡のジオメトリから各泡を取り出す処理を実行します。
-
以下のサンプルでは、ネットワーク内の2つのループブランチを使用してスイスチーズを作成します。
1
このネットワークは、 チーズの塊 を表すボックスからスタートし、それをVDBに変換します。
2
ボックス内にポイントをばら撒き、球体をそれらのポイントにコピーして、気泡を表現します。
3
最初のBlock Beginは、入力としてVDBのチーズの塊を取得し、ループ内に変更を蓄積する単純な繰り返しです。
4
2番目のBlock Beginは、入力として 気泡 を取得するためにExtract Pieceメソッドを使用し、各プリミティブの球体をループさせます。そして下流で、それらの球体をVDBに変換します。
チーズの塊VDBを気泡VDBの2番目の入力( 5 を参照)に接続して、チーズの塊から解像度設定をコピーするようにします。
3
ループ内でVDB Combineを使用して、チーズの塊からVDBの球体を減算します。
現行のループに関する情報の取得方法 ¶
後で同じループ内のノードで現行ループに関する何かしらの情報を使用したい場合があります。 Block Begin SOPで Fetch Metadata メソッドを使用することで、この情報を取得することができます。
-
前述の説明通りに、ループブロックをセットアップします。
-
Block Begin SOP を選択します。パラメータエディタで Create Meta Import Node をクリックします。
このボタンは、既存のBlock Begin SOPの方に2個目の Block Begin SOP を追加します。 この2個目のノードは、いくつかのDetailアトリビュートを持った空っぽのジオメトリが生成されるようにセットアップされます。 Detailアトリビュートは以下のとおりです:
numiterations
反復の必要合計数で、ループのBlock End SOPの Max Iterations パラメータと Single Pass パラメータを考慮します。
iteration
現行反復番号で、常に
0
から始まり、ループの度に1ずつ増加します。value
Piece順ループでは、これはアトリビュートの現行の値です。例えば、
piece
の整数またはname
の文字列(または、アトリビュートがない場合、現行のポイントまたはプリミティブの番号)です。単純な反復ループでは、これは、 Block End SOP の Start Value から始まる浮動小数点値で、ループ毎に Increment だけ増加します。
ivalue
単純な繰り返しでは、これは
value
の整数バージョンです。これは、値がもちろん整数(例えば、1
で始まり、2
で増分)の場合や、値が240,00,000(浮動小数点が精度を失う値)を超える可能性がある場合に役立ちます。 -
ループ内のノードでこれらのアトリビュートの値を取得するには、以下の操作を行ないます:
-
Houdiniのエクスプレッションでは、detailエクスプレッション関数を使用します。
例:
detail("../block_begin2", "iteration", 0)
-
Attribute wrangleでは、detailVEX関数を使用します。
-
Pythonでは、hou.Geometry.attribValueを使用します:
node("../block_begin2").geometry().attribValue("iteration")
-
停止条件 ¶
ループを開始する前にBlock End SOPの Iterations パラメータと Max Iterations パラメータが計算されるので、それらのパラメータを使用することで、ループを早期に停止することができます。
Block End SOP の Stop Condition パラメータを反復前に1
に評価させると、ループが停止します。
これにより、一定の条件をテストするエクスプレッションを書くことができます。
例えば、フィードバックループでのポリゴン数が一定の閾値を通過した場合にループを停止することができます。
Note
-
この条件はループが処理される 前 に評価されます。
-
これは、まだコンパイルブロックには 対応していません 。
ループのデバッグとテスト ¶
-
Block End SOPで Max Iterations パラメータを設定することで、ループの反復から抜けることができます。例えば、
1
からループを開始して増加させ、各ループでの結果を確認することができます。 -
Piece順ループでは、 Block End SOP の Single Pass パラメータを使用することで、個々のピース/反復の出力を確認することができます。
Tips ¶
-
Block Begin SOPでは、グループによるピースの指定が できません 。グループは必ずしも重複していないとは限らないので、それらをピースに変換するには非常に時間がかかります。ジオメトリがグループを使用してピースを区別している場合、Name SOPの Name from Group パラメータを使用して、グループからアトリビュートを作成し、その作成したアトリビュートにより分割することができます。
-
ループでノードを取り囲んでいるブロブ(枠)のカラーは、Block Begin SOPとBlock End SOPのカラーから生成されます。ブロブ(枠)のカラーを変更するには、これらのノードのどれかのカラーを変更するだけです。
-
現段階では、Block Begin SOPとBlock End SOPの間に接続されているノードのみがブロブ(枠)に含まれます。残念ながら、ブロブ(枠)は、チャンネル参照に依存することから、ループに含まれるすべてのノードを包み込んでしまいます。これは、現在の実装における制限事項です。
See also |