筆者環境
・Bifrost2.5.0.0
・Maya2020.2
前回は配列データの取扱い方法を紹介しました。となると次は配列の各要素に処理を行いたくなりますよね~。ということでビジュアルプログラミングでは鬼門ともいえるループ処理について見ていきましょう。
他のノードベースのツールでもループ処理をどのように視覚化するかは独自の解釈と実装があり、差の出るポイントになっています。Bifrostでもデザインに熟考を重ねた跡が見て取れます。前回のブログで紹介したポート形状が重要になりますので、事前に確認しておくことをお勧めします。
Bifrostでは3つのループ処理専用ノードが提供されていますがこれらの説明は次回にして、今回は専用ノードを使わずに並列処理を簡単に作成できるオートループという機能に焦点を当てます。
(当ブログで[]でくくっているものはBifrostGraphEditor内のノード名です)
オートループ(並列処理)
早速ですがサンプルのグラフで説明をしていきます。
下図はメッシュデータの0番頂点の位置に値を加算するグラフです。
(このグラフのテキストデータは05.zipの”sample1.txt”です。文面をグラフエディタにペーストしてご使用ください)
A:[get_point_position] 全頂点の位置情報を取得
B:[get_from_arry] 0番目の頂点の位置データを抜き出す
C:[add] {0,1,0}値を加算
D:[set_in_array] 編集した位置データを配列に戻す
E:[set_point_position] メッシュの頂点位置を更新
このグラフでは0番の頂点のみが処理対象となっていますが、オートループ機能でメッシュの全頂点に処理を行うグラフに編集していきましょう。まずは配列の要素にアクセスしているノードBとDを削除して単純なグラフにします。(頂点の移動処理は一旦OFFになります)
[get_point_position]で取得した全頂点の位置データを[add]に繋げます。
[add]の出力データを[set_point_position]に繋げます。
ハイ終了です。簡単でしょ?
では一体何が起こっているのでしょう?
[add]には配列データを渡したので入出力のポートは自動的にハットアイコンになります。更によく見てみるとポートには絵柄が付いていますね。
このポートアイコンは配列データに対してノード処理が並列実行されることを表します。このグラフの場合は下図のように{0,1,0}の値の加算が並列で実行されているということです。これがオートループという機能です。
オートループ機能を使えば「ループで実行したいタスク(グラフ)を作成して配列データを入力する」という非常に直観的な手順で、驚くほど簡単に並列処理を作ることができます。
別の例をみてみましょう。
下図の[add_sub]という名前のノードは
[in_position] + [add_value] – [sub_value] = [out_position]
という処理を行うカスタムノードです。
(このグラフのテキストデータは05.zipの”sample2.txt”です)
このカスタムコンパウンドをメッシュの全頂点に対して実行したい場合は、頂点位置の配列データをin_positionポートに接続するだけです。処理は下図のようになります。
ではsub_valueポートにも配列データを入力するとどうなるでしょう。
この場合は同じ要素番号で処理が実行されます。
最後にもう一つ想定される状況として、配列データの要素数が異なる場合はどうなるでしょう。
この場合は最も小さな要素数によってループの実行回数や出力配列データの要素数が切り詰められます。
最後に
オートループは実装の手軽さとグラフの読みやすさで非常に優れた機能です。また処理も並列実行となるためパフォーマンスも良いですし、ループ処理を作る際はまずこの機能で実装できないか検討することをお勧めします。
ですが異なる要素番号を参照したりタスク間で相互に影響する処理を作ることは出来ないため、その場合はループ専用ノードを使用する必要があります。
次回「ループの作り方 【後半】専用ノード」では専用ノードを用いて、より本格的なループの組み立てる方法を見ていきましょう。
高島 正規
テクニカルアーティスト
長年シネマティックアーティストとしてフェイスリグやフェイシャルモーションの制作を担当。現在は技術戦略グループに所属し、DCCツールのプラグイン開発のための内製C++ライブラリの構築と、Bifrostを用いたツール開発を行っている。