2018-04-14

voronoi for each

Voronoi Fracture と For Each ループを組み合わせて、例えば、オブジェクトの下半分だけさらに細かく割れるような RBD シミュレーションを作成する。



使用したバージョン: Houdini 16.5.439
シーンファイルへのリンクは一番下にあり。

1. 一次フラクチャ

最初に大まかなフラクチャを作成する。

  1. Create シェルフの Box ツールを Ctrl キーを押しながらクリック。
      box_object1 が原点に作成される。
  2. Translate Y を 2 に設定。
  3. box_object1 を選択したまま Model シェルフの Shatter ツールを実行。
      box_object1 ノード内に converttofog1, chunkcenters, voronoifractures1 の3つのノードが追加され、voronoifracture1 に表示フラグが設定された。
  4. chunkcenters ノードを選択、Force Total Count を 50 (ぐらい) に設定。
  5. 右側の Rigid Bodies シェルフの RBD Fractured Object ツールを実行。
    • 表示されるダイアログパネルでは、RBD Packed Object を選択。
    • box_object1 を選択し、Enter キーを押して確定。
  6. Collisions シェルフから Ground Plane ツールを実行。
  7. 最終フレームを120にして再生すれば、以下の通り(のはず)。
ここまでが 1_rbd_base.hip 。

2. For Each ループによる二次フラクチャ

次に #1 で生成したそれぞれの破片をもう一度フラクチャを実行する。

  1. ネットワークエディタで box_object1 ノードをダブルクリックするか i キーを押して中に入る。
      #1-3 実行後では4つしかなかったのでネットワークにさらにノードが追加されているのがわかる。
  2. ネットワークエディタ内で TAB->For Each Connected Piece を実行。Enter キーを押してノードをネットワークエディタ内にとりあえず配置。
      connectivity1、foreach_begin1、foreach_end1 のつ3つがつながったネットワークが追加された。
  3. #1-3 で追加されたフラクチャノード3つを選択、Ctrl+C (コピー)、Ctrl+V
  4. Y キー押しながら、元のネットワークから切り取る。
  5. 切り取った3つのノードを foreach_begin1 と foreach_end1 の間に挿入する。
  6. foreach_begin1 の出力を voronoi_fracture2 の左の入力にも接続する。
  7. 新しくコピーした chunkcenter1 の Force Total Count を 10 に戻しておく。
  8. connectivity1 から foreach_end1 までのネットワークを、voronoifracture1 と rest1 の間に挿入する。つまり、
    • voronifracture1 の出力を connectivity1 の入力に接続。
    • foreach_end1 の出力を rest1 に接続、既存の接続を置換する。
  9. ここまでの結果を再生すると、奇妙なシミュレーション結果になる。
  10. setup_packed_prims を選択、Create Name Attribute をオンにする。再生すれば、シミュレーションには先ほどよりも時間がかかるが、以下の通り。

    これで、2次フラクチャも正しくシミュレーションされるようになったが、なんとなくうそっぽいシミュレーション結果になってしまったのと、これであればループを使わずに最初のフラクチャでForce Total Count を増やしたこととあまり変わらない。
ここまでが 2_rbd_loop.hip 。次の工程でループがかかる部分を調整する。

3. For Each ループのコントロール

For ループをすべてのピースにかけるのではなく、一部のピースのみにかかるようにする。

  1. TAB->Split を実行、出来た split1 を connectivity1 と foreach_begin1 の間に挿入。
    • Group に 0-24 (つまりForce Total Count で設定した50の最初の25個) と入力
    • Group Type を Primitives に設定する。
    • しかし、この結果で得られたのは、24個のピースではなく、24個のプリミティブ(面)。
  2. TAB->Assemble を実行、出来た asssemble2 を connectivity1 と split1 の間に挿入し、assemble2 で
    • Create Name Attribute をオフにする。
    • Create Packed Geometry をオンにする。
    これにより split2 で正しく25個のピースを分けることが出来るようになった。
  3. TAB->Unpack を実行、出来た unpack1 を split1 と foreach_begin1 の間に挿入。
      これにより、Assemble を上流で追加した結果を緩和する。
  4. TAB->Merge を実行、出来た merge1 を foreach_end1 と rest1 の間に挿入。
  5. split1 の2番目(右) の出力を merge1 に接続。再生すれば以下の通り。

    これはこれで良いかもしれないが、下半分だけが細かく割れてほしい。
  6. TAB->Sort を実行、出来た sort1 を assemble2 と split1 の間に挿入。
    • sort1 の Primitive Sort を By Y に設定。
    これにより、For Loop にわたる 0-24 がBox の下半分になる。
  7. 再生すればこの通り。
  8. 上流の box1 の直下に switch ノードを追加、voronoifracture1 と converttofog1 の両方に接続するようにして、二つ目の入力として、 Rubber Toy を作成。

    入力を切り替えれば、一番上の画像の通り。
ネットワーク全体は以下の通り。merge1 と rest1 の間に Normal ノードを挿入し、Cusp Angle を30ぐらいにして法線を正しく処理している。

ここまでが 3_rbd_final.hip 。

シーンファイル

  • rbd_for_loop.zip 214KB
    • 1_rbd_base.hip: #1 最後までのファイル
    • 2_rbd_loop.hip: #2 最後までのファイル
    • 3_rbd_final.hip: #3 最後までのファイル

0 件のコメント:

コメントを投稿