Houdini 19.5 ジオメトリ

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

On this page
Since 15.0

概要

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

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

ネットワークエディタ⇥ Tabメニューにある For-EachFor-Loop のメニューアイテムを使用することで、 Block Beginノードと Block Endノードがセットアップされ、ノードチェーン内でそれらのノードの間に配置されたノードをループさせることができます。

繰り返し

  1. ネットワークエディタ内で⇥ Tabを押してTabメニューを開き、 For-Loop with Feedback を選択してから、ネットワークエディタ内でその新しいノードを配置する位置をクリックします。

    このメニューアイテムは、お互いに接続された Block Begin SOPノードと Block End SOPノードを作成します。 さらに Block Begin SOPMethod パラメータが Fetch Feedback に設定されます。 つまり、これは最初のループの後、各ループを1つ前のループの出力から開始します。

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

    Warning

    すべてのジオメトリに作用し、 且つ ループ毎に新しいジオメトリを作成してしまうループを意図せずに作成してしまうことがあり、これはジオメトリのサイズやクッキング時間が指数関数的に増加します。 ループが思い通りに動作することが確認できるまで、最初は1、2回の反復のみから始めることをお薦めします。

  3. 処理したいジオメトリを Block Begin SOP入力 に接続します。

  4. Block Begin SOPBlock End SOP の間にノードを接続してジオメトリを処理します。

Tip

ループが原因でHoudiniが長時間のクックで動かなくなった場合、 ⎋ Escを押してクックをキャンセルすることができます。

以下のサンプルでは、For-Loopは2回の反復でボックスのすべてのフェースを押し出してスケーリングしています。

Tip

このループのタイプのポイントは、あるループの出力が次のループに対する入力になるということで、ループで作成するジオメトリは 蓄積 していきます。 あなたが実際に行ないたい事が同じノードを複数のコピーに1度だけ適用したいのであれば、代わりに Copy to Points SOPを使用してください。

Piece順(For-Each)ループ

Piece とは、通常では、同じpieceまたはnameアトリビュートの値を持つプリミティブのことです。 (例えば、 Shatterシェルフツールなどの)いくつかのHoudiniツールは、このタイプのパーティションアトリビュートを自動で作成します。

Block End SOPPiece Attribute パラメータを使用して、piece以外のアトリビュート名を指定することができます。 pieceアトリビュートが存在しなかった場合、このブロックは、入力ジオメトリのポイント単位またはプリミティブ単位でループします。

Warning

For-Eachループオペレーションの最後にポイントとプリミティブをマージすると、それらのポイントとプリミティブがピース毎に連続する範囲に並ぶようになります。 これが原因で元々のポイント順とプリミティブ順が変わってしまう可能性があります。

  1. ネットワークエディタ内で⇥ Tabを押してTabメニューを開き、 For-Each Primitive を選択してから、ネットワークエディタ内でその新しいノードを配置する位置をクリックします。

    このメニューアイテムは、お互いに接続された Block Begin SOPノードと Block End SOPノードを作成します。 さらに Block Begin SOPMethod パラメータが Extract Piece or Point に設定されます。 つまり、これは各ループを入力の別々のピースから開始します。

  2. Block End SOP を選択し、 Piece Elements パラメータに、反復させるピースのタイプ(ポイントまたはプリミティブ)を設定します。通常では、これはプリミティブです。

Note

Block End SOPMax Iterations パラメータを設定しなかった場合、For-Eachループは、入力内のピース毎にループするようになります。

以下のサンプルでは、For-Eachループは、砕けたトーラスのピースをループさせて、 Mountain SOPを各ピースに個別に適用します。

複数入力

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

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

  1. ネットワークエディタ内で⇥ Tabを押してTabメニューを開き、 For-Loop with Feedback を選択してから、ネットワークエディタ内でその新しいノードを配置する位置をクリックします。

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

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

    • Method パラメータを Extract Piece or Primitive に設定します。

    • 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 SOPFetch Metadata メソッドを使用することで、この情報を取得することができます。

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

  2. Block Begin SOP を選択してから、パラメータエディタで Create Meta Import Node をクリックします。

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

    Detailアトリビュートは以下のとおりです:

    numiterations

    反復の必要合計数で、ループの Block End SOPMax Iterations パラメータと Single Pass パラメータを考慮します。

    iteration

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

    value

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

    単純な反復ループでは、これは、 Block End SOPStart 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 SOPIterations パラメータと Max Iterations パラメータが計算されるので、それらのパラメータを使用することで、ループの結果を利用してループを早期に停止することができます。

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

Note

  • この条件はループが処理される に評価されます。

  • これは、まだコンパイルブロックには 対応していません

ループのデバッグとテスト

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

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

Tips

  • Block Begin SOPでは、グループによるピースの指定が できません 。グループは必ずしも重複していないとは限らないので、それらをピースに変換するには非常に時間がかかります。ジオメトリがグループを使用してピースを区別している場合、 Name SOPName from Groups パラメータを使用して、グループからアトリビュートを作成し、その作成したアトリビュートにより分割することができます。

  • ループでノードを取り囲んでいるブロブ(枠)のカラーは、 Block Begin SOP Block End SOPのカラーから生成されます。ブロブ(枠)のカラーを変更するには、単にこれらのノードのどれかのカラーを変更するだけです。

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

See also

ジオメトリ

学ぼう

モデリング

地形

粉砕

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

次のステップ

導師レベル