2019-12-22

PaintFX-like Outlines in Houdini


ここでは、M@ya に搭載されている、PaintFX のToon Outline に近いジオメトリによるアウトライン生成方法の考え方を紹介する。

これは、Houdini Advent Calendar 2019 の 23日目の記事です。



使用したビルド: Houdini 18.0.318 (Windows 10)
シーンファイルへのリンクは一番下にあり。

1. 基本的な流れ

  1. Rubber Toy を作成 (他のテストジオメトリでも良い)。
      testgeometry_rubbertoy1 が作成される。
  2. ビューを操作して、RubberToy が画角の中央に来るようにしたあと Lights and Cameras シェルフの Camera ツールを Ctrlキーを押しながらクリック。
      /obj1/camera1 ができる。
  3. Geometry ノードを作成、outline と名前を変更し、中に入る。
  4. outline の中で、Object Merge を作成、できた object_merge1 の Object1 に /obj/testgeometry_rubbertoy_object1/testgeometry_rubbertoy1 を設定する。
  5. object_merge1 の出力に Delete ノードを接続。
      delete1 ノードができる。
  6. delete1 のNormal タブに行き、
    • Enable をオン
    • Backface from に /obj/cam1 を指定。
  7. delete1 に表示フラグを設定し、画角をロックしているのであれば、アンロックした後にカメラをタンブルして Rubber Toy の反対側に行けば、カメラから反対に法線の向いた面が削除されているのがわかる。

    Hide Other Objects が有効な状態。
  8. ビューポート右上の No cam となったところから cam1 を選択すれば、元のビューに戻ることができる。
  9. delete1 の出力に Divide に作成、できた divide1 で Remove Shared Edges をオンにする。

    これに表示フラグを付ければジオメトリ全体が真っ黒になるが今は気にしない。
  10. divide1 の出力に Primitive ノードを作成、できた primitive1 で Face/Hull タブに行き、
    • Close U を Unroll with New Points とする。
    primitive1 に表示フラグを合わせれば、以下のようになる。
  11. primitive1 の出力に PolyWire ノードを作成、出来た polywire1 で
    • Wire Radius を 0.01
    • Divisions を 8
    • Segments を 2
    などとし、
    • Prevent Joint Buckling をオフにする。
    すると以下のようなアウトライン形状ができる。
  12. polywire1 の出力に、Normal ノードを作成。できた normal1 により polywire1 による面が正しい方向を向くようになる。
  13. normal1 の出力に、Color ノードを作成。できた color1 で好きな色 (ここでは赤) に色を設定。
    ここまでのネットワークは以下の通り。
  14. ネットワークの階層を一つ上がればこのようになる。
ここまで 01_toonoutline_base.hip。

Mantra レンダリング

上で作ったのをとりあえず Mantra でレンダリングしてみる。

  1. RenderView に行き、カメラを /obj/cam1 に設定し、 Render ボタンをクリックしてレンダリングを実行。
  2. Material Palette を開き、左側のリストの下の方の Utilities 以下の Constant マテリアルを右側にドラッグ&ドロップ。
  3. /obj/outline の Render タブに行き、
    • Material に /mat/constant を指定
    • Render Polygons As Subdivision (Mantra) をオンにする。
  4. /obj/testgeometry_rubbertoy_object1 の Render タブに行き、下の方の Shading タブで Reflection Mask と Refraction Mask の両方に
      !outline
    と設定する。

    こうすることで、アウトラインが反射なり屈折なりに映りこまなくなる。
  5. 遠景であればこれで OK な場合もあるかもしれない。
ここまで 02_mantra_render.hip 。

まとめ

状況によってはあまり望ましくないアウトラインが生成される場合ある。これに対応するには、Primitive ノードのあと、PolyWire の前に、Fuse, Smooth, Resample などを使ってスムーズ化することが考えられるが、満足のいく結果を完全プロシージャルで得るにはもう少し検討・検証が必要。

シーンファイル

0 件のコメント:

コメントを投稿