2023年7月8日土曜日

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

前回の記事(Houdiniポリゴン専門医への道001 - 局所的な縮退 Primitive)を書いたのちに新たな問題に遭遇しましたので続きです。 結論から言うと前回の方法よりも簡単(既存ノードだけで実装できる)でかつロバストになりました。
実装は無駄になりましたがどんなポリゴンが悪さをするかの知見は無駄ではなかったと信じています(強がり)。

修正できる既存ノードの発見

まず前回の様な一部が縮退している Primitive の修正なんですが、既存ノード Divide で一発KOでした。

問題となる Primitive を再現する Detail Wrangle コード

以下のコードを Detail Wrangle で実行すると
vector add_Ps[] = array(
    set(-1, 0, 0),
    set(-1, 4, 0),
    set( 1, 4, 0),
    set( 1, 0, 0),
    set( 2, 0, 0)
);
int add_pts[];
foreach (vector add_P; add_Ps)
{
    append(add_pts, addpoint(0, add_P));
}
addprim(0, "poly", add_pts);
問題の縮退 Primitive を再現できます。Point 4 が縮退しています。
これに Divide SOP ノードを以下の設定で繋げるだけで解消されます。
前回の実装は何だったんだ感
話はこれだけでは終わりません。

さらに難しいケースが見つかった

ひとつの Vertex の消去だけでは解決しないケースが見つかりました。
元は二つのPrimitiveになって欲しいのに
青い矢印の部分が縮退になっていて
一つの Primitive になっちゃったケース
再現する Detail Wrangle コードは以下です。
float h = 0.5;
float w = 0.5;
float mid_h = chf("mid_h");
vector add_Ps[] = array(
    set( 3*w, 0, 0),
    set(-3*w, 0, 0),
    set(-3*w, h, 0),
    set(-2*w, h*0.75, 0),
    set(-1*w, h, 0),
    set(-1*w, mid_h, 0),
    set( 0, 0, 0),
    set( 1*w, mid_h, 0),
    set( 1*w, h, 0),
    set( 2*w, h, 0)
);
int add_pts[];
foreach (vector add_P; add_Ps)
{
    append(add_pts, addpoint(0, add_P));
}
int prim = addprim(0, "poly", add_pts);
setprimgroup(0, "dummy_grp", prim, 1);
(最後の行のグループ設定は後で説明します。)
これに前述と同じ Divide ノードを繋げると以下のようになります。
Primitive は分かれるが縮退 Primitive が残っている

さらに以下の設定の Facet ノードを繋げるとこうなります。
Remove Inline Points
Remove Degenerate を指定

ただし左側が二つの Primitive に分かれてしまっているので最後にこれの対処をします。
Divide ノードの Remove Shared Edges
指定すると実現できるが…

これで良さそうなんですが、グループ情報が消えてしまいます。
Facetノードまではこのように残っているグループ情報が…
Divideノードでエッジを消すと消えてしまう

これへの対処として Divide ノードの代わりに Labs Dissolve Flat Edges ノードを使います。
グループ情報が残っています。
結果の Primitive 番号は異なりますが…

という訳で縮退 Primitive への対処となるノード構成は以下のようになります。

ただしこれは単一の Primitive への対処だったのですが実際には複数の Primitive が
同時に来ますので、For-Each Primitive で囲って最後に Fuse させます。


完成

これで完成です。便利なのでHDA化しておきましょう。

もしかしたら今後も対処できないケースが発覚することもあるかもしれませんが、一旦ここで終わりにします。








0 件のコメント:

コメントを投稿