【Houdini】あるポイントを含むフェイスをいろいろな vex コードで得る


いろいろなランオーバーで同じことをやってみようシリーズその2です。
ガリガリ vex で頑張る時用のメモなので、あのノードでやると簡単にできる、みたいなのは考慮しておりませぬ。

あるポイントを含むフェイス一覧を得たい


ポイント12を頂点として含むフェイスに色をつけるコードを、ポイント、頂点、プリミティブ(フェイス)、ディティールのそれぞれのランオーバー指定で書いてみました。全て同じ結果になります。コードでは対象フェイスを hoge グループに格納して、そのグループ対象で色を付けています。

ポイント

if(@ptnum==12)
{
    int prims[] = pointprims(0, @ptnum);
    foreach(int prim;prims)
    {
        setprimgroup(0, "hoge" , prim, 1);        
    }
}

ただ @primnum でプリム番号を取るだけだと、代表の1フェイスしか返ってこないので 複数のフェイスを返す pointprims 命令を使っています。

頂点

if(@ptnum==12)
{
    setprimgroup(0, "hoge" , @primnum, 1);        
}

頂点を対象にするコードはとても簡潔になりました。1頂点に対応するポイントもフェイスもそれぞれ一つだからですね。

プリミティブ

int pts[] = primpoints(0, @primnum);
foreach(int pt; pts) {
    if(pt==12) {
        setprimgroup(0, "hoge" , @primnum, 1);
    }
}

プリミティブの場合、ポイントと同じようなコードとなりました。

ディティール

int numvert = nvertices(0);
for(int i=0;i<numvert;i++)
{
    if(vertexpoint(0, i)==12)
    {
        setprimgroup(0, "hoge" , vertexprim(0, i), 1);
    }
}

ディティールの場合、いろいろ書けそうですが、頂点一覧を取得して処理をすすめる形にしてみました。一番内側の if 文以降は頂点のコードと同じ構造(使う命令は違うものの)になってます。まあ当然ですね。foreach でなく for での処理になっているのは、頂点一覧を得る命令がとりあえずは見当たらなかったからです。

まとめ

プロシージャルモデリングをするにあたって、既存のノードではできない || できても回りくどい処理、を行うために vex を使っているわけですが、動くものは作れるけれど、整理された状態には程遠いので、基本を押さえるためにこのような単純な命題を異なったランオーバーで記述する試みをしています。一般のチュートリアルや教材ではポイントで処理を回す例が多いですが、モデリングを行うに当たっては頂点の処理が欠かせないため、処理対象を頂点としたほうが、簡潔にすむことが多い、、のではないかと思っています。