kick the base

好きな映画、音楽、マンガ、プログラム、デザイン、3DCG、ゲームのこと。

Houdini/Substance: 曲率を検出してビスを打つ

はじめに

本記事は2019/08/31に行われた勉強会、第4回 Substance Designer ゆるゆる会にて出た、SDで「コーナーを検出してそこにビスを打つにはどうしたらいいだろう」というお題について、Houdiniでの回答例となります。

なぜSDの話題でHoudiniを使った解法についてお話をするかというと、答えはシンプル。SDでの回答方法について僕が解答を導き出せなかったからです。

SDなんもわからん。

SDとHoudiniは根本的に異なるツールですが、別の視点での解答という意味では意味があるかなと思い、ここに記載しておきます。

サンプルファイル

本記事に使用したサンプルファイルはこちら

※ 配布はhipファイルのみとなります。 (Sample includes hip file only.)

やりたかったこと

f:id:kickbase:20190901192417j:plain

上記画像のビス打ちの部分は、破壊処理(目合わせによる配置)なのでプロシージャルな変更に対応していません。せっかくSDを使っているのだからうまいことできれば嬉しいなぁという質問を参加者にお尋ねしてみました。

記事の最後にまとめますが、参加者の皆さんによるSDのアイデアも多く頂けました。ありがとうございます!

また、本作例はBuilding Sci Fi height maps in Substance Designerを参考に作成させていただきました。

Thank you Allen Grippin!

Houdiniによる別解

SDでの解法は皆目見当がつかなかったため、ぼくはHoudiniならどうやるかな?というアプローチでこの課題に取り組んでみました。

最終的な挙動

下記動画のような感じです。内側のコーナーにビスを生成するかどうかのチェックボックスを用意しています。

f:id:kickbase:20190901192604g:plain

ネットワーク解説

簡単なネットワークですが、順に見ていきましょう。全体はこのような感じです。灰色のoriginal geometryと書いてあるネットワークボックスはその名の通り元となるジオメトリ群です。

f:id:kickbase:20190901192628p:plain

曲率を検出する

まずはMeasureSOPで曲率を検出します。Element TypeをPointsに、MeasureをCurvatureに変更しましょう。これだけで曲率をcurvatureポイントアトリビュートとして取得することができました。お手軽ですね。

f:id:kickbase:20190901192652j:plain

続けてビスのオフセット(移動方向と移動量)を確定できれば良さそうです。さて、どうしましょう。

オフセット方向はノーマルを利用して決定する

単純にMeasureSOPの後にNormalSOPを接続しても望む方向は取得できません。面方向上に出ちゃいますね。

というわけで、立体物にしてからノーマルを生成、それを転写するという方向で行きましょう。具体的には下記手法をとりました。

  1. PolyextrudeSOPで押出し
  2. TransformSOPでオブジェクトをY座標センターに移動*1
  3. SuvdivideSOPでなめらかな曲面にし、ノーマルを平均化
  4. NormalSOPでノーマルをポイントに付加

f:id:kickbase:20190901192722j:plain

このような感じです。Suvdivideの流れはVDB from PolygonsからAttribute Blurでも良いでしょう。

ノーマルの転写

Attribute TransfarSOPでノーマルを転写します。*2

曲率を指定してグループ化、ポイントの取り出し

Group ExpressionSOPで任意の曲率を超えるポイントを指定し、BlastSOPでポイントを取り出します。

現在Group ExpressionSOPでは曲率のしきい値はハードコードしていますが、実際に運用する際は外側にパラメータアウトしたほうが良いでしょう。

ノーマル方向にオフセット(移動)

f:id:kickbase:20190901192901j:plain

書いているVEXは2行です。

@N.y = 0;
@P += normalize(@N) * ch("offset");

難しいところは特にないですが、ノーマルのベクトルをnormalize(正規化)しているところにご注意ください。これをしないとオフセットの位置が元形状によって変わってしまいます。

最後にパラメータをNullにまとめる

これはやってもやらなくても良いですが、NullSOPに変更したいパラメータをまとめておくと後々振り返った際に何をしたかったのか把握できて良いですね。

SDでのアイデア

先達がまとめてくださったアイデアを引用させていただきます。

もんしょさんのブログ記事: いいところにビス打ちをしようと思って失敗した話

まとめ

SDは画像単位で管理をし、Houdiniは3D形状とアトリビュートによって管理をするものなので、そもそも全く違うものであり、Houdiniの方が良いという意見ではないのでご理解ください。 そもそもぼくがSDでできてれば全く問題のない話だったわけですし。

しかし、このように違うツールの違う視点で解決法を考えることは有意義だと思いますし、SPとHoudiniの連携を考えていく上でも良い思考実験になるかと思います。各ツール得意なところをうまく組み合わせてより効率的に、よりよい出力が出せるよう研鑽していきたいものです。

最後にSubstance Designer ゆるゆる会の主催者・参加者の皆様、会場をご提供いただいたヒストリア様に感謝をもって〆させていただきたいと思います。

追記

上記勉強会でグラフのスパゲッティ化を避ける上で非常に有用なテクニックを教えていただきました。次回の記事にまとめます。

まとめました。Houdini/Substance: ノードを整理する仕組みについて

*1:移動はローカル変数$CEYを用いて行っています

*2:複雑な形状だと転写に失敗するかもしれませんが、本作例では簡単のためエラーハンドリングは入れていません