API ガイド > カスタム トランスフォーム ノードを作成する >

# カスタム トランスフォームを実装する

カスタム トランスフォームを実装する場合、トランスフォームの構築やアトリビュートの設定などを行う必要があります。

単純なカスタム トランスフォームと複雑なカスタム トランスフォーム

トランスフォームには、トランスフォーム情報の処理と格納に使用される入力と出力アトリビュートがあります。最も単純なカスタム トランスフォームは、変換行列に影響を与える可能性のある新規アトリビュートを一切導入しないトランスフォームです。たとえば、この種のトランスフォームは、事前に決められた計算を利用して、移動(Translate)アトリビュートを一定のワールド空間領域に制限します。

複雑なカスタム トランスフォームは、変換行列に影響を与える 1 つまたは複数のアトリビュートを導入するトランスフォームです。たとえば、この種のトランスフォームは、変換行列の最終的な計算で使用される新しいタイプの回転パラメータを導入することができます。この場合、カスタム トランスフォームは 2 種類の回転を認識するため、新しい回転を計算する際にオリジナルの回転アトリビュート(MPxTransform によって提供される)が影響を受けることはありません。

ワールド空間(World space)アトリビュート

オブジェクトをインスタンス化するとシステム メモリが節約され、正確なプロパティを維持しながら 1 つのオブジェクトを複数回表示するのに便利です。ただし、同一のオブジェクトに対する複数のパスが存在するため、オブジェクトをインスタンス化すると、コーディング上の問題が表れます。Maya はワールド空間に分類される配列アトリビュートを使用してこの状況に対処します。複数のパスを処理するには、配列が必要です。

ワールド空間アトリビュートは、独自の座標変換に加えてオブジェクトの親の座標変換に依存しています。アトリビュートをワールド空間としてマーキングすると、親のいずれかが変換された場合にアトリビュートが再計算されます(要求時)。ワールド空間アトリビュートは、上記の例のインスタンス化を処理する配列です。worldMatrix はワールド空間アトリビュートの一例です。アトリビュートを配列として設定し、ワールド空間としてマーキングする処理は、カスタム トランスフォーム ノードの initialize() メソッドで MFnAttribute クラスを使用して実行されます。

ワールド空間アトリビュートが配列である場合には、MArrayDataBuilder クラスを使用してアトリビュートに配置される情報を作成できます。その後、initialize() メソッドで MFnAttribute::setUsesArrayDataBuilder() を使用してアトリビュートを設定する必要があります。

ワールド空間に作用(Affects world space)アトリビュート

ワールド空間に作用(Affects world space)としてマーキングされたアトリビュートは、特定のノードとそのノードの子 DAG でワールド空間アトリビュートを再計算させます(ワールド空間が要求される場合)。このタイプのアトリビュートに対する配列の要件はありません。DAG ノードにある移動(Translate)アトリビュートはワールド空間に作用アトリビュートの一例です。カスタム トランスフォームノードの initialize() メソッドで MFnAttribute クラスを使用して実行されます。

トランスフォームの制限

トランスフォーム ノード(およびカスタム トランスフォームノード)には特別なアトリビュートが存在します。このアトリビュートは関連するアトリビュートの値をクランプする場合に使用します。トランスフォームの制限は 移動、回転、スケールで使用できます。それぞれの操作には、有効(Enabled)、最小(Minimum)、最大(Maximum)の 3 つのアトリビュートが含まれます。これらのアトリビュートを変更するカスタム トランスフォームを使用すると、移動、回転、スケールをワールド空間の一部に制限するノードを実現できます。これは、カスタム トランスフォームの単純な実施例です。複雑なカスタム トランスフォームを使用すると、別のオブジェクトまでの距離などの外部アトリビュート入力に基づいて最小値と最大値を変更できます。

トランスフォームのバランシング

Maya のトランスフォーム ノードでは、ピボット(回転とスケール)や回転順序を変更しても変換行列を同じ状態に維持できます。これは、トランスフォームのバランシングと呼ばれます。バランシングは、ピボットや回転順序情報の変更に関連するメソッドに含まれるパラメータです。MPxTransform と MPxTransformationMatrix の仮想メソッドは、カスタム トランスフォームが Maya の標準的なピボットの処理方法を変更しようとしない限り、バランシングを正しく処理します。

検証および設定

Maya は標準的な検証と設定の仕組みを使ってカスタム トランスフォームのアトリビュート値を更新します。行列に影響を与えるアトリビュートの場合、必ずこの仕組みを使用する必要があります。トランスフォームの行列に影響を与えるアトリビュートの場合、必ず initialize() メソッドで MPxTransform::mustCallValidateAndSet() をコールする必要があります。このようにすると、アトリビュートの変更時に行列が正しく計算され、このアトリビュートに対して MPxTransform::validateAndSet() メソッドがコールされます。

行列を返す方法

Maya は DG 更新処理の一環として、カスタム トランスフォームに変換行列を要求します。この要求は MPxTransform::getMatrix() コールに直接渡されます。次に、この仮想メソッドは、MPxTransformationMatrix::asMatrix() をコールします。カスタム トランスフォームが Maya に行列を返すようにするには、これらの 2 つのメソッドを実装する必要があります。