シェイプ作成のゴールは、定義したジオメトリ クラスを取り、DAG オブジェクトの形式でそのジオメトリを Maya に統合することです。
ジオメトリ固有の情報は、ジオメトリ クラス内に維持してください。こうすると、ディペンデンシー グラフ データとしてジオメトリを表現しやすくなります。ジオメトリ固有の情報をジオメトリ クラス内に維持すると、ジオメトリ固有の描画情報を Maya の描画要求待ち行列に描画データとして渡す場合に描画を処理しやすくなります。
ユーザ定義シェイプは、描画機能、選択機能、コンポーネント機能が加わるため、DG ノードより複雑です。コードを書き始める前に、まずシェイプ ノードの設計から始めるのがよいでしょう。シェイプ ノードの設計には、入出力アトリビュートの定義、およびアトリビュート間のリレーションシップ(関係、影響)の決定が含まれます。
最も単純なシェイプは、コンポーネントやジオメトリ データを含まないシェイプです。たとえば、入力半径、X ディビジョン、Y ディビジョンを取り、球体のジオメトリを計算して openGL で描画する球体シェイプです。
シェイプを段階的に作成することもよい考えです。まず、MPxSurfaceShape と MPxSurfaceShapeUI から派生させます。MPxSurfaceShape クラスの作成は、MPxNode クラスの作成と同じです。その他の仮想関数は、必要に応じてオーバーライドすることができます。
Maya へのシェイプの登録は、DG ノードの登録に似ています。唯一の違いは、シェイプ ノードと同時に登録する必要がある、独立した UI クラスがあることです。シェイプの登録には、MFnPlugin::resgisterShape 関数を使用します。シェイプの登録解除は、ノードの登録解除とまったく同じです。以下はシェイプ登録の例です。
MStatus initializePlugin( MObject obj )
{
MFnPlugin plugin( obj,"Autodesk","2.0", "Any");
return plugin.registerShape( "yourShape", yourShape::id,
&yourShape::creator,
&yourShape::initialize,
&yourShapeUI::creator );
}
MStatus uninitializePlugin( MObject obj )
{
return plugin.deregisterNode( yourShape::id );
}