DAG パス
 
 
 

DAG パスは、グラフ内で特定のノードまたはノードのインスタンスの場所を一意に識別するノード セットです。パスはグラフの系図を表します。グラフのルート ノードから始まり、ルート ノードの特定の子、この子の特定の子というように続き、パスで指定されるノードが含まれます。インスタンス化されたノードには、ルート ノードからインスタンス化されたノードまで続く複数のパスがあり、それぞれのインスタンスに 1 つのパスがあります。Maya では、ルート ノードで始まるパスのそれぞれのノードに名前を付け、縦線「|」で区切るという方法でパスを表示します。

DAG パスと API のワールド空間の操作

DAG パスはシェイプがシーンに挿入される方法を表すため、ワールド空間の操作を API で実行する場合、必ず DAG パスを使用する必要があることに注意してください。ノードの「MObject」ハンドルを取得して、そのノードのコンポーネントのワールド空間の位置を要求しても、API 操作はエラーになります。DAG パスがないと、ワールド空間のどこにオブジェクトが存在するかを Maya は認識できないためです。実際、インスタンス化されたオブジェクトの場合はこの要求に対する答えが複数存在することがあります。このような場合、DAG パスのみが、ノードの特定インスタンスを一意に識別します。ノードの MObject を返すメソッドを持つほとんどすべてのクラスには、DAG パスを返すメソッドも含まれているので、目的のノードの MDagPath ハンドルを取得できます。すべての MFn クラスは、MObject か MDagPath のどちらかで構築できます。MObject を使用すると、MFn クラスのメソッドを使用して実行した、すべてのワールド空間の操作はエラーになりますが、MDagPath を使用すると問題なく終了します。

パス表記にノードを追加または削除する

MDagPath クラスはパスの表記を構築し、これを使用すると、この表記を調べて変更できます。MDagPath は、ルート ノードをスタックの最下部にした、ノードのスタックとしてパスを表現します。push() メソッドと pop() メソッドを使用して、パスのノードを表記に追加したり削除したりすることができます。

注:これらのメソッドは、実際の DAG に対してノードの追加や削除を行うのではなく、MDagPath クラスで構築されたパス表記のみに対してこれを行います。比較演算子と代入演算子は、グラフ自体ではなく、MDagPath クラスで構築された表現上で動作します。このため、あるパスを別のパスに代入してもグラフは修正されず、目的の MDagPath インスタンスの内容のみが修正されます。

包括的行列と排他的行列

パス中のノードは DAG 階層の別々のレベルに存在するので、パスの各ノードに累積したさまざまな変換が存在します。MDagPath クラスは、これらの変換が inclusiveMatrix() クラスと exclusiveMatrix() クラスを使用して返すことを可能にします。

たとえばパスが以下のように定義されているとします。

|RootTransform|Transform1|Transform2|Shape

Transform2 までの包括的行列は、RootTransform、Transform1、および Transform2 の累積です。排他的行列は、RootTransform および Transform1 だけの累積を含みます。

シェイプ ノードを DAG パスに追加する理由

Maya では、オブジェクト レベルで選択を行うと、実際に選択したシェイプの親ノードであるトランスフォーム ノードが選択されます。MGlobal::getActiveSelectionList() を使用して選択を調べると、コールした側に返される MDagPath は、このトランスフォームまでのパスのみを指定し、画面上で選択された実際のシェイプを指定しません。MDagPath には extendToShape() という便利なメソッドがあり、これをコールすると、最終変換の下のシェイプ ノードをパスに追加できます。

特定の MDagPath に適用できる有効な関数セットは、パスの最終ノードで決まります。最終ノードがトランスフォーム ノードである場合は、トランスフォーム ノード上で動作する関数セットを MDagPath インスタンスに適用できます。シェイプ ノードがパスの最終ノードである場合、MDagPath インスタンスに適用できる関数セットは、そのシェイプに作用する関数セットです。

固有の名前

DAG パスを使用すると、オブジェクト名を再使用できます。共通の親ノードを持つ 2 つ以上の DAG ノード上に同じ名前が表示されない限り、オブジェクト名は再使用できます。