Houdini でプロシージャルなモデリングをしていると、今まで便利に使っていたノードが突如バグのような挙動を見せたりして混乱することがあります。
Boolean や PolyExtrude などは特に便利な反面、謎挙動にも遭遇しやすいのではないでしょうか。
そのような挙動の裏には原因となるメッシュの状態があります。
それを直すにはどうしたら良いか、というのがこのシリーズのテーマになります。
局所的に縮退している Primitive
Twitterでも呟きましたが、Boolean を活用すると出てくるバギーなメッシュ状態として、Primitive の一部の Vertex が縮退を引き起こしている状態があります。
一見4角ポリゴンに見えるこの Primitive なんと[1, 2, 3, 0, 4] の5角(?)ポリゴン
— d_gfx (@d_gfx) July 4, 2023
Boolean 使ってると結構出てくる
縮退させている Vertex の 0 を removevertex で削除して解決
最初は Primitive Wrangle で実装したけど Vertex Wrangle でも行けた
変なポリゴンに遭遇したら思い出して下さい pic.twitter.com/qVacWGHwET
例えば以下のような、一見四角形に見えるポリゴンがあります。
Primitive 番号の 0 という丸で囲った数字が四角形の外側にあることからも何かおかしいと気付くことが出来ますが、実は5点からなるポリゴンでした。
「1→2→3→4」という四角形になっていて欲しいが実際は「1→2→3→0→4」というPrimitiveになっているのです。
追記
これを直すにはどうすれば良いかというと、Vertex 3 から 0 に行かないで直接 4 に向かえば良いため、Vertex 0 をこの Primitive から削除してやれば良いです。
判定アルゴリズム
判定アルゴリズムをざっくり言うと、Primitive の Vertex を辿って行って直後の Vertex が一つ前の Edge に乗っていたら縮退と判定します。
チェックの向きは両方向を考えるのを忘れずに。
この図だと逆向きの 4, 0, 3 を考えて 3 で 4, 0 のエッジに乗るので Vertex 0 は縮退をしていると判定できます。
エッジに乗っているかどうかの判定には ptlined 関数を使用します。
補足1
Facet SOP ノードには Remove Degenerate というオプションがありますが今回のケースは対処できませんでした。おそらく Primitive 全体が縮退しているようなケースがターゲットなのではないかと思いますが今回のケースでは Primitive の一部の Vertex のみが縮退させているので難しかったのだと思います。
補足2
ここで削除したのはあくまでも Vertex なので、Point 0 は残っています。
もしこの Vertex からの削除で Point 0 が孤立した場合は後段のノードで綺麗にお掃除した方が良いです。
例えば Fuse SOP ノードの Remove All Unused Points などで消せると思います。
補足3
直線上に複数の点が並んでいる場合はこのアルゴリズムだと一つしか削除できません。
この状態に一回アルゴリズムを適用すると… |
一つだけ解消されました。繰り返せば良いですが… |
アルゴリズムを適用する前に Facet ノードを繋げ… |
Remove Inline Points というオプションを有効にします |
そうすると不要な Vertex は一つだけが残るので |
後は今回のアルゴリズムを一度適用すると解消されました。 |
コード
初めは Primitive Wrangle で実装したのですが、Vertex Wrangle で実装出来たのでその関数を GitHub にサブミットしています。使ってみたい方は是非。
注意:今後処理を追加したり別ファイルに移動予定です。
サブミットしました。
— d_gfx (@d_gfx) July 4, 2023
Primitive が閉じているかどうかも考慮した方が良いと思う部分もあるので後でまた変更するかもです。https://t.co/uIQDJLA0WF
追記:2023-07-09
使い方
Vertex Wrangle にて以下のように関数を呼び出すことで使えます。
(自分はこれをさらに HDA にしています)
0 件のコメント:
コメントを投稿