空間検索(後半)
筆者環境
・Bifrost2.5.0.0
・Maya2020.2
今回は空間検索の後半です。GeoLocationの正体が明らかになりますよ。
「理屈とかどうでもいいです」という方はブログ後半まで読み飛ばしてください。
(当ブログで[]で括っているものはBifrostGraphEditor内のノード名です)
GeoLocationデータ
.index
GeoLocationデータには、まず検索結果のポリゴン番号が保存されています。
.sub_indeces
次に保存されているのは3個のサブ頂点番号です。
サブ頂点番号とはポリゴンを構成する頂点に左周りで0から順に割り振られた番号のことです。(各ポリゴンごとに0から始まる番号リストが存在すると思ってください。厳密には少し違うのですが詳細は省きます)
4角形以上のポリゴンの場合は0番を起点とする三角形のサブ頂点番号が保存対象となるので、下図の場合では{0,2,3}がsub_indecesに保存されます。
.sub_parameters
次に先ほどの三角形の各頂点に対するウェイト値です。
サブ頂点番号と対になるように{0.1, 0.2, 0.7}の順で保存されます。
例えばGeoLocationが指し示す位置情報を取得したい場合、[sample_property]の内部で行われる処理は以下のようになります。
- メッシュ内の26番のポリゴンを探す
- ポリゴン内のサブ頂点番号0,2,3番に該当する3頂点を取得する
- 3頂点の位置情報を取得する
- 位置にウェイト値を掛けて合計値を求める
法線、バーテックスカラー、UVも同様の手順で算出できますね。
後半
さてGeoLocationの正体はわかりました。それでも一旦GeoLocationデータを介する構成になっている理由は謎のままですよね。このメリットを2つ挙げます。
1:空間検索の実行回数を抑えることが出来る
空間検索の処理コストは非常に高く、ロケーションから位置やUVなど複数の情報を取得したい場合に何度も何度も空間検索を行うのは適切ではありません。
検索結果を汎用性の高いGeoLocationデータにしておくことで、処理の最適化を図ることが出来ます。
2:サンプリング先を変更できる
この点については、前回作成したclosestのグラフを見直してみましょう。
[get_closest_locations]の後に[sample_property]でもメッシュの入力が求められていますね。
二度手間のように見えますが、ちゃんと理由があります。GeoLocationの仕様を思い返すと中身はポリゴン番号とウェイト値だけでしたよね。検出で使用したメッシュはどれかといった情報は保持していないので、[sample_property]はサンプリングを行うメッシュを改めて求めているわけです。
実はこれ、裏を返すと検索で使用したメッシュとは別のものを入力しても該当のポリゴンが存在すればサンプリングが実行できるということです。
例えばスフィアAで空間検索を行い、スキンデフォームしたスフィアBでサンプリングすることで、フェースコンストレイントを作成できます。
Tips
ブログ中ではメッシュばかり使用してきましたが、カーブをソースにすることもできます。Mayaからカーブを入力する方法は#01 inputを参照してください。
空間検索はアイデア次第で面白いツールが作れそうな予感がしますね。そして良いものが作れたら人と共有したくなりますよね。
次回「コンパウンドにしてチームで共有!」ではノードグラフをチームで共有する方法を見ていきます。お楽しみに。
高島 正規
テクニカルアーティスト>
長年シネマティックアーティストとしてフェイスリグやフェイシャルモーションの制作を担当。現在は技術戦略グループに所属し、DCCツールのプラグイン開発のための内製C++ライブラリの構築と、Bifrostを用いたツール開発を行っている。