マニピュレータをマニピュレータの表示ツール(Show Manipulator Tool)に接続する

マニピュレータの表示ツール(Show Manipulator Tool)により、マニピュレータを使用してプラグ値を修正したり、ノードのコンストラクション ヒストリにアクセスできます。マニピュレータの表示ツール(Show Manipulator Tool)内で複数のオブジェクトを選択すると、対応するマニピュレータが、選択したそれぞれのオブジェクトで表示されます。

マニピュレータが付いているオブジェクトが DAG ノードである必要はありません。回転マニピュレータなど、一部のマニピュレータは、最終のシェイプ(Shape)の上流であるディペンデンシー ノードに付きます。たとえば nurbsSphereShape1 という球では、nurbsSphereShape1 と比較して上流にある makeNurbsSphere1 ノードに回転マニピュレータを付ける必要があります。

注: makeNurbsSphere1 ノードは DAG ノードでなく、ハイパーグラフ(Hypergraph)チャネル ボックス(Channel Box)内で選択できます。

カメラ マニピュレータとライト マニピュレータなど、その他のマニピュレータは、ライトやカメラの Transform か Shape に付けることができます。

マニピュレータの表示ツール(Show Manipulator Tool)の詳細については、『Maya の基本』マニュアルを参照してください。

マニピュレータの表示ツール(Show Manipulator Tool)で動作するマニピュレータを作成する

マニピュレータの表示ツール(Show Manipulator Tool)で動作するマニピュレータをあるノードで作成する際には、最初の手順で、ノード型の名前に対応するマニピュレータの名前を選択します。マニピュレータの名前を決めるには、ノードの名前を取ってノード名の最後に Manip を付けます。たとえば、footPrintLocator の Show Manip の場合は、footPrintLocatorManip になります。

plugin.registerNode("footPrintLocator", // name of node
                    footPrintLocator::id,
                    &footPrintLocator::creator,
                    &footPrintLocator::initialize,
                    MPxNode::kLocatorNode);
plugin.registerNode("footPrintLocatorManip", // name of manip
                    footPrintLocatorManip::id,
                    &footPrintLocatorManip::creator,
                    &footPrintLocatorManip::initialize,
                    MPxNode::kManipContainer);

次の手順では、ノードの initialize メソッドで MPxManipContainer::addToManipConnectTable をコールします。たとえば、footPrintLocator::initialize() メソッドでは次のようになります。

MStatus footPrintLocator::initialize()
{
    ...
    MPxManipContainer::addToManipConnectTable(id);
    ...
}

ID は以下のように定義されて宣言されます。

class footPrintLocator : public MPxLocatorNode
{
    ...
    public:
        static MTypeId id;
};
MTypeId footPrintLocator::id(0x81101);

マニピュレータをコンテキストに追加する

マニピュレータは、マニピュレータの表示ツール(Show Manipulator Tool)で起動する他に、ユーザ定義コンテキストから起動することもできます。

MPxSelectionContext クラスには、マニピュレータの管理をサポートする addManipulator()deleteManipulator() の 2 つのメソッドがあります。

これら 2 つのメソッドの使用に加え、MPxSelectionContext::toolOnSetupMPxContext::toolOffCleanup をオーバーライドして、アクティブ リストが修正された場合に toolOnSetup でマニピュレータのコールバックが追加され、toolOffCleanup でコールバックが除去されるようにする必要があります。

コールバックは updateManipulators() 関数で、マニピュレータの追加と削除を実際に実行します。

例:

MCallbackId id1;
void moveContext::toolOnSetup(MEvent &)
{
    ...
    id1 = ModelMessage::addCallback(
    MModelMessage::kActiveListModified,
    updateManipulators, this, &status);
    .... 
}
void moveContext::toolOffCleanup()
{
    ...
    status = MModelMessage::removeCallback(id1);
    ...
}
void updateManipulators(void * data)
{
    ...
    moveContext * ctxPtr = (moveContext *) data;
    ctxPtr->deleteManipulators();
    ...
    // for each object selected
    MString manipName("moveManip");
    MObject manipObject;
    ctxPtr->moveM = (moveManip *) 
        moveManip::newManipulator(manipName,
        manipObject);
    ...
    ctxPtr->addManipulator(manipObject);
    ...
    ctxPtr->moveM->connectToDependNode(dependNode);
    ...
}

マニピュレータのサンプル

以下に、開発キット インストレーションの(devkit¥plug-ins)フォルダで使用可能なマニピュレータのサンプルを示します。

moveManip

moveManip.cpp プラグインは、マニピュレータをコンテキストから作成する方法を示します。moveManipはmoveToolManip.cpp のユーザ定義マニピュレータで、2 つのベース マニピュレータ、FreePointTriadManip と DistanceManip から構成されています。

footPrintManip

このプラグイン サンプルは、マニピュレータの表示ツール(Show Manipulator Tool)をユーザ定義ノードとユーザ定義マニピュレータと併用する方法を示しています。ユーザ定義マニピュレータは DistanceManip から構成されています。

注: このマニピュレータでは、変換関数を使用して足の位置に DistanceManip を配置します。このようにしないと、DistanceManip は原点に表示されます。

customAttrManip

このプラグインは、ユーザ定義コンテキスト内のノードのカスタム アトリビュートで、ユーザ定義のマニピュレータを作成する方法を実例で示しています。このカスタム マニピュレータは、3 つの DistanceManip で構成されます。

moveManip

このプラグインは、マニピュレータをコンテキストから作成する方法を示します。moveManipはmoveToolManip.cpp のユーザ定義マニピュレータで、2 つのベース マニピュレータ、FreePointTriadManip と DistanceManip から構成されています。

footPrintManip

このプラグインは、マニピュレータの表示ツール(Show Manipulator Tool)をユーザ定義ノードおよびユーザ定義マニピュレータと併用する方法を実例で示しています。ユーザ定義マニピュレータは DistanceManip から構成されています。また、DistanceManip が常に足の位置に追従するように plugToManip 変換コールバック関数を書き込む方法を実例で示します。

rotateManip

このプラグインは、回転ベースのマニピュレータの別のモードを例示します。rotateManip.cpp のユーザ定義マニピュレータは、回転ベース マニピュレータと状態ベース マニピュレータから構成されています。状態マニピュレータは、回転マニピュレータのモード(オブジェクト モード、ワールド空間モード、ジンバル モード、スナップ付きオブジェクト モード)を制御するために使用します。

componentScaleManip

このプラグインは、スケール ベースのマニピュレータの使用方法を示し、またコンポーネントの操作方法も示します。プラグイン componentScaleManip.cpp はスケール ベースのマニピュレータから構成されています。マニピュレータは、すべての選択した頂点に対して manipToPlug 変換コールバックをアタッチすることにより機能します。変換関数は、保存されている最初の頂点位置と scale manipValue を使用して、新たな頂点位置を計算します。

surfaceBumpManip

このプラグインは、pointOnSurface ベースのマニピュレータを使用して、param manipValue に接近した頂点を変更する方法を実例で示します。このプラグインは、manipToPlug 変換関数を NURBS サーフェス上の頂点位置を更新するためのコールバックとして使用します。

注: このプラグインは manipToPlug 変換関数をダミー プラグを計算するコールバックとして使用し、頂点位置を個別に更新しているため、元に戻す(Undo)機能はサポートしていません。

swissArmyManip

このプラグインは、CircleSweepManip、DirectionManip、DiscManip、DistanceManip、FreePointTriadManip、StateManip、ToggleManip、RotateManip、ScaleManip などのさまざまなベース マニピュレータで構成されたユーザ定義マニピュレータを実例で示します。

lineManip

この例は、MPxManipulatorNode クラスをコマンドとともに使用して、ユーザ定義マニピュレータを作成する方法を示しています。作成されるマニピュレータは、OpenGL の選択可能なコンポーネントである単純なラインです。選択可能なコンポーネントを動かすと、選択したトランスフォームのスケール アトリビュートが変更されます。ラインの動きはプレーンに制限されます。マニピュレータ ノードを作成および削除し、元に戻す(Undo)やり直し(Redo)、その他をサポートするために、対応するコマンドが使用されます。

squareScaleManip

この例は、MPxManipulatorNode クラスをコマンドとともに使用して、ユーザ定義マニピュレータを作成する方法を示しています。マニピュレータは、OpenGL の選択可能なコンポーネントである 4 つの辺を持つ単純な四角形です。選択可能なコンポーネントを動かすと、選択したトランスフォームのスケール アトリビュートが変更されます。マニピュレータ ノードを作成および削除し、元に戻す(Undo)やり直し(Redo)、その他をサポートするために、対応するコマンドが使用されます。