2022年12月5日月曜日

ダイナミックオプティマイズサブディビジョン(長っ)

こちらはHoudiniアドベントカレンダー2022↓ 6日目の記事です。
https://qiita.com/advent-calendar/2022/houdini

別ジオメトリからの距離に応じてサブディビジョンの細かさをコントロールする仕組みです。


以前ツイートしたこちらの解説です。

 この例では、ラインに近いグリッドのプリミティブが細かくなる様になっています。

どんな時に使うかと言うと、エフェクトではアセットチームから来たモデル破壊などする時に
破壊する部分にディティールを持たせたいのでメッシュを細かくします。たまにモデル全体を細くしてしまう例も見かけますが、データが重くなり、自分の作業も遅くなり、破壊したモデルをパブリッシュするので、後工程にデパートメントへの影響や(ライティングは勿論のこと、最近はコンパーもジオメトリを読み込んだりしているので)、トラフィックなどデータの大きさは、行程全てに影響があるので成るべくオプティマイズした下準備がお勧めです。


ネットワークは非常にシンプルで、大まかに説明すると
グリッドのプリミティブにラインからの距離に応じたアトリビュートを持たせ、
その値でSubdivideの回数を設定するというものです。


最近HoudiniにDistance From Geometry というSopが着きましたが、少し遅いのと
後に値を0 - 1にノーマライズする際に最大値を決めるのが面倒なので使いません。

グリッド側のポイントにカラー0(黒)、ライン側のポイントに1(白を)もたせAttribute TransferでBand Widthを利用する事で、0 - 1 にマッピングする手間を省きつつ距離に応じて
グラデーションが作成されます。


このpointアトリビュートを値をAttribute Promoteでprimitiveに移します。
(最初からprimitiveにカラーを持たせてAttribute Transferしないのは、グリッドのプリミティブが大きい場合、primitiveの中心とラインとの距離が大きく上手くグラデーションが作成されない事がある為。)

この各プリミティブが持っているカラー(Cd)の値を、subdivという整数値にリマップ(fit) させて(この例では白い所は4、黒い所は0)subdivide sopのdepthに利用します。




Subdivide Sopのdepthパラメーター(サブディバイド回数)が、この新たに作った@subdivアトリビュートを参照出来れば楽なのですが、多くのHoudiniのパラメーターはh-expressionで変数(この場合は自分自身のプリミティブ番号)を使用しつつ、値を取る事が出来ないので
forloopを@subdivの値が同じプリミティブのくくりで回してあげる事で、変数を仕様せずに
prim h-expressionでプリミティブ番号0番の@subdivの値をとってきて、depthの値に使用できます。



以上です。
hipファイルはこちら

毎年小ネタで恐縮です、アドベントカレンダーに空きがあったら、もう一つ小ネタ記事を書こうかと思いますのでご了承下さい(^^;)

Houdiniアドベントカレンダー2016年から始まりもう7年目ですね。
Houdiniのテクニックは過去のものも古くならず有効なものが多いです。
 是非こちらから過去のものやチェックしてみてください。 
https://qiita.com/advent-calendar/2022/houdini