筆者環境
・Bifrost2.5.0.0
・Maya2020.2
今回は空間検索(Spatial Query)をBifrostで実行する方法を見ていきます。
聞き慣れない処理なので馴染みのないように思われるかもしれませんが、例えばアトリビュートの転送やシュリンクラップ、コリジョン判定、フェースコンストレイントなどで使用されています。
用途が多岐に渡る空間検索ですが、これ単体で何か素敵なことが出来るわけではなく何かと組み合わせて使うことが前提となるローレベルな関数です。よってMayaで使用するにはコードから呼び出すしかありませんでした。
一方Bifrostではノードベースで扱うことができます。更に空間検索という抽象的な処理をビューポート上に視覚化するノードも提供されているので、初めての方も学習し易い環境だと思います。
空間検索
主な関数は2つです。
raycast
closest
closestのグラフを作ってみよう
では今回はclosestのグラフを作っていきましょう。
下図のような説明用のグラフを用意しました。07.zipのsample1.txtの文面をグラフ上にペーストしてください。
まず検索対象にするメッシュをMayaから入力してください。(手順は#01 input を参考してください)
検索スタート位置はグラフ左下の[value]で{x=2.0, y=1.0, z=2.0}の値で作成していますが、こちらもMayaからの入力にしてもらっても結構です。
[get_closest_locations]にメッシュとスタート位置を接続します。
(スタート位置の入力ポートはハットアイコン(配列データ)ですので[buid_array]を経由しています #04 ポートアイコン- 配列 )
検索の結果はベージュ色のポートからGeoLocationという特殊なデータタイプで出力されます。
.
GeoLocation?
よくわからないデータ形式ですので、処理が正しく行われているのかデバッグ表示で確認してみましょう。
[location_scope]にメッシュ、検索スタート位置、そしてGeoLocationデータを入力します。結果を[output]に接続すると、ビューポート上に矢印が描画されます。
この矢印は付け根が検索スタート位置、先端が検索結果の場所を表しています。
処理は正しく実行されているようなので、このGeoLocationという謎のデータを位置情報に変換していきましょう。
[sample_property]にメッシュとロケーションを接続します。このノードではGeoLocationが指し示す場所の様々な情報を取得することができます。
今回は位置情報を取得したいので、defaultポートを右クリックしてデータタイプをMath::float3に設定し、propertyポートの入力をpoint_positionにしてください。[sample_property]からはGeoLocationで示された場所の位置情報が出力されるようになります。
他にも[sample_property]の設定を変えることで様々なデータを取得することが出来ます。
いくつか他の例を見てみましょう。
ここからは上記のサンプルグラフに2つ目のメッシュを入力しています。そして検索スタート位置は2つめのメッシュの頂点位置となっています。
ロケーションの位置を取得する
defaultポート=float3
propertyポート=point_position
ロケーションの法線を取得する
defaultポート=float3
propertyポート=point_normal / face_vertex_normal
ロケーションのバーテックスカラーを取得する
defaultポート=RGBAの場合はMath::float4 / RGBの場合はfloat3 / Aのみの場合はfloat
propertyポート=Mayaメッシュのバーテックスカラーマップ名(例:colorSet)
ロケーションのUVを取得する
[sample_property]の代わりに[sample_mesh_UVs]を使用してください。
アイデア次第でいろいろな使い道がありそうですよね。
とはいえ「なぜ一旦GeoLocationという謎データを挟むのか?メンドクセーな」と思われたかもしれません。実はそこに空間検索の汎用性の高さの秘密があります。
要となるGeoLocationとは一体何者なのか!?
その詳細は「空間検索【後半】」につづく。
高島 正規
テクニカルアーティスト
長年シネマティックアーティストとしてフェイスリグやフェイシャルモーションの制作を担当。現在は技術戦略グループに所属し、DCCツールのプラグイン開発のための内製C++ライブラリの構築と、Bifrostを用いたツール開発を行っている。