マニピュレータの表示ツール(Show Manipulator Tool)により、Maya のマニピュレータを使用して、プラグ値を修正したり、ノードのコンストラクション ヒストリへのアクセスを提供したりします。マニピュレータの表示ツール内で複数のオブジェクトを選択すると、対応するマニピュレータが、選択したそれぞれのオブジェクトで表示されます。
マニピュレータが付いているオブジェクトが DAG ノードである必要はありません。回転マニピュレータなど、一部のマニピュレータは、最終のシェイプ(Shape)の上流であるディペンデンシー ノードに付きます。たとえば nurbsSphereShape1 という球体では、nurbsSphereShape1 と比較して上流にある makeNurbsSphere1 ノードに回転マニピュレータを付ける必要があります。
カメラ マニピュレータとライト マニピュレータなど、その他のマニピュレータは、ライトやカメラの Transform か Shape に付けることができます。
マニピュレータの表示ツールの詳細については、『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); ... }
moveManip.cpp プラグインは、マニピュレータをコンテキストから作成する方法を示します。moveManipはmoveToolManip.cpp のユーザ定義マニピュレータで、2 つのベース マニピュレータ、FreePointTriadManip と DistanceManip から構成されています。
このプラグイン サンプルは、マニピュレータの表示ツールをユーザ定義ノードとユーザ定義マニピュレータと併用する方法を示しています。ユーザ定義マニピュレータは DistanceManip から構成されています。
このプラグインは、回転ベースのマニピュレータの別のモードを例示します。rotateManip.cpp のユーザ定義マニピュレータは、回転ベース マニピュレータと状態ベース マニピュレータから構成されています。状態マニピュレータは、回転マニピュレータのモード(オブジェクト モード、ワールド空間モード、ジンバル モード、スナップ付きオブジェクト モード)を制御するために使用します。