【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 を使っているわけですが、動くものは作れるけれど、整理された状態には程遠いので、基本を押さえるためにこのような単純な命題を異なったランオーバーで記述する試みをしています。一般のチュートリアルや教材ではポイントで処理を回す例が多いですが、モデリングを行うに当たっては頂点の処理が欠かせないため、処理対象を頂点としたほうが、簡潔にすむことが多い、、のではないかと思っています。
Author And Source
この問題について(【Houdini】あるポイントを含むフェイスをいろいろな vex コードで得る), 我々は、より多くの情報をここで見つけました https://qiita.com/harayoki/items/95ca19792ce5097a8a97著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .