筆者環境
・Bifrost2.5.0.0
・Maya2020.2
今回は処理の最適化をご紹介しようと思います。
(当ブログで[]で括っているものはBifrostGraphEditor内のノード名です)
BifrostShapeGraph / BifrostBord
これまでブログ内ではBifrostのノード自体をBifrostGraphノードと記述してきましたが、実は以下の2種類存在します。
BifrostGraphShape
トランスフォームやシェイプのパラメータを持ったDAGノードで、ツリー階層内に含めることが出来ます。新規作成したグラフはこのタイプになります。
BifrostBoard
こちらはDGノードです。
ツリー階層化は出来ませんが、リグソルバーやコンストレイントなどの計算がメインの場合はこちらのタイプの方が高速です。
それぞれのタイプ切り替えはメニュー>Edit>Convert Graphで行います。
Amino::Object
#01 input でも少し触れましたがBifrostはMayaとは異なるライブラリで構成されている為、相互でデータを受け渡す際にはコンバートが発生します。
Bifrostの仕組み上避けて通れないコストではありますが、例えば下図のようにBifrostGraphノード間でデータを受け渡しするだけの場合には全くの無駄なコストとなりますよね。
このような状況ではAmino::Objectの利用をお勧めします。
Amino::ObjectはBifrostの様々なタイプのデータを一元管理できるマスタークラスです。Amino::ObjectにデータとKey(データに付ける一意の名前)をセットにしたものを格納し、それを別の任意の場所で展開することができます。
Mayaへは不明なデータタイプのポートとして公開されるのでコンバートは行われません。
試しにBifrostのMatrixデータをAmino::Objectを介して受け渡ししてみましょう。
まず[value]を取得してデータタイプをObjectにします。もう一つ[value]でMatrixデータも準備しておきましょう。
[set_propaty]を取得して先ほどのObjectとMatrixデータ、そしてkeyをセットします。
Objectを[output]に接続してMayaに公開しましょう。
次にAmino::Objectを受け取る側のグラフを作っていきます。
MatrixやVectorと同じようにAmino::Objectタイプでポートを作成しMayaのノードエディタ上で接続する方法もありますが、Amino::ObjectはMeshやCurveと同じく中ボタンのドラッグ&ドロップによる入力がサポートされています。
ですので、受け取る側のBifrostGraphを開いて先ほどのBifrostGraphノードをグラフエディタ上に中ボタンでドラッグ&ドロップすれば完了です。(Mayaのノードエディタ上では自動的にAmino::Objectタイプのポートが接続されます)
では受け取ったAmino::ObjectデータからMatrixデータを抜き出してみましょう。
ここではkeyとデータタイプの指定が必要になります。[get_propaty]にObjectを接続した後、keyを入力しdefaultポートのタイプをfloat4x4に設定します。
Amino::Object内にkeyとデータタイプの組み合わせに合致したものが見つかれば、[get_propaty]の出力から受け取ることができます。
このようにしてコンバートのコストをかけることなくBifrostGraphノード間でのデータの受け渡しが可能になります。
キャッシュ
Bifrostエディタ上のノードは純粋な関数ノードですので、Mayaのノードのようにキャッシュを持つことはありません。ですが以下の機能を使用してキャッシュを作ることができます。
BifrostGraphノードのインプットポート
BifrostGraphノード自身はMayaのカスタムノードなので、インプットポートに入力されたデータは上流が更新されるまでポートに保持されます。これをキャッシュとして使用できます。
例えば下図では左側のノードでソルバーの初期化、右側でソルバーの実行といった構成にすることで処理速度の向上を図っています。
(更にこの例では先ほど紹介したAmino::Objectでソルバーのデータを受け渡しすることでコンバートのコストを最小限にしています)
フィードバックポート
もう一つの方法として#04 で紹介したフィードバックポートも同様にキャッシュとして利用可能です。
基本機能の紹介はこれにて一旦終了です。
次回は当初目標に掲げていたメッシュ散布ツールを作ってみましょう!「メッシュ散布ツールを作ってみよう【前半】」
高島 正規
テクニカルアーティスト
長年シネマティックアーティストとしてフェイスリグやフェイシャルモーションの制作を担当。現在は技術戦略グループに所属し、DCCツールのプラグイン開発のための内製C++ライブラリの構築と、Bifrostを用いたツール開発を行っている。