複数のシェイプを持つトランスフォーム

トランスフォーム ノードは、子として任意の数のトランスフォーム ノードを持つことができます。一般的には、トランスフォーム ノードが子として持てるシェイプ ノードは 1 つのみです。UI ウィンドウで DAG を表示すると、常にこのようになっています。しかし DAG を API から見ると、トランスフォームに複数のシェイプ ノードが子として含まれている場合があることに気付きます。このことが起きるのは、トランスフォームの下にあるオリジナルのシェイプ ノードが、ディペンデンシー グラフで変更されている場合です。ディペンデンシー グラフの結果に変換を保持するには、オリジナルのノードと同じトランスフォームの下にその結果を配置します。新しいノードには、元と同じ DAG トランスフォームが適用されていますが、CV が移動しているなど、何らかの方法で修正されています。この場合、UI ウィンドウには最終結果のみが可視になり、元のノードはヒストリとして残ります。

|Transform1|Shape1 がオリジナルのオブジェクトですが、|Transform1|Shape1a が、UI ウィンドウで可視になる、実際のオブジェクトです。|Transform1|Shape1 は中間オブジェクトとも呼ばれ、後でディペンデンシー グラフを操作するときに重要となります。

警告:複数のシェイプを持つトランスフォームが最終ノードになっているパスで MDagPath::extendToShape() メソッドを使用した場合、最初の子シェイプ ノードがパスの末尾に追加されます。これが目的のノードでない場合、extendToShape() メソッドを使用しないでください。その代わりに MDagPath::child() メソッドと MDagPath::childCount() メソッドを使用し、目的のシェイプ ノードを参照したりアクセスしたりします。

さらに、正しい子シェイプに拡張するために使用できる MDagPath::extendToShapeDirectlyBelow (unsigned int index) メソッドがあります。

アンダーワールド

「アンダーワールド」は、NURBS サーフェスの UV 空間など、シェイプ ノードのパラメータ空間に付けられた名前です。このアンダーワールド空間内で、ノード、およびノードのサブグラフ全体を定義できます。

例として、NURBS サーフェス上のカーブを定義するトランスフォーム ノードとシェイプ ノードが挙げられます。カーブを定義するコントロール ポイントは、サーフェスの UV 空間内にあります。アンダーワールドのノードを一意に識別するパスは、アンダーワールドのパラメータ空間を定義するシェイプ ノード内をルートとします。アンダーワールドパスの第 1 ノードは、シェイプを含んだパラメータ空間内で定義される第 1 ノードです。この第 1 ノードは、トランスフォーム ノードであることがほとんどです。

アンダーワールド パスは、通常のパスと同じように指定します。つまり、パス内のノード名は「|」で区切ります。ただし、追加の命名規則として「->」を使用します。これは、アンダーワールド パスのシェイプ ノードとルート ノード間のトランジションを表します。

たとえば NURBS サーフェスのサーフェス ノード上にあるカーブのパスを完全に指定すると、|SurfaceTransform|NURBSSurface -> UnderworldTransform|CurvesShape となります。シェイプを定義するパラメータ空間がある限り、アンダーワールドのシェイプにアンダーワールドを再帰的に定義できます。

MDagPath には、シェイプからアンダーワールドに至る、さまざまなパスにアクセスするメソッドが含まれています。MDagPath::pathCount() メソッドでは、ある MDagPath インスタンスが表記するパスの総数が返されます。前述のカーブ オン サーフェスの例では、MDagPath インスタンスがアンダーワールドのカーブ シェイプまでのパスを表す場合は、pathCount は 2 となります。MDagPath::getPath() メソッドは、アンダーワールドまたは 3 次元空間のいずれかでパスを返します。Path 0 では常に 3D パスを指定します。パス 1 は、パス 0 の最後にあるシェイプのすぐ内側にあるアンダーワールドでパスを指定します。パス 2 は、パス 1 の最後にあるシェイプのすぐ内側にあるアンダーワールドでパスを指定します。以下同様に続きます。