ディペンデンシー グラフ

このトピックでは、Maya のディペンデンシー グラフの基本概念を説明します。

ディペンデンシー グラフの概要

ディペンデンシー グラフは、MObject のインスタンスによって表される、ノードのネットワークです。ノードの接続ポイントはプラグと呼ばれ、MPlug のインスタンスによって表されます。有向エッジは、1 つのノードの出力プラグを別のノードの入力プラグに接続します。以下で詳しく説明しますが、データ ブロック(MDataBlock)は、グラフ内の接続されたノードに順番にアクセスし、各ノードの compute() 関数への入力を提供し、結果の出力を保存します。

ディペンデンシー グラフ内のノードの動作を示すには、単純なメッシュ デフォメーションノードを検討してください。このようなノードは頂点のセットを入力として取得し、それらを compute() 関数を使用して出力頂点の新しいセットに変換します。この新しい頂点のセットは、ディペンデンシー グラフの別のノードによって順番に変更していくことができます。

注:シーン グラフとも呼ばれる Directed Acyclic Graph (DAG)は、ディペンデンシー グラフのサブセットです。DAG のトランスフォーム ノードとシェイプ ノードは、ディペンデンシー グラフの別のノードに接続し、それらの動作に影響を与えたり、動作をアニメートすることができます。

データの伝播とノードの計算

MPlug の目的は、Maya の進行中のディペンデンシー グラフ評価プロセス中に再計算する必要のある値にフラグを設定することです。MPlug がダーティとマークされている場合は、その関連の値を再計算する必要があります。このダーティ フラグは、グラフ内の関連の MPlug に伝播されます。ダーティな MPlug を含むノードで compute() 関数がコールされると、ダーティな MPlug は削除としてマークされ、不要な再計算が回避されます。

次の図では、「mynode1.outputAttribute」出力の MPlug に関連付けられている値を再計算するために、mynode1 インスタンスの compute() 関数がコールされています。compute() 関数は、次の 2 つのパラメータを取ります。

  1. 「ダーティ」出力の MPlug: 1 つのノードに複数のダーティ出力 MPlug が含まれる場合があります。このパラメータは、計算で「削除中」の MPlug を通知します。
  2. MDataBlock のインスタンス: 提供されている MDataBlock のインスタンスには、出力の計算に必要な入力値が含まれます。結果の出力は、MDataBlock に含まれる、対応する出力 MDataHandle に格納する必要があります。このトピックの後半で、特定の出力を計算するために提供する入力を Maya に認識させる方法について説明します。

データの伝播と計算の簡単な例として、ユーザが Maya のユーザ インタフェースを介してサブディビジョンのポリゴンの数を変更したとします。これによりまず、関連のシェイプ ノードの直接接続された入力 MPlug が「ダーティ」としてマークされます。このダーティ フラグがディペンデンシー グラフを通じて伝播された後、Maya では接続されたノードで compute() が順番にコールされて、ダーティな MPlug が「削除」されます。

カスタム ノードを定義する

カスタム ノードは、Maya ディペンデンシー グラフ プラグインを作成することによって定義されます。このプラグインには、MPxNode またはそのいずれかのサブクラスから継承されるクラスが含まれます。この新しいクラスは、MPxNode.compute() 関数をオーバーライドして、カスタム ノードの動作を定義します。ディペンデンシー グラフ プラグインを Maya にロードしたら、スクリプト エディタを使用してノードのインスタンスを作成することができます。

前の図では、initializePlugin() 関数で、mplugin.registerNode() をコールし、パラメータ「mynode」を渡してカスタム ノードのタイプ名を宣言します。したがって、このノードのインスタンスは、次の Python スクリプトを使用して作成することができます。

import maya.cmds as cmds
cmds.createNode( "mynode" )

結果は、プラグインで宣言されたアトリビュート(nodeInitializer())に従って入力および出力 MPlug が初期化されるノードのインスタンスになります。具体的には、プラグインで宣言されたアトリビュートは、作成する MPlug のタイプ、既定値、UI での可視性、読み取り可能(入力として使用可能)かどうか、書き込み可能(出力として使用可能)かどうか、およびシーンが保存されるときにランタイム値がファイルに格納されるかどうかについて示します。

プラグイン定義の nodeInitializer() 関数では、次の項目間の作用対象リレーションシップを宣言します。

MPxNode.attributeAffects() を使用して宣言された 作用対象リレーションシップは、特定の出力を計算するために必要な入力を Maya に伝えます。そのため、ノードの特定のインスタンスで、その inputAttribute1 に関連付けられた MPlug がダーティとマークされている場合、ダーティ フラグは、outputAttribute に関連付けられている MPlug にも伝播されます。このダーティ フラグの伝播により、ノードの compute() 関数がコールされて、ダーティな outputAttribute MPlug が削除されます。