どうも篠島です。ポイントクラウド関連で今回はPoint Cloud Filterの説明です。
今回のサンプルファイルです。
pcfilter.zip
Point Cloud FilterはPoint Cloud Openによってリストアップされた近接ポイントのデータベースから、自動的に全てのポイントにアクセスしてアトリビュートを取得し、クエリーポイントからの距離に応じてウェイトが計算され、加重平均を計算します。なのでPoint Cloud Filterを使う時は、Point Cloud Iterateなどでポインタを移動させる必要もないのでループ処理を使う必要がなく簡単に使えます。
Point Cloud Filterのヘルプを見るとウェイトの計算の仕方が書かれています。
w_i = 1-smooth(0, maxd*1.1, d_i)
中でsmooth()関数が使われているのでヘルプを見ると下のようなプロトタイプになっているのがわかります。3つ目のパラメーターの値によって0から1までの値を返します。もしamountがvalue1以下だったら0、value2以上だったら1になります。
もし距離が0なら、smooth()の結果は0、そして 1-0 = 1 でウェイトは1になります。もし距離がPoint Cloud Openで設定したSearch Radius(例えば1に設定したとする)と同じだと、Smoothは1を返し、1 – 1 = 0 でウェイトは0になり、遠くのポイントは平均を計算する上でほとんど考慮されない事がわかります。
一応VEX関数のpcfilter()のヘルプを見てみると、どういうアルゴリズムで結果を計算しているのかがわかります。Point Cloud Filterはポイント全てにアクセスしてアトリビュートを取得すると書きましたが、実は pcfilter() 内で pciterate() と pcimport()を使って一つずつのポイントにアクセスしてくれています。
今回はAttribute from Map SOPにより、テクスチャからポイントに色を転送し・・・
VOPでPoint Cloud FilterノードでCdアトリビュートを読み出してみます。すると下のようにたった2つのノードで出来てしまいます。これは周りのポイントの色を加重平均した物を自分の色とするために、結果としてブラーがかかったようになります。
同じ事をVEXコードを書くと、下のようになります。今回に限ってはVEXよりもVOPでノードを組んだほうが簡単ですね。