2023年7月8日土曜日

Houdiniポリゴン専門医への道001 - 局所的な縮退 Primitive

Houdini でプロシージャルなモデリングをしていると、今まで便利に使っていたノードが突如バグのような挙動を見せたりして混乱することがあります。

Boolean や PolyExtrude などは特に便利な反面、謎挙動にも遭遇しやすいのではないでしょうか。

そのような挙動の裏には原因となるメッシュの状態があります。

それを直すにはどうしたら良いか、というのがこのシリーズのテーマになります。

局所的に縮退している Primitive

Twitterでも呟きましたが、Boolean を活用すると出てくるバギーなメッシュ状態として、Primitive の一部の Vertex が縮退を引き起こしている状態があります。

例えば以下のような、一見四角形に見えるポリゴンがあります。

Primitive 番号の 0 という丸で囲った数字が四角形の外側にあることからも何かおかしいと気付くことが出来ますが、実は5点からなるポリゴンでした。


「1→2→3→4」という四角形になっていて欲しいが実際は「1→2→3→0→4」というPrimitiveになっているのです。

追記

新しい記事を書きました。そちらの方がよりロバストで既存ノードだけで実現できますのでVEX大好きマン以外はそちらをオススメします。



ー以下、続きを読みたい方はどうぞー

これを直すにはどうすれば良いかというと、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 というオプションがあるのでこれを事前に掛けて置けば解消されます。
アルゴリズムを適用する前に Facet ノードを繋げ…
Remove Inline Points というオプションを有効にします
そうすると不要な Vertex は一つだけが残るので


後は今回のアルゴリズムを一度適用すると解消されました。

コード

初めは Primitive Wrangle で実装したのですが、Vertex Wrangle で実装出来たのでその関数を GitHub にサブミットしています。使ってみたい方は是非。

注意:今後処理を追加したり別ファイルに移動予定です。


追記:2023-07-09

別記事に書いたように既存ノードで実現できますのでもう必要ないとは思いますが、処理を別ファイルに移しました。
関数自体はいつか消すかもしれませんが念のためお知らせです。

使い方

Vertex Wrangle にて以下のように関数を呼び出すことで使えます。

(自分はこれをさらに HDA にしています)




0 件のコメント:

コメントを投稿