マニピュレータの表示ツール(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 のユーザ定義マニピュレータは、回転ベース マニピュレータと状態ベース マニピュレータから構成されています。状態マニピュレータは、回転マニピュレータのモード(オブジェクト モード、ワールド空間モード、ジンバル モードおよびスナップ付きオブジェクト モード)を制御するために使用します。