2021-08-29

Skinning Converter 2

ここでは Skinning Converter を複数のメッシュに対して実行する手順を紹介する。単一メッシュへの操作はこちらを参照のこと。


使用したビルド:

  • Houdini FX 18.5.640 (AutoDopNetwork 内でも作業するので FX が必須)

1. ベースメッシュの作成

Rubber Toy を元にソフトボディにするためのベースとなるメッシュを作成する。これには、足のめり込み部分を削除、PolyReduce ノードでポリゴン数を削減する。なお、Boolean 操作とそれに伴うポリゴン表示に関してはこちらのページを参照。

  1. Houdini を起動、ビューポートで TAB キーを押し、メニューから Test Geometry: Rubber Toy を選択、Enter キーを押して確定。
      ネットワークエディタには testgeometry_rubbertoy_object1 というノードが出来る。
  2. ネットワークエディタで testgeometry_rubbertoy_object1 をダブルクリックなり、選択して I キーまたは Enter キーで中に入る。
      そこには testgeometry_rubbertoy1 というノードがある。
  3. Boolean ノード (boolean1) を作成、testgeometry_rubbertoy1 の出力を boolean1 の左側の入力に接続する。
    1. Operation を Subtract から Intersect に変更。
    2. Detriangulate は All Polygons のまま。
  4. PolyReduce ノード (polyreduce1) を作成し、boolean1 の出力に接続。
    • Percent to Keep を 20% ぐらいに。
    • Preserve Quads をオンにする。
  5. polyreduce1 の出力に Clean ノード (clean1) を接続。 設定はデフォルトのまま。
      Clean ノードにより無効な形状データがあった場合でも削除される。
  6. clean1 の出力に Null ノードを接続。 ノード名を MESH とする。

      ここまでの処理で、ポリゴン数が2400弱の無駄のないメッシュになるはず。さらに減らしたい場合は、polyreduce1 で % 値を下げる。

なお、このような処理は、エフェクトメッシュに対し常に必要ということではない。処理中にボリュームに変換される場合や、Boolean ノードが別途使われている場合などは不要。

2. メッシュの複製

#1 で作成したメッシュをまずは複製する。

  1. /obj/testgeometry_rubbertoy1 の中で Sphere ノード (sphere1) を作成。
    • Primitive Type を Polygon
    • Uniform Scale を 4
    • Frequency を 8 ぐらい
    にする。
  2. sphere1 の出力に IsoOffset ノード (isooffset1) を作成。
    • Uniform Sample Division を20くらいにする (いくつでも多分問題ない)。
  3. isooffset1 の出力に Scatter ノード (scatter1) を作成。
    • Force Total Count を10にする。
  4. Copy to Points ノード (copytopoints1) を作成。
    • 左の入力に MESH の出力を、右の入力に scatter1 の出力を接続する。

      すると点の部分に RubberToy がコピーされるが、すべて同じ方向を向いていて面白みに欠ける。
  5. scatter1 と copytopoints1 の間に Attribute Randomize ノード (attribrandomize1) を挿入。
    • Attribute Name に orient と入力。
    • Distribution タブ以下の Dimensions を 4 にする。
      以下のように各 Rubber Toy がランダムな方向を向くようになる。

      orient アトリビュートは Quarternion なので 4つの要素が必要となる。この説明はこちらを参照。特にこれの Part2。

3. name アトリビュートの追加

結論を先に述べると、Skinning Converter で複数のメッシュを別々に扱うためには Primtives に対し name アトリビュートを定義し、Use Name Attribute for Weighting をオンにすることが必要。ここでは、このための name アトリビュートを定義する。

  1. Enumerate ノード (enumerate1) を作成、attribrandomize1 と copytopoints1 の間に挿入。各値はそのまま。
      重要なことは index というアトリビュートが Points に対し integer (整数) で定義されていること。
  2. copytopoints1 を選択、Attributes from Target を 4 にし、一番下に追加された部分で
    • Apply to を Primitives に
    • 操作は Copying のまま
    • Attributes に index と挿入。
  3. copytopoints1 の出力に Attribute Wrangle ノード (attribwrangle1) を追加。
    • Run Over を "Primitives" に変更。
    • 以下のコードを入力。
      @name = "Toy-" + itoa(i@index);
    正しく設定されていれば、attribwrangle1 を選択して Geometry Spreadsheet で Primitives を表示、下の方にスクロールした際には、index と name が 0 と Toy-0 から 9 と Toy-9 になっているはず。
  4. attribwrangle1 の出力に NULL を追加、名前を OUT としてこの部分は終了。

4. ソフトボディシミュレーションの設定

  1. Vellum シェルフから Vellum Strut Softbody を実行、ビューポートで Rubber Toy を選択して Enter キーで確定。
      シーンレベル (/obj) に戻ると、AutoDopNetwork と softbody_vellum の二つが追加されているのがわかる。
  2. /obj にいるまま、Create シェルフから Sphere ノードを Ctrl+クリック。sphere_object1 ができるので、その中に入る。
  3. sphere1 を選択、以下の操作を行う。
    • Primitive Type を Polygon Mesh から Polygon に。
    • Uniform Scale を 7 ぐらい
    • Frequency を 6 ぐらい
  4. Collision シェルフの Static ツールをクリック。ビューポートで作成した球を選択して確定。
  5. AutoDopNetwork の中に入り、sphere_object1 を選択
    • Display Geometry をオフにし、球が見えないようにする。
    • Collisions > RBD Solver > Volume にある Invert Sign をオンにして、球の内側が衝突面となるようにする。
    最初の120フレーム再生すると、柔らかくなった RubberToy が落下するだけで面白みに欠ける。

    このムービーは FlipBook したものを QuickTime で出力し、Camtasia Studio で Motion Gif にしている。
  6. よって Noise Field ノード (noise) を作成。gravity1 の広い方の入力に接続。

    noise1 の
    • Minimum Value を -3, -3, -3
    • Maximum Value を 3, 3, 3
    とする。再生すると、以下の通り。
これを Skinng Converter に渡す。

5. Skinning Converter (再)

再びながら、Skinning Converter の概要はこちらを参照のこと。

  1. シーンファイルを保存し、キャッシュファイルなどが分かり易いようにする (例: skinningconverter_multi.hip)
  2. /obj/softbody_vellum に入る。
  3. ネットワークの下から2番目にある vellum_io を選択、Save to Disk ボタンをクリック、シミュレーション結果を一度ファイル出力する。
  4. 出力が終わったら、Load from Disk トグルをオンにして、ここより下流のノードがシミュレーションを再計算せず、キャッシュを読むようにする。
  5. 1フレーム目に戻っているのを確認し、vellumpostprocess1 の出力に Labs SKinning Converter ノード (skinning_converter1) を接続。
  6. Use Name Attribute Weighting をオンにする。
      前述の通り、これには name アトリビュートの定義が必須。
  7. Bone Deform ノード (bonedeform1) を作成、skinning_converter1 の出力3つを入力に順番に接続し、表示フラグを bonedeform1 に移す。再生すると以下の通り。

リンク

0 件のコメント:

コメントを投稿