No More Retake

3DCG屋さん向けTips&Referenceサイト

メニュー

Houdini:neighbour系の関数(VEX)

Houdini、VEX勉強回。

neighbour系について。
このneighour()系のVEX関数、よく使う割にいつもマニュアル見るので備忘録もかねてまとめです。
neighbour()とかneighbours()とか、似た名前の関数があり紛らわしい。
私的「つづり間違うランキング」も結構上位です。

まず、neighbourと名の付く関数は隣接ポイントに関する情報を取得するものです。
そもそも隣接ポイントとは、隣り合ったポイントです。

上左図のように、エッジ(線)でつながったポイントを隣接ポイントといいます。
上右図のように繋がってないものは隣接ポイントではないです。
neighbour系はこの隣接ポイントの情報を取得するものです。
以上を踏まえて。

neighbour()

int neighbour(検出先の入力, 検索ポイント番号, 何番目の隣接ポイントを取得するか)

隣接ポイントのポイント番号を取得する。
取得できる隣接ポイントは1個だけ。
何番目の隣接ポイントの番号を取得するか指定はできるが、それがどのポイントかはやってみないと分からない。
指定した隣接ポイントがなかったら-1。

実際に下のようなポリゴンの各ポイントの隣接ポイントを求めてみた。

Attribute Wrangle(SOP)でneighbour()の結果をアトリビュートに持つようにした。

i@nept = neighbour(0, @ptnum,0);

最後の引数(何番目の隣接ポイントか、ここでは0)を変更すると取得するポイントも変わる。
取得できる順番に明確なルールがあるのか否かは分からないが、トポロジが同じなら順番は同じになる。

ともかく、この関数は「隣接ポイントのポイント番号を1コ取得する」もの。

neighbourcount()

int neighbourcount(検出先の入力, 検出ポイント)

隣接ポイントの数を取得する。
単純に何個つながってるかの数を取得できる。これは比較的理解しやすい。

実際に下のようなポリゴンの各ポイントの隣接ポイント数を求めてみた。

neighbours()

int neighbourcount(検出先の入力, 検出ポイント)

すべての隣接ポイントのポイント番号を配列で取得する。
“配列”ってのがミソ。
最初に紹介した、neighbour()のすごい版。

実は先に紹介したneighbour()とneighbourcount()を使って出来てるっぽい。マニュアルに書いてた。以下そのコード。

int []neighbours(int input, int ptnum)
{
    int     i, n;
    int     result[];
    n = neighbourcount(input, ptnum);
    resize(result, n);
    for (i = 0; i<n; i++) result[i] = neighbour(input, ptnum, i);
}

内容をざっくり日本語に訳すと、「neighbourcount()で隣接ポイント数を取得して、その数だけneighbour()を繰り返して隣接ポイント番号を取得。それを配列に格納」かな。


これらneighbour系は、VOPノードでも機能は同じなのでそちらの解説は省略。
なんとなくVOPよりVEXの方を良く使う印象なのは、neighbours()が配列を返すからかな?


じゃ、これらneighbour系の関数を使って何をするのか?

例えば、neighbourcount()で得られる情報からは、ラインの端か否かを判断できます。
得られた値が1なら、1つのポイントとしか繋がっていないということで、ラインなら端にあたるというわけです。
同様に値が2ならそれは線の部分で、値が3以上なら分岐点、ということが分かります。
それを使えばプロシージャルにラインの端だけにジオメトリをコピーしたり、分岐点の色を変えたり、いろいろ出来ます。

neighbours()は、前回登場したConvert Line(SOP)の中身でも利用され、隣接ポイントを繋げてポリゴンラインを作るのに一役かっています。
隣接ポイントに何かしらの処理を行う場合、このneighbours()を使うイメージです。

neighbour()は正直あまり使ったことがないです。
だから他と区別がちゃんとできず混乱の元になってました。
なので、使用例をすぐには挙げられません。
「こんなの時に便利ヨ」、ってのがあったら教えてください!

さて、ここでは隣接ポイントについて取扱いましたが、では隣接していないポイントはどのようにして情報を取得すればよいのでしょうか?
隣接してないポイントについては、近いポイントを取得する関数があったりします。
nearpoint()とかポイントクラウドとか。
次はそこらへんをやります。

勘違い、間違い等ありましたらご指摘を!

 

関連記事

  1. 2017.08.20

    Houdini:Escher

コメントをお待ちしております

このサイトについて

3DCG Tipsサイト。Houdiniの記事が多めです。

RSS

follow us in feedly

アンケート

ほしい?(複数可)

View Results

Loading ... Loading ...

言語切り替え

  • English (United States)
  • 日本語

Archives

  • 2017 (17)
  • 2016 (36)
  • 2015 (64)
  • 2014 (54)
  • 2013 (60)
  • 2012 (54)

スポンサードリンク