マニピュレータの表示ツール(Show Manipulator Tool)により、マニピュレータを使用してプラグ値を修正したり、ノードのコンストラクション ヒストリにアクセスできます。 マニピュレータの表示ツール(Show Manipulator Tool)内で複数のオブジェクトを選択すると、対応するマニピュレータが、選択したそれぞれのオブジェクトで表示されます。
マニピュレータが付いているオブジェクトが DAG ノードである必要はありません。回転マニピュレータなど、一部のマニピュレータは、最終のシェイプ(Shape)の上流であるディペンデンシー ノードに付きます。たとえば nurbsSphereShape1 という球では、nurbsSphereShape1 と比較して上流にある makeNurbsSphere1 ノードに回転マニピュレータを付ける必要があります。
注: makeNurbsSphere1 ノードは DAG ノードでなく、ハイパーグラフ(Hypergraph)かチャネル ボックス(Channel Box)内で選択できます。
カメラ マニピュレータとライト マニピュレータなど、その他のマニピュレータは、ライトやカメラの 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); ... }
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); ... }
以下に、Developer Kit インストレーションの(devkit\plug-ins)フォルダで使用可能なマニピュレータのサンプルを示します。
moveManip.cpp プラグインは、マニピュレータをコンテキストから作成する方法を示します。moveManipはmoveToolManip.cpp のユーザ定義マニピュレータで、2 つのベース マニピュレータ、FreePointTriadManip と DistanceManip から構成されています。
このプラグイン サンプルは、マニピュレータの表示ツール(Show Manipulator Tool)をユーザ定義ノードとユーザ定義マニピュレータと併用する方法を示しています。 ユーザ定義マニピュレータは DistanceManip から構成されています。
注: このマニピュレータでは、変換関数を使用して足の位置に DistanceManip を配置します。このようにしないと、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 サーフェス上の頂点位置を更新するためのコールバックとして使用します。
注: このプラグインは manipToPlug 変換関数をダミー プラグを計算するコールバックとして使用し、頂点位置を個別に更新しているため、undo 機能はサポートしていません。
このプラグインは、CircleSweepManip、DirectionManip、DiscManip、DistanceManip、FreePointTriadManip、StateManip、ToggleManip、RotateManip、ScaleManip などのさまざまなベース マニピュレータで構成されたユーザ定義マニピュレータを実例で示します。
この例は、MPxManipulatorNode クラスをコマンドとともに使用して、ユーザ定義マニピュレータを作成する方法を示しています。作成されるマニピュレータは、OpenGL の選択可能なコンポーネントである単純なラインです。選択可能なコンポーネントを動かすと、選択したトランスフォームのスケール アトリビュートが変更されます。ラインの動きはプレーンに制限されます。マニピュレータ ノードを作成および削除し、undo、redo、その他をサポートするために、対応するコマンドが使用されます。
この例は、MPxManipulatorNode クラスをコマンドとともに使用して、ユーザ定義マニピュレータを作成する方法を示しています。マニピュレータは、OpenGL の選択可能なコンポーネントである 4 つの辺を持つ単純な四角形です。選択可能なコンポーネントを動かすと、選択したトランスフォームのスケール アトリビュートが変更されます。マニピュレータ ノードを作成および削除し、undo、redo、その他をサポートするために、対応するコマンドが使用されます。