PolyCutの処理を自作する

INDEX

はじめに

こんにちは。モノリスソフト テクニカルアーティストの森田です。

Houdiniではカーブを元にskinやpolyloftで以下のようなチューブを作ることがあります。

tech_19_01.jpg tech_19_02.jpg

カーブの途中(上のオレンジの部分)を除去したい場合、PolyCutノードを使うことで簡単に実現することができますが、今回はこの「PolyCutの処理を自作してみる」をテーマに解説をしていこうと思います。

tech_19_03.jpg tech_19_04.jpg

解説

サンプルファイル(monolithtech_linesplit.zip 16.0 KB)はコチラです。

DOWNLOAD

ファイルをご覧いただきながら下の解説を読み進めてください。

tech_19_05.jpgのサムネイル画像

まず、deleteノードを使ってオレンジの点を消去します。
この時点で、カーブを3つに分離するためには「カーブの中でポイントとポイントの距離が長いカーブを除去する」ことで実現できそうな気がします。

SOPでやる場合

tech_19_06.jpg

上図がSOPの図です。

1.カーブを線分ごとに分離

tech_19_07.jpg tech_19_08.jpg

まず、Convertlineでカーブを線分ごとに分離したプリミティブにします。(上図)
ここでConvertlineの内部処理により同時に@restlengthという線分の長さアトリビュートが埋め込まれています。

2.長いカーブを除去

tech_19_09.jpg

次に、blast1のGroupに@restlength>0.1と入力することで、線分の長さが0.1より大きいものを除去しています。
こちらの数値は状況に応じて適切な値に調整してください。

TIPS:

Groupには数式を入力することができますが、@restlength > 1のように文字の間にスペースをいれてしまうと正しく動きませんので注意してください。

3.ひとつながりのカーブへ戻す

tech_19_10.jpg

tech_19_11.jpg

Convertlineにより線分ごとにばらばらなプリミティブになっているので、polypathまたはjoinによってひとつながりのカーブへ戻してあげましょう。

VEXでやる場合

tech_19_12.jpg

上図がSOPの図です。

1.一旦バラバラなポイントにする

tech_19_13.jpgのサムネイル画像

上図のようにaddを使って、カーブを一旦ばらばらのポイントにします。

2.自前でカーブをつないでいく

0番ポイントから順に、次の近傍ポイントへ自前でカーブを繋いでいく処理をvexで書きます。このとき近傍ポイント検索はnearpointsを使い、第二引数の0.1で検索距離を指定しています。
つまり、検索距離より離れている場合はカーブを繋がないということになります。
コードは以下です。

//近傍ポイントを取得
int pts[] = nearpoints(0,@P,0.1);
 
foreach(int pt ; pts)
{
    if(pt > @ptnum)
    {
        //隣のポイントへエッジをつなぐ処理。
        int primnum = addprim( 0, "polyline" );
        addvertex( 0, primnum, @ptnum );
        addvertex( 0, primnum, pt );
        break;
    }
}

TIPS:

上記VEXが理解できた方は、前述のconvertlineの中をダブルクリックで覗いてみてください。
ほぼ同様の処理ですがvexの中でnearpoints関数ではなくneighbors関数を使った、より安定した手法で書かれています。

3.ひとつながりのカーブへ戻す

SOPパターンと同様にその後、polypathか、joinでひとつながりに戻します。

まとめ

いかがでしたでしょうか。
組み合わせだけで複雑なことが実現できてしまうのがHoudiniの面白いところですね。今回のconvertlineのように覗けるノードがあった場合は、覗いてみるだけでも勉強になるかとおもいます。

参考

Houdiniヘルプ、Convert Line geometry node
https://www.sidefx.com/ja/docs/houdini/nodes/sop/convertline.html

Houdiniヘルプ、nearpoints VEX function
https://www.sidefx.com/ja/docs/houdini/vex/functions/nearpoints.html

Houdiniヘルプ、neighbours VEX function
https://www.sidefx.com/ja/docs/houdini/vex/functions/neighbours.html

執筆者:森田

映像業界を経てモノリスソフトへ入社。 以来、テクニカルアーティストとして主にHoudini関連の業務を担当。 好きなお寿司は鉄火巻き。

ABOUT

モノリスソフト開発スタッフが日々取り組んでいる技術研究やノウハウをご紹介

RECRUIT採用情報