Point Cloud Open、 Point Cloud Iterate、Point Cloud Import


こんにちは篠島です。今回はPoint Cloud Openを使ってVOP内でポイントクラウドを使っていこうかと思います。

 

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

 

0

5つのポイントを作成し、これをポイントクラウドとしてPoint Cloud Open等を使っていこうと思います。まずはVOPの完成形から。初心者の方が画像だけで理解するのは相当厳しいと思うので、サンプルファイルを見ながら記事を読むのをおすすめします。

1

Whileループ内で何をしているかというと、近接ポイントのポイント番号を取得し、Int型の配列に入れています。下の画像をみて分かるように、それぞれのポイントからどのポイントが近いのかが分かります。出力された配列を見てみるとわかりますが、ポイントクラウドで一番近いポイントは自分自身のポイントなのです(もし別のPoint Clout Textureを使っている場合はこの限りではない)。

3

 

まずは Point Cloud Open のプロパティを調整します。Search Radiusがクエリーポイントから検索する最大距離、Number of points が近接のポイントを何個まで見つけるかです。Point Cloud Open のインプットはPとFileが繋がれています。Fileがポイントクラウドで、Pはクエリーポイントの座標です。

2

 

Point Cloud Open のアウトプットのHandleがPoint Cloud Iterateのインプットに繋がっています。このハンドルを使ってポイントクラウドで説明したデータベースにアクセスする事になります。Point Cloud Iterateは、もし近接のポイントが一つでもあれば1を返すのて、TrueとなりWhileループに入ります。
Whileループの中でPoint Cloud Importを使って見つかった近接ポイントからアトリビュートを読み込みます。Channelで読み取りたいアトリビュートの名前を入れますが、Point Cloud Import には2つの独自の変数がありそれぞれ以下のようになっています。

  • point.number (現在処理されているポイントの番号)
  • point.distance (現在処理されているポイントのクエリーポイントからの距離)

今回は point.number を読み込んでいます。

4

 

Point Cloud Importでデータを読み込んだら後は好きに処理をするだけです。今回は単純にInt型の配列にデータを追加しているだけなので、Snippet VOPを使いpush()関数によりデータを追加しています。この方法を使わずにAppend VOP を使って配列にデータを追加することができますが、Append VOPを使うと自動生成されるコードがちょっと汚くなるためにSnippet VOPを利用しました。

5

 

Whileループの中でWhile_beginからHandleデータを受取り、Point Cloud Iterateで処理しています。Point Clout IterateのアウトプットをEnd_whileのConditionに繋げます。これにより、次に処理する近接ポイントがあるかどうかを確認し、ポイントがあれば 1 を返しループ続行、ポイントが無ければ 0 を返してループ終了となります。While_beginのアウトプットをEnd_whileに繋ぐのを忘れずに。

6

 

そして近接ポイントの処理がすべて終わるとループが終了し、Point Cloud Closeによりハンドルを閉じ、ループ内で作った配列をBind Exportによりアトリビュートとして出力しています。

7

 

 

Point Clout Iterate VOP等を使うときの注意

以前の記事、ポイントクラウドで説明したとおり、Point Cloud Iterate と Point Cloud Importは交互に実行される必要がありますですが、VOPだとどのノードが先に実行されるのか分かりません。試しに自動生成されたVEXコードを見ると、IterateとImportが交互に呼ばれているので大丈夫ですが、どのノードのVEXコードが先に作られるかは予想できません。VEXコードの確認の仕方はこちらの記事から。

9

 

試しにWhileループ内のBind Exportをバイパスしてみましょう。何故かVEXコードの順番が変わりってしまいました。すると最初のIterateが実行された後にImportが呼ばれることなく次のIterateが実行されてしまい、最初のポイントに対してImportする機会を逃してしまいました。なぜBind Exportをバイパスするとコードの順番が変わるのかはまったくの謎です。バグ・・・なのか? 本来はBind Exportはデバッグ用に使っていただけなのですが、削除するとVEXコードの順番が変わってしまうために泣く泣くサンプルファイルの中に残しました・・・。

10

 

VOPのせいでコードの順番が変わってしまうと思わぬ所でポイントの一番最初のデータを読み出せなくなってしまいます。そしてAttribute VOP自体にも警告が現れます。VOPを使って思うように動かない時は是非ともVEXコードを見てデバッグしましょう。

11

 

これらの目眩のするような注意事項を気にしないためにも、最初からWrangleノードでVEXで全部書いてしまうのが一番楽です・・・。