ディペンデンシー グラフのデフォーマ

デフォーマは、変形しているシェイプのコンストラクション ヒストリに配置されます。次の図は、デフォーマを含む通常のディペンデンシー グラフを示します。

変形されたシェイプ ノード(pSphereShape)が、ディペンデンシー グラフの右側に表示されています。中間オブジェクト(pSphereShapeOrig)が、ディペンデンシー グラフの左側に表示されています。中間オブジェクトは、各デフォーマ チェーンの先頭にありますが、オブジェクトの intermediateObject アトリビュートを無効にするまで表示されません。中間オブジェクトは、シェイプを変形する前の元の位置を保存するストレージとして機能します。

一般的なデフォーマ チェーンでは、中間オブジェクトから出たシェイプ データが、各デフォーマを通過します。この例では、トラバースされたデフォーマ tweak1、cluster1、ffd1 が黄色でハイライト表示されています。ffd1 を通過するのは、単一のシェイプのみです。ただし、デフォーマのベース クラスの入力および出力ジオメトリ アトリビュートがマルチであるため、多くのデフォーマでは任意の数のシェイプを操作できます。このルールには、単一ジオメトリのみを操作できる、skinCluster とラップ ノードの 2 つの例外があります。skinCluster とラップ ノードに接続されているその他のジオメトリは無視されます。

ディペンデンシー グラフ内の点線は、いくつかの補助ノードが表示されていないことを示します。この例では、補助ノードは、groupParts ノードです。このノードは、デフォーマ セットのコンポーネント リストを格納するために使用されます。

デフォーマおよびセット

各デフォーマは、1 つのセットに関連付けられます。デフォーマは、関連付けられているセットに含まれているポイントのみを変形します。sets コマンドを使用してセットにポイントを追加すると、デフォーマは、自動的にシェイプのコンストラクション ヒストリに関連付けられます。同様に、セットからポイントを除去すると、除去したポイントに対してデフォーマが作用しなくなります。デフォーマによって使用されるセットは、頂点のみを含むことができる、頂点に限定されたセットです。関連付けられているデフォーマのセットを確認する簡単な方法は、MFnGeometryFilter::deformerSet メソッドを使用することです。返されたセットは、次に、MFnSet を作成するために使用できます。これは、メンバーシップ情報にアクセスするために使用できます。次のコードは、一例を示します。

MFnGeometryFilter fnDeformer(defObject);
    MObject setObject = fnDeformer.deformerSet();
    MFnSet fnSet(setObject);
    MSelectionList members;
    fnSet.getMembers(members,false);
    MItSelectionList itr( members );
    for (; !itr.isDone(); itr.next()) {
        MDagPath path;
        MObject components;
        itr.getDagPath(path, components);
        …
    }

groupParts ノードと groupId ノード

Maya のほとんどのセットは、objectSet ノードのみで構成されています。ただし、Maya のコンポーネント セットは、objectSet ノード内ではなくのシェイプ データ内に保存されます。セットは、各シェイプの groupId ノードおよびコンストラクション ヒストリを持つ各シェイプの groupParts ノードに接続されます。既定では、ビューが乱雑になるため、groupParts ノードおよび groupId ノードはハイパーグラフに表示されません。補助ノードの表示をオンにすることにより、groupParts ノードおよび groupId ノードを表示できます。次の図は、ffd デフォーマの groupParts、groupId、および objectSet ノードを表示しているハイパーグラフ ビューです。ハイパーグラフの乱雑さを下げるために微調整ノードがシェイプの履歴から削除されます。

groupId ノードは、シェイプのセット リスト内でセットのメンバーシップを素早く判別するために、シーン内で固有の ID を保存します。groupParts ノードは、コンストラクション ヒストリがあるシェイプのコンポーネント セットを保存します。シェイプ データが履歴を通過する間に、番号が変わることがあります。コンポーネント リストは頂点のインデックスを使用して保存され、polySplit、deleteComponent など一部のコンストラクション ヒストリ ノードでは、頂点の番号が修正されます。groupParts ノードは、コンストラクション ヒストリ内にあるため、頂点番号変更による影響を受けません。groupParts ノードは、頂点の番号が振り直される前にシェイプ データを受け取ります。このアーキテクチャは、特定のポリゴン モデリング操作で便利です。ただし、次のような場合に問題が発生することがあります。

たとえば、ヒストリを持つ 10 x 10 polyPlane を作成してあるとします。プレーンの上部の頂点を選択し、クラスタを作成しました。クラスタは、セットに含まれている選択された頂点上で動作します。ここで、プレーンのヒストリ ノードを選択して、プレーンの分割数を 10 x 10 から 9 x 10 に修正します。これで、クラスタのメンバーシップが元々指定したメンバーシップと異なりました。次の図は、この例を示します。10 x 10 のプレーンに作成されているクラスタのメンバーシップを左に、ヒストリが 9 x 10 に修正された後のメンバーシップを右に示します。

頂点のウェイト付けに長時間かけた場合、このことは非常に不都合です。この事態は、トポロジを変更する前にウェイト マップを書き出し、その後ウェイト マップを読み込むなどの回避策に従うことで、防ぐこともできます。