執筆者:相田
映像業界を経てモノリスソフトへ入社。 以来、テクニカルアーティストとして主にHoudini関連の業務を担当。 好きな爬虫類はヒルヤモリ。
TECH BLOG
こんにちは。モノリスソフト テクニカルアーティストの相田です。
今回は、インプットしたジオメトリをもとにプロシージャルにブロックっぽくさせるノードグラフの解説をしていきます。
モジュールの考え方や、ボリューム(特にSDFの考え方)、UVの取り扱い、座標変換などなど、いろいろと学べることが多いと思います。ぜひHIPを見てみて、写経などやってみてください!
サンプルファイル(monolithtech_block.zip 86.1 KB)はこちらです。
まず、ブロックを作っていきます。
Tubeをグリッド上で並べるために GridSOP を使っています。Row と Column の値はそのまま RelativeReferenceですが、Size についてはここで生成されたポイントをもとにコピーをするので、大きさとしては、それぞれ Row とColumn から-1の値になります。
HIPを見ると分かりますが、このプロセスは SubnetSOP のなかにまとまっていて、SubnetSOP にパラメータを作って参照しています。なぜこうしているかというと、このブロック作成プロセスは他のプロセスから独立しているからです。
このプロセスは他のプロセスと比べて非常にまとまっているプロセスなので、SubnetSOP にまとめ、パラメータを SubnetSOP から触れるようにすることで、モジュール化をすることができます。
これによって、パラメータを調整することでブロックを簡単に調整することができ、ネットワークも非常にキレイに保つことができます。
ブロックができたので、それをコピーするポイントを生成していきます。
ポイントの生成には attribfromvolumeSOP を使っています。
ただし、ブロックのサイズ比が違う場合は以下のような対応が必要です。「ブロックの縦横 =0.008 と高さ =0.0096 の長さが違う 」という場合を考えます。
attribfromvolumeSOP は point separationの値でポイントを生成します。縦横にあわせて考えると、ポイント間は (X, Y, Z = 0.008, 0.008, 0.008) となり、このままでブロックをコピーすると、
(ブロックの高さ) - (Point Separation の値)
= 0.0096 - 0.008
= 0.0016
の幅がブロック間で重複してしまいます。
これを修正するために、transformSOP で一時的にスケールをかけているんですね。こうすることで補正後のポイント間は (X, Y, Z = 0.008, 0.0096, 0.008) となり、ブロックのサイズにちょうど合うようになります。
これも座標変換です。こういう操作に慣れてくると、グッと Houdini が楽しくなってくると思います!
続く attribwrangleSOP では、内側にあるポイントを削除しています。この操作では、SDF を使っています。
SDF とは、Sign Distance Fields の略で、簡単に言うと、ジオメトリの内側と外側を判別するものです。
これをうまく使って、vdbfrompolygonsSOP でジオメトリを SDF 化し、attribwrangleSOP でポイントの位置で SDF をサンプリングし、その値でしきい値を越えたらポイントを削除する、という流れです。
ポイントが生成できたので、ここで uv をもとにテクスチャカラーを取得します。
まず uv を取得する前に、転写元のモデルの uvアトリビュート は [ Vertices ] に所属しているので、これを [ Points ] にする必要性があります(転写対象のポイントは vertex を持たないため)。
しかし、attribpromoteSOP で uv を [ Points ] に Promote すると、下図のようにナゾの縞が表れてしまいます。これは、UVアイランドの切れ目 によるものです。
NOTE:
Vertex、Points、UV ilands の説明はこちらをご参照ください。
これを回避するために、splituvseamsSOP を使用しています。
splituvseamsSOP によって、UVの切れ目 に沿ってメッシュを split しています。こうすることで縞が発生しなくなります。
ビューポートだけでは分かりませんが、ビューポート右の青四角のアイコンを押すと メッシュの切れ目 を可視化できます。緑四角のアイコンは UVの切れ目 を可視化できます。splituvseamsSOP によって、uvの切れ目 と同じところに メッシュの切れ目 ができていることがわかると思います。
NOTE:
ここを理解できるようになると、Houdini力がグッと上がります!
転写元の uv が準備できたので、attribtransferSOP で転写対象のポイントに uv を転写して、attribfrommapSOP でテクスチャカラーを取得します。
attribfrommapSOP では、uvアトリビュート の座標を使って texturemap からカラー情報を取得しています。実はこれも座標変換ですね。
Viewportにマウスオーバー → Dキー → Geometry → Display Particles as : Points, PointSize : 15 でこのビューポートにすることができます。
最後にアニメーションを計算し、少しだけポストプロセスな処理をします。
この vex は少々複雑なので、詳しくはコード内のコメントを見てみて下さい。ここで計算した progress を使って pscaleアトリビュート と Pアトリビュート を加工することで、ブロックのコピーでアニメーションしているわけですね。
NOTE:
コピーのアトリビュートについてはこちらが分かりやすいです!
これは寄りで見ないと分からないですが、 PアトリビュートのY値 に若干のランダムな値を加えています。
これによってブロックによくある、「若干はまってない」感じを再現しています。
以上がブロック化ノードグラフの説明です。
このノードグラフはインプットモデルとテクスチャ指定を変えればどんなモデルでもブロック化できるようになっているので、いろいろと差し替えて遊んでみてください!
スマートフォンで3Dキャプチャしたモデルをブロック化した例
© Nintendo / MONOLITHSOFT
また、まだいくつか改善案があると思います。今思いついているのは、
などがあると思います。思いついた改善案に対して、どう実装するかを考えてみるのも楽しいですね!
執筆者:相田
映像業界を経てモノリスソフトへ入社。 以来、テクニカルアーティストとして主にHoudini関連の業務を担当。 好きな爬虫類はヒルヤモリ。