いろいろなランオーバーで同じことをやってみようシリーズその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 を使っているわけですが、動くものは作れるけれど、整理された状態には程遠いので、基本を押さえるためにこのような単純な命題を異なったランオーバーで記述する試みをしています。一般のチュートリアルや教材ではポイントで処理を回す例が多いですが、モデリングを行うに当たっては頂点の処理が欠かせないため、処理対象を頂点としたほうが、簡潔にすむことが多い、、のではないかと思っています。