Houdini 18.5 ジオメトリ

ジオメトリネットワークでのループ

On this page
Since 15.0

概要

通常、Houdiniは、ジオメトリネットワークでノードを上から下へ処理し、各ノードの出力を次のノードの入力へ送り、ディスプレイフラグやレンダーフラグを持つノードまで下がっていきます。 しかし、 ループ : つまり、同じチェーンのノードを何度も実行するほうが便利な場合があります。

ループには3つの主要な使い方があります:

ネットワークエディタのTabメニューにある"For Loop"と"For Each Loop"のツールは、Block BeginノードとBlock Endノードをセットアップします。 ここで、最初と最後の間でノードがループします。

繰り返し

  1. ネットワークエディタで、⇥ Tabメニューを開き、"For loop"を選択します。

    このツールは、お互いに接続されたBlock BeginBlock Endを作成します。 Block Beginの Method パラメータは"Fetch Feedback"に設定されます。つまり、これは最初のループの後、各ループを1つ前のループの出力から開始します。

  2. Block Endノードを選択して、 Iterations パラメータを、実行したいループ回数に設定します。

    Warning

    ループが思い通りに動作することが確認できるまで、 最初は1〜2回の反復のみ から始めるようにしてください。 すべてのジオメトリに作用し、 且つ ループ毎に新しいジオメトリを作成してしまうループを意図せずに作成してしまうことがあり、これはジオメトリのサイズやクッキング時間が指数関数的に増加します。 尚、Houdiniが長時間のクックで動かなくなった場合、 ⎋ Escを押してクックをキャンセルすることができます。

  3. 処理したいジオメトリをBlock Begin内へ接続します。

  4. ノードを接続して、Block BeginとBlock End間でジオメトリを処理します。

このサンプルでは、ボックスのすべてのフェースを押し出してスケーリングするという2つの反復だけを実行します。

Note

このループのタイプのポイントは、あるループの出力が次のループに対する入力になるということで、ループで作成するジオメトリは 蓄積 していきます。 同じノードを複数のコピーに1度だけ適用したい場合は、Copyノードを使用します。

Piece順(for-each)ループ

"Piece"とは、通常では、同じpieceまたはnameアトリビュートの値を持つプリミティブのことと定義します。 Shatterのようないくつかのツールは、このタイプのパーティションアトリビュートを作成します。 Block EndノードTemplate Attribute パラメータ(このパラメータは、Block Beginの入力を接続している場合のみ使用可能)を使用して、piece以外のアトリビュート名を指定することができます。

テンプレートアトリビュートが存在しない場合、ブロックは、ポイントまたはプリミティブ毎にループします。

  1. ネットワークエディタで、⇥ Tabメニューを開き、"For Each Loop"を選択します。

    このツールは、お互いに接続されたBlock BeginBlock Endを作成します。 Block Beginの Method パラメータは"For Each Loop"に設定されます。つまり、これは各ループを入力の別々のピースから開始します。

  2. Block Endノードを選択し、 Template Class を、反復させるピースのタイプ(ポイントまたはプリミティブ/フェース)に設定します。通常では、これはプリミティブです。

    尚、反復回数を設定しないと…ループは、入力内の各ピースをただ繰り返すだけです。

このサンプルでは、砕け散ったトーラスのピースを繰り返し、Mountainを各ピースに個別に適用します。

複数入力

ループは、2個以上のBlock Beginノードを持つことができます。 従って、例えば、その入力の Piece順 を取得するネットワークのブランチもあれば、そのPieceを使用した結果を単に繰り返し蓄積するブランチもあります。

このループタイプに関するよく知られた例は、穴の開いたスイスチーズの作成です: 単純な繰り返しを使用して、2番目の入力ジオメトリからのピース(気泡)をループすることにより、ある入力ジオメトリ(チーズの塊)を処理する結果を蓄積します。

  1. ネットワークエディタで、⇥ Tabメニューを開き、"For Loop"を選択します。

    このループブランチは、チーズの塊への変更を蓄積する働きを実行します。

  2. 別のBlock Beginノードを作成します。

    • Method パラメータを"Fetch Piece"に設定します。

    • Block Path パラメータを既存ループのBlock Endへ設定します。パラメータの横にあるノード選択ボタンを使用、またはネットワークエディタからBlock Endを、パラメータエディタのパラメータ上へドラッグすることができます。

    このループブランチは、泡のジオメトリから各泡を取り出す働きを実行します。

以下は、2つのループブランチを使用して、スイスチーズを作成するサンプルネットワークです。

1

チーズの塊を表すボックスからスタートし、それをVDBに変更します。

2

ボックス内にいくつかのポイントをばら撒き、球体をそれらのポイントにコピーして、気泡を表現します。

3

最初のBlock Beginは、入力としてVDBの"チーズの塊"を取得し、ループ内に変更を蓄積する単純な繰り返しです。

4

2番目のBlock Beginは、入力として"気泡"を取得し、各プリミティブの球体をループします。この下で、球体をVDBに変更します。

"チーズの塊"VDBを"気泡"VDBの2番目の入力(5)内に接続して、チーズの塊から解像度設定をコピーするようにします。

3

ループ内でVDB Combineを使用して、チーズの塊からVDBの球体を減算します。

現行のループに関する情報の取得方法

ループ内の1つのノードでのエクスプレッションで、現行のループや現行のピースの数が必要な時があります。"Fetch Metadata"Block Beginノードを使用すると、この情報を取得することができます。

  1. 前述の説明通りに、ループブロックをセットアップします。

  2. Block Beginノードを選択します。パラメータエディタで Create Meta Import Node をクリックします。

    このボタンは、既存のBlock Beginノードの方に2個目のBlock Beginノードを追加します。このノードは、いくつかのDetailアトリビュートを持った空っぽのジオメトリが生成されるようにセットアップされます。

    numiterations

    反復の予想合計数で、Block Endの Max IterationsSingle Pass パラメータを考慮します。

    iteration

    現行の反復数で、常に0から始まり、各ループで1ずつ増加します。

    value

    Piece順ループでは、これはアトリビュートの現行の値です。例えば、pieceの整数またはnameの文字列(または、アトリビュートがない場合、現行のポイントまたはプリミティブの番号)です。

    単純な反復ループでは、これは、Block Endの Start Value から始まる浮動小数点値で、ループ毎に Increment だけ増加します。

    ivalue

    単純な繰り返しでは、これはvalueの整数バージョンです。これは、値がもちろん整数(例えば、1で始まり、2で増分)の場合や、値が240,00,000(浮動小数点が精度を失う値)を超える可能性がある場合に役立ちます。

  3. ループ内のノードでこれらのアトリビュートの値を取得するには…

    • Houdiniのエクスプレッションで、detailエクスプレッション関数を使用します。

      例:

      detail("../block_begin2", "iteration", 0)
      
    • Attribute wrangleで、detailVEX関数を使用します。

    • Pythonでは、hou.Geometry.attribValue()を使用します:

      node("../block_begin2").geometry().attribValue("iteration")
      

停止条件

Block Endノードの Stop Condition パラメータが、反復前に1に評価されると、ループが停止します。 これにより、一定の条件をテストするエクスプレッションを書くことができます。 例えば、フィードバックループでのポリゴン数が一定の閾値を通過した場合にループを停止することができます。

デバッグとテストループ

  • Block Endノードで Max Iterations パラメータを設定することで、ループの反復から抜けることができます。例えば、1からループを開始して増加させ、各ループでの結果を確認します。

  • Piece順ループでは、Block Endノードの Single Pass パラメータにより、個々のピース/反復の出力を確認することができます。

Tips

  • このノードでは、グループによるピースの指定ができません。グループは必ずしもばらばらではないため、それらをピースに変換するには非常に時間がかかります。ジオメトリがグループを使用してピースを指定する場合、Nameノードの"Name from Groups"機能を使用して、グループからアトリビュートを作成し、その作成したアトリビュートにより分割することができます。

  • ループでノードを取り囲んでいるブロブ(枠)のカラーは、Block BeginとBlock Endのノードのカラーから生成されます。これらのノード内の1つのノードのカラーを変更して、ブロブ(枠)のカラーを変更します。

  • ブロブ(枠)を非表示/表示するには、 Display Optionsボタンをクリックするか、ネットワークエディタでDを押します。Network Display Optionsウィンドウで、 Network View ▸ Display サブタブをクリックして、 Display complex hulls をオンまたはオフにします。

  • 現段階では、Block BeginとBlock Endノード間のノードのみがブロブ(枠)に含まれます。残念ながら、ブロブ(枠)は、チャンネル参照に依存することから、ループに含まれるノードを包み込んでしまいます。これは、現在の実装における制限事項です。

See also

ジオメトリ

学ぼう

モデリング

地形

粉砕

破壊を参照してください。

次のステップ

導師レベル