執筆者:森田
映像業界を経てモノリスソフトへ入社。 以来、テクニカルアーティストとして主にHoudini関連の業務を担当。 好きなお寿司は鉄火巻き。
TECH BLOG
こんにちは。モノリスソフト テクニカルアーティストの森田です。
Houdiniではカーブを元にskinやpolyloftで以下のようなチューブを作ることがあります。
カーブの途中(上のオレンジの部分)を除去したい場合、PolyCutノードを使うことで簡単に実現することができますが、今回はこの「PolyCutの処理を自作してみる」をテーマに解説をしていこうと思います。
サンプルファイル(monolithtech_linesplit.zip 16.0 KB)はコチラです。
ファイルをご覧いただきながら下の解説を読み進めてください。
まず、deleteノードを使ってオレンジの点を消去します。
この時点で、カーブを3つに分離するためには「カーブの中でポイントとポイントの距離が長いカーブを除去する」ことで実現できそうな気がします。
上図がSOPの図です。
まず、Convertlineでカーブを線分ごとに分離したプリミティブにします。(上図)
ここでConvertlineの内部処理により同時に@restlengthという線分の長さアトリビュートが埋め込まれています。
次に、blast1のGroupに@restlength>0.1と入力することで、線分の長さが0.1より大きいものを除去しています。
こちらの数値は状況に応じて適切な値に調整してください。
TIPS:
Groupには数式を入力することができますが、@restlength > 1のように文字の間にスペースをいれてしまうと正しく動きませんので注意してください。
Convertlineにより線分ごとにばらばらなプリミティブになっているので、polypathまたはjoinによってひとつながりのカーブへ戻してあげましょう。
上図がSOPの図です。
上図のようにaddを使って、カーブを一旦ばらばらのポイントにします。
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関数を使った、より安定した手法で書かれています。
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関連の業務を担当。 好きなお寿司は鉄火巻き。