pcopen(), pciterate(), pcimport()


どうも篠島です。この間はVOPによってポイントクラウドを扱ってみました。今回はWrangleノードによりVEXコードを書いて同様のことをしてみます。

 

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

 

シーンの内容は前回と同じで、近くのポイントのポイント番号を配列に追加していきます。まずは完成形を先に載せておきます。

1

 

1行目   int handle = pcopen(0, “P”, @P, 2, 5);

まずpcopenのヘルプを見てみましょう。VEX関数のヘルプの見方はこの記事を参考にしてください。ヘルプを見てみると、ハンドルを返すと書いてあります。プロトタイプはハイライトされた2番めの物を使います。プロトタイプを見るとハンドルのデータ型はint型というのが分かります。なので最初に int型の変数 handle を宣言し、pcopen()で戻されたハンドルをhandleに代入しています。pcopen()の最初の引数には0を渡していますが、これはAttribute Wrangleノードのインプット0に繋がったジオメトリをポイントクラウドとして扱うという意味です。Pchannelは位置データが入っているアトリビュートの名前、すなわち “P” となります。3つ目のパラメーター vecotr P は要はクエリーポイントの位置です。@Pによって自身のポイントの位置を指定しています。radiusはクエリーポイントからの半径、maxpointsが最大いくつのポイントを探し出すかという事です。

2

 

2行目  int otherID;   

int型の変数を宣言してます。見つけた近接ポイントのアトリビュート代入用に使います。

3行目  i[]@array;

int型の配列を宣言してます。

5行目  while( pciterate(handle) )

pciterate()関数を使うと、近接ポイントのデータベース内にまだポイントがあれば 1 を返しwhileループに入り、ポイントが無ければ 0 を返しループには入りません

6行目  pcimport(handle, “point.number”, otherID);

ループ内でpcimport()関数によって近接ポイントからアトリビュートを取得します。まずはヘルプを見てみます。一つ目のパラメーターのhandleの所にpcopen()で受け取ったハンドルを渡します。二つ目のchannel_nameで取得したいアトリビュートの名前、今回は”point.number”というpcimport独自の変数を読み込んでいます。3つ目のint value&は参照変数を渡す必要があり、その渡した変数にデータが入れられます。なのでここでは予め作っておいたotherID変数を渡しています。参照変数についてはこちらの記事を参考にしてください。そしてデータのインポートが成功したら 1 を戻し、失敗したら 0 を戻します。

3

 

7行目  push(@array, otherID);

最初に作った配列にデータを追加します。プロトタイプを確認すると、配列は参照変数になっています。

4

 

9行目  pcclose(handle);

最後にpcclose()にハンドルを渡して近接ポイントのデータベースにアクセスするためのハンドルを閉じます。

 

VOPと違いコードによって自分でプログラムの流れを制御できるので使いこなせると非常に便利です。