nearpointsでPoint Cloud Openの様に近接ポイントを取得する。


こんにちは篠島です。ポイントクラウド関係の話題が続いているので今回は nearpoints() 関数について説明しようと思います。nearpoints() はPoint Cloud Open と似たような動作をしますが使うよりも非常に簡単に使えます。要はnearpoints() は指定した位置から特定の範囲に存在するポイントの番号を配列として返してくれます。そしてその配列をforeach()によって回すことで非常に簡単に処理できます。

 

 

今回のサンプルファイルです。
nearpoints.zip

nearpoints()

nearpoints() はVEX関数にだけ存在し、VOPノードとしては存在していません。なのでまずはVEX関数から説明します。初めて見るVEX関数があったらまずヘルプ。ヘルプを見ないことには始まりません。今回はハイライトされた二つ目のプロトタイプを使ってみます。

2

 

まずは完成したコードを見てみましょう。下のように nearpoints() を呼び出しています。関数の1つ目のパラメーターが、どのポイントクラウドに対して処理するか、2つ目の引数が、検索を始める位置、3つ目は検索範囲、4つ目が最大で何個のポイントを見つけるか。3つ目と4つ目の引数に関しては、自分でパラメーターを作り、スライダで簡単に値を調節できるようにしてあります。そして nearpoints() の結果はInt型の配列が返されるので、i[]@near と書いて、near という名前の配列の変数を作ってそこに代入しています。

i[]@near = nearpoints(0, @P, searchDist, maxpt);

そして返された配列に対し foreach() によって一つずつのポイントになんらかの処理をします。

1

 

foreach()

Pythonのループと非常ににてるので、プログラミング経験がある人は読み飛ばしてもらって大丈夫です。foreach() 二つ目のパラメーターに入れた配列の要素の数だけループします。配列の要素の中身が一つ目のパラメーターで指定した変数に入ります。

3

 

サンプルファイルで書いたforeach() の内部の処理ですが、自分自身のポイントと近接ポイントをラインで繋いでいます。詳しく書くと長くなるので簡潔に説明します。nearpoints() で取得されたポイント番号がもし自分のポイント番号と違ければ addprim() によってプリミティブを作り、addvertex() によって作られたプリミティブに頂点を追加しています。

4

 

よくあるラインで作られたオブジェクトみたいなのはこの手法で作られています。

6

 

nearpoint() と Near Point VOP

名前の通り、複数形になっていないので検索位置から一番近いポイント番号一つだけ返されます。VOPだと Near Point VOP というノードになります。Inputでポイントクラウドを指定し、検索位置を指定するだけです。

5