blog heroalche.studio

メッシュをプロシージャルに表向きにする

著者:

Jun Ozaki

投稿日 2023.11.21更新日 2023.11.21

Houdiniでメッシュをプロシージャルに表向きにする方法を紹介します。

◇ 裏向きメッシュの問題点


MeshOrientation (極端な例ではありますが、)画像のようにメッシュの表裏が混在し、上手く描画されないケースは少なくありません。

Unreal Engineはデフォルトで裏を向いたメッシュが描画されないようになっています。

これは、Back-Face Cullingと呼ばれる最適化手法によるものです。 マテリアルの設定(Two Sides)によって裏面も描画させることはできますが、負荷につながるので多用したくありません。

・・・ということで、裏向きメッシュは予め表に向けておきたいわけです。

◇ プロシージャルの利点


blender mesh orientation DCCツールの多くは、面の表裏を揃えるメソッドが用意されています。 例えばBlenderでは、変更したいメッシュを選択し「面の向きを外側に揃える」をクリックすることで向きを修正することができます。手軽で確実な方法と言えますね。

しかし、疑いのあるアセットが大量な場合はどうでしょうか? あるいは、アセット毎にFBXファイル等で管理している場合、それぞれのファイルごとに確認する手間も出てきそうです。

プロシージャルな手法を取り入れることで、例えば、

1.フォルダ内のアセット群をインポートする 2.ピースごとにメッシュの向きを揃える 3.裏向きであれば表に向ける という一連の流れを自動的に行うことができます。

◇ メソッド一例


Screenshot - 2023-11-20 23.47.07 まず面の向きを揃えることを考えます。PolyDoctorSOPやCleanSOPノードを使用することで実現できます。

PolyDoctorSOPで向きを揃える

Screenshot Correct Polygon WindingをTabMenuから探します。Windingは”Winding Road”など曲がりくねったイメージを持つことも多いですが、ここでは巻き方、回転というニュアンスが近いように思います。 Screenshot Houdiniではポリゴンを構成する頂点順によって表裏が決定します。時計回りは表、反時計回りは裏というように頂点順と表裏の向きを紐づけてみると”Winding”という表現も腑に落ちますね。外積の考え方が背景としてありそうです。

話を戻すと、Correct Polygon Windingの実態はPolyDoctorSOPです。

このルートでPolyDoctorSOPを選択することで、表裏を揃えるCorrect Winding of Polygons to Majority in their Manifold Patchオプションにチェックが入った状態で配置されます。

Screenshot

ちなみに、PolyDoctorSOPは今回のような表裏だけでなく、多角形ポリゴンや自己交差、重複頂点など、よくあるトラブルに対してプロシージャルに調整することができます。

Screenshot 結果として、ピース毎に表裏が揃いました。裏を向いてるメッシュが半分を超えているので、Correct Winding of Polygons to Majority in their Manifold Patchによって多数派に合わされたわけです。表を多めにした左前足は表向きになっています。

CleanSOPで向きを揃える

Screenshot CleanSOPもポリゴンを綺麗にするための複数機能によって構成されたノードです。 向きを揃えるには”Orient Polygons”にチェックを入れます。 PolyDoctorに比べると気まぐれな結果に見えますが、ピース毎に面が揃っています。今回の目的では十分に有用です。 Screenshot - 2023-11-21 12.48.58

裏向きメッシュを抽出し、反転させる

現状、どちらのフローにしても表向きと裏向きが混在した状況です。ここから裏向きメッシュを抽出して反転させていきます。

方針としては、体積計算をベースにします。Houdiniでは裏向きパーツの体積は負の値として算出されます。面白い考え方ですよね・・・。

体積が負の値をもつピースをグループとして括りだし、ReverseSOPで反転させるシンプルな方法です。

Screenshot まず、MeasureSOPで体積を計算します。

ピースごとに測定したいので、ConnectivitySOPを挟み、Piece Attributeを出力します 。ここでは、アトリビュート名はデフォルトのclassを使用しています。

MeasureSOPのAccumulateをPer Pieceに変更し、ConnectivitySOPで定めたPiece Attributeの”class”としておきます。

Screenshot - スプレッドシートを見ると、負の体積を持ったプリミティブがあることを確認できます。

Screenshot 最後に、@volume<0となるプリミティブをグループに追加し、ReverseSOPでそのグループを反転させれば完了です。

ここではGroup Expression SOPを使用しました。

◇ テストジオメトリの紹介


Screenshot - 2023-11-20 23.11.21rubbertoy

最後に、激しく裏返っているRubberToyくんの生成過程を簡単に紹介します。ランダムに選択した約6割の面を裏向きにしています。解説のため、左前足は表を増やしました。

また、RubbeToyくんは複数パーツのいわゆる”ぶっ挿し”によって成り立っています。 多用されるHoudiniテストジオメトリとしてPigheadも有名ですが、彼は一繋がりのメッシュです。そのため、今回のような検証では想定として足りない可能性が出てきます。 ケースに応じたテストジオメトリの選定、複数パターンを用いたテストは堅牢な設計を考える上では大切ですね!(今回の例に限らず)