マニピュレータをマニピュレータの表示ツールにコネクトする
 
 
 

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

マニピュレータが付いているオブジェクトが 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);
 ...
}

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

moveManip

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

footPrintManip

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

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

rotateManip

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

componentScaleManip

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

surfaceBumpManip

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

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