マニピュレータの表示ツール(Show Manipulator Tool)により、マニピュレータを使用してプラグ値を修正したり、ノードのコンストラクション ヒストリにアクセスできます。マニピュレータの表示ツール(Show Manipulator Tool)内で複数のオブジェクトを選択すると、対応するマニピュレータが、選択したそれぞれのオブジェクトで表示されます。
マニピュレータが付いているオブジェクトが DAG ノードである必要はありません。回転マニピュレータなど、一部のマニピュレータは、最終のシェイプ(Shape)の上流であるディペンデンシー ノードに付きます。たとえば nurbsSphereShape1 という球では、nurbsSphereShape1 と比較して上流にある makeNurbsSphere1 ノードに回転マニピュレータを付ける必要があります。
カメラ マニピュレータとライト マニピュレータなど、その他のマニピュレータは、ライトやカメラの Transform か Shape に付けることができます。
マニピュレータの表示ツール(Show Manipulator Tool)の詳細については、『Maya の基本』マニュアルを参照してください。
マニピュレータの表示ツール(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); ... }
class footPrintLocator : public MPxLocatorNode { ... public: static MTypeId id; }; MTypeId footPrintLocator::id(0x81101);
マニピュレータは、マニピュレータの表示ツール(Show Manipulator Tool)で起動する他に、ユーザ定義コンテキストから起動することもできます。
MPxSelectionContext クラスには、マニピュレータの管理をサポートする addManipulator() と deleteManipulator() の 2 つのメソッドがあります。
これら 2 つのメソッドの使用に加え、MPxSelectionContext::toolOnSetup と MPxContext::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.cpp プラグインは、マニピュレータをコンテキストから作成する方法を示します。moveManipはmoveToolManip.cpp のユーザ定義マニピュレータで、2 つのベース マニピュレータ、FreePointTriadManip と DistanceManip から構成されています。
このプラグイン サンプルは、マニピュレータの表示ツール(Show Manipulator Tool)をユーザ定義ノードとユーザ定義マニピュレータと併用する方法を示しています。ユーザ定義マニピュレータは DistanceManip から構成されています。
このプラグインは、ユーザ定義コンテキスト内のノードのカスタム アトリビュートで、ユーザ定義のマニピュレータを作成する方法を実例で示しています。このカスタム マニピュレータは、3 つの DistanceManip で構成されます。
このプラグインは、マニピュレータをコンテキストから作成する方法を示します。moveManipはmoveToolManip.cpp のユーザ定義マニピュレータで、2 つのベース マニピュレータ、FreePointTriadManip と DistanceManip から構成されています。
このプラグインは、マニピュレータの表示ツール(Show Manipulator Tool)をユーザ定義ノードおよびユーザ定義マニピュレータと併用する方法を実例で示しています。ユーザ定義マニピュレータは DistanceManip から構成されています。また、DistanceManip が常に足の位置に追従するように plugToManip 変換コールバック関数を書き込む方法を実例で示します。
このプラグインは、回転ベースのマニピュレータの別のモードを例示します。rotateManip.cpp のユーザ定義マニピュレータは、回転ベース マニピュレータと状態ベース マニピュレータから構成されています。状態マニピュレータは、回転マニピュレータのモード(オブジェクト モード、ワールド空間モード、ジンバル モード、スナップ付きオブジェクト モード)を制御するために使用します。
このプラグインは、スケール ベースのマニピュレータの使用方法を示し、またコンポーネントの操作方法も示します。プラグイン componentScaleManip.cpp はスケール ベースのマニピュレータから構成されています。マニピュレータは、すべての選択した頂点に対して manipToPlug 変換コールバックをアタッチすることにより機能します。変換関数は、保存されている最初の頂点位置と scale manipValue を使用して、新たな頂点位置を計算します。
このプラグインは、pointOnSurface ベースのマニピュレータを使用して、param manipValue に接近した頂点を変更する方法を実例で示します。このプラグインは、manipToPlug 変換関数を NURBS サーフェス上の頂点位置を更新するためのコールバックとして使用します。
このプラグインは、CircleSweepManip、DirectionManip、DiscManip、DistanceManip、FreePointTriadManip、StateManip、ToggleManip、RotateManip、ScaleManip などのさまざまなベース マニピュレータで構成されたユーザ定義マニピュレータを実例で示します。
この例は、MPxManipulatorNode クラスをコマンドとともに使用して、ユーザ定義マニピュレータを作成する方法を示しています。作成されるマニピュレータは、OpenGL の選択可能なコンポーネントである単純なラインです。選択可能なコンポーネントを動かすと、選択したトランスフォームのスケール アトリビュートが変更されます。ラインの動きはプレーンに制限されます。マニピュレータ ノードを作成および削除し、元に戻す(Undo)、やり直し(Redo)、その他をサポートするために、対応するコマンドが使用されます。
この例は、MPxManipulatorNode クラスをコマンドとともに使用して、ユーザ定義マニピュレータを作成する方法を示しています。マニピュレータは、OpenGL の選択可能なコンポーネントである 4 つの辺を持つ単純な四角形です。選択可能なコンポーネントを動かすと、選択したトランスフォームのスケール アトリビュートが変更されます。マニピュレータ ノードを作成および削除し、元に戻す(Undo)、やり直し(Redo)、その他をサポートするために、対応するコマンドが使用されます。