API ガイド > サンプル プラグイン >

# サンプル スクリプト プラグイン

Maya 開発キットには、Maya Python API のプロキシ クラスの使用法を例示するスクリプト プラグインが含まれています。

animCubeNode

ディペンデンシー グラフ ノード spAnimCube を作成する

このプラグインは、入力として時間を取り、出力としてポリゴン ジオメトリを作成する方法を例示します。このノードの compute メソッドによって、ポリゴン立方体が構成されます。大きさは現在のフレーム番号に依存します。その結果生成されるメッシュが、内部の Maya ノードに渡って表示され、配置できるようになります。

このノードを使用するには、次のコマンドを含む Python スクリプト animCubeNode.py を実行します。

    import maya.cmds as cmds
    cmds.createNode("transform", name="animCube1")
    cmds.createNode("mesh", name="animCubeShape1", parent="animCube1")
    cmds.sets("animCubeShape1", add="initialShadingGroup")
    cmds.createNode("spAnimCube", name="animCubeNode1")
    cmds.connectAttr("time1.outTime", "animCubeNode1.time")
    cmds.connectAttr("animCubeNode1.outputMesh", "animCubeShape1.inMesh")

このコマンドによって、表示用にワールドにフックされた Transform ノードの下に Mesh ノードが作成されます。その後 AnimCube ノードが作成されます。入力は Time ノードに接続され、出力は Mesh ノードに接続されます。

この時点で、立方体が画面に表示されます。タイム スライダ上の再生ボタンを押すと、フレーム番号の変更にともなって、表示されている立方体が拡大/縮小します。

basicObjectSet

objectSet ノード spBasicObjectSet を作成する

このプラグインは、新規作成された spBasicObjectSet ノードに、プロキシ objectSet ノードと、選択した要素を追加するためのコマンドを実装します。これらのノードの 1 つを作成するには、プラグインがロードされた後に次のコマンドを入力します。

    import maya.cmds as cmds
    cmds.createNode( ‘spBasicObjectSet’ )

開発キットで、サンプル スクリプト basicObjectSetTest.py を提供しています。このサンプルは spBasicObjectSet ノードにオブジェクトを追加したり、このノードからオブジェクトを削除したりします。

basicShape

サーフェス シェイプ ノード spBasicShape を作成します。

このプラグインにより、標準 OpenGL コールを使用して、長方形、三角形、円を表示するプロキシ サーフェス シェイプ ノードが実装されます。これらのノードの 1 つを作成するには、プラグインがロードされた後に次のコマンドを入力します。

    import maya.cmds as cmds
    cmds.createNode("spBasicShape")

blindDoubleDataCmd

Python コマンド spBlindDoubleDataCmd とユーザ定義のデータ型 spBlindDoubleData を作成する

このプラグインは、ユーザ定義のデータ型に基づくブラインド データ(ダイナミック アトリビュート)の作成方法を例示します。このプラグインでは、ユーザデータ型として単純な double 値を使用します。また、Maya ASCII と Maya Binary のファイル フォーマットでのデータの格納、検索を実装する読み書きルーチンとして、MPlug クラスを使用してアトリビュートの値を設定、検索する方法を例示します。

このプラグインを使用するには、ディペンデンシー ノードを選択してから次のコマンドを実行します。

    maya.cmds.spBlindDoubleData()

double 値 3.2 からなるダイナミック アトリビュートが、選択した各ディペンデンシー ノードにアタッチされます。Maya ASCII フォーマットでシーンを保存すると、ダイナミック アトリビュートの値を保存する Python コマンドを表示することができます。シーンをリロードすると、ダイナミック アトリビュートが適切なノードに再びアタッチされます。

circleNode

ディペンデンシー グラフ ノード spCircle を作成する

このプラグインは、ユーザ定義のディペンデンシー グラフ ノードのサンプルです。入力として数値(時間など)を取り、2 つの出力数値を生成します。1 つの数値は入力の変化に伴ってサイン カーブを生成し、もう 1 つの数値はコサイン カーブを生成します。この 2 つの出力が、オブジェクトの X と Z の移動アトリビュートにコネクトされると、そのオブジェクトは時間の変化にともなった xz プレーンでの円上の移動を記述します。

このノードには他に 2 つのアトリビュートがあり、これらの値を変更することでアニメーションに影響をおよぼすことができます。スケール(Scale)は円形パスのサイズを定義し、フレーム(Frames)は、パスの全周に必要なフレーム数を定義します。いずれのアトリビュートも、その他のノードにフックすることも、maya.cmds.setAttr を通じて、Python スクリプトで作成される円ノード circleNode1 での動作を設定することもできます。例:

    import maya.cmds as cmds
    cmds.createNode("spCircle", name="circleNode1")
    cmds.setAttr("circleNode1.scale", 3)
    # will change the size of the circle
    cmds.setAttr("circleNode1.frames", 5)
    # will cause objects to complete a circle in indicated number of frames.

circleNodeTest.py スクリプトを実行すると、単一の項目「Move in circle」を持つ新規の「Circle」メニューが作成されます。この項目を選択すると、タイム スライダ上の再生アイコンをクリックして再生できる、単純なモデル(円形パスを追従する球)が構築されます。

customImagePlane

ディペンデンシー グラフ ノード spCustomImagePlane を作成する

Maya の内部イメージ プレーン クラスに基づいて、ユーザ固有のカスタム イメージ プレーンを作成する方法を例示します。これを使用すると、API ユーザは既定の Maya イメージ プレーンの動作をオーバーライドすることができます。このクラスは、計算メソッドを持ち、API ユーザが追加したスタティック アトリビュートを含めることができるという点で、標準的な API ノードと似ています。このサンプル クラスは、既定イメージ プレーンの動作をオーバーライドし、ユーザはノードの透明度アトリビュートを使用してイメージ プレーンに透明度を追加できます。また、このコードは MImage を使用して浮動小数点深度バッファをコントロールする方法も例示します。useDepthMap に true が設定される場合、イメージの半分がニア クリップ プレーン、残りの半分がファー クリップ プレーンになるように、イメージに深度が追加されます。

spCustomImagePlane が作成されたら、ノードを表示しているカメラ シェイプにこれをアタッチする必要があります。イメージ プレーンは、カメラ シェイプの imagePlane メッセージ アトリビュートからカメラにアタッチされます。このサンプル イメージ プレーンをアタッチするには、イメージ プレーンのメッセージ アトリビュートを cameraShapes imagePlane アトリビュートに接続する必要があります。imagePlane アトリビュートはマルチ アトリビュートであり、複数のイメージ プレーンへのリファレンスを保持できます。

例:

    imageP = maya.cmds.createNode("spCustomImagePlane")
    maya.cmds.connectAttr(imageP + ".message", "perspShape.imagePlane[0]", force = True)

customNodeFileTranslator

ファイル トランスレータ spCustomNodeTranslator を作成する

このサンプルは、単純な入出力ファイル トランスレータを実装します。トランスレータの書き込み機能では、Maya シーン内でプロキシ ノードを検索し、ファイルに名前情報を書き出します。トランスレータの読み取り機能では、ファイルを読み取り、各ラインを表示します。

このファイル トランスレータを使用するには、まずプラグインをロードし、その後で spSineNode などのプロキシ ノードを作成します。それから、ファイル > すべて書き出し(File > Export All)を使用して、ファイルの種類(Files of Type)オプションで 「spCustomNodeTranslator」を選択してプロキシ ノードの情報を保存します。

情報を読み戻すには、ファイル > 読み込み(File > Import)を選択できます。ファイルを読み戻すと、出力がスクリプト エディタのヒストリ(History)パネルに送信されます。

footPrintManip

ディペンデンシー グラフ ノード spFootPrintLocator と spFootPrintLocatorManip を作成する

このサンプルは、マニピュレータの表示ツールとユーザ定義マニピュレータを併用する方法を例示します。このユーザ定義マニピュレータが、フット プリント ロケータに相当します。

このプラグインを使用するには、footPrintManip.py スクリプトを実行してフット プリント ロケータを作成し、フット プリントを選択して、マニピュレータの表示ツール(Show Manipulator Tool)をクリックします。

footPrintNode

ディペンデンシー グラフ ノード spFootPrint を作成する

このサンプルは、ユーザ定義ロケータを作成する方法を例示します。ロケータは、3D ビューに描画される DAG オブジェクトですが、レンダリングは行いません。このサンプル プラグインでは、フット プリントを描画する新規のロケータ ノードを定義します。フット プリントは、通常のマニピュレータを使用して選択、移動することができます。

このプラグインを使用するには、footPrintNode.py スクリプトを実行してフット プリント ロケータを作成します。

geomShade

ディペンデンシー グラフ ノード spGeomShader を作成する

このノードは、オブジェクトにおけるジオメトリの XYZ 位置を評価するサンプルです。

このノードへの入力は、このノード用のアトリビュート エディタにスライダとして描画されるスケールとオフセットです。

spGeomShader ノードの出力アトリビュートは「outColor」です。これは、オブジェクトの xyz の位置を表す 3 つの float 型の値です。このシェーダを使用するには、spGeomShader ノードを作成し、その出力「outColor」をカラー(Color)などのサーフェス/シェーダ ノードの入力に接続します。

helixCmd

Python コマンド spHelix を作成する

このスクリプトは、らせんの形をした NURBS カーブを作成します。このコマンドは、2 つの引数「r」と「p」を取ります。「-r」はらせんの半径を設定し、「-p」はらせんの高さを設定します。らせんを作成するには、次のコマンドを実行します。

    maya.cmds.spHelix(p=0.3, r=7)

helloWorldCmd

Python コマンド spHelloWorld を作成する

これは Python プラグインの使い方についての単純なデモンストレーションです。

    maya.cmds.spHelloWorld()

スクリプト エディタのウィンドウに、「Hello World」というテキストが出力されます。

mathTableControl

Python コマンド spMathTableControl を作成する

このプラグインは、別の出力ウィンドウに簡単なスプレッドシートの表を作成します。この表で、加算や乗算などの計算を行うことができます。

行とカラムを持つ表を作成するには、次のコマンドを実行します。

    import maya.cmds as cmds
    window = cmds.window(title="Math Table",widthHeight=(400,150))
    cmds.paneLayout()
    cmds.showWindow()
    cmds.spMathTableControl()

3 つのカラムと 5 つの行からなる、Math Table という名前の新しいウィンドウが表示されます。

motionTraceCmd

Python コマンド spMotionTrace を作成する

このプラグインを使用するには、まず、オブジェクトを作成し、キーフレームを設定することでそのオブジェクトをアニメートします。この操作を簡単に行うには、プリミティブを作成してから、そのプリミティブにいくつかのキーフレームを設定します。

この作業を行ったら、アニメーション設定されたオブジェクトを選択して spMotionTrace コマンドを起動します。例:

    import maya.cmds as cmds
    cmds.spMotionTrace(s=1, e=100, b=2)

このオブジェクトは、プラグインのコントロールの下にあるアニメーション設定されたパスに沿って移動し、アニメーションが完成すると、プラグインはオブジェクトのモーションパスを示すカーブをシーンに作成します。

このプラグインは、アニメーションの実行に使用する startFrame、endFrame、byFrame 値を制御するパラメータ s=、e=、b= を受け付けます。

moveManip

Python コマンド spMoveManipCtxCmd を生成し、サンプル コンテキストを作成する

このプラグインを使用するには、次のコマンドを実行します。

    import maya
    maya.cmds.spMoveManipCtxCmd( 'spMoveManipContext1' )
    maya.cmds.setParent( 'Shelf1' )
    maya.cmds.toolButton( 'spMoveManip1', cl='toolCluster', t='spMoveManipContext1', i1="moveManip.xpm" )

これによって、ツール シェルフの Shelf1 タブに「moveTool」という新しいエントリが作成されます。球を作成してシェルフ上の moveManip アイコンをクリックします。オブジェクトを選択すると、フリーのポイントが 3 つあるマニピュレータが表示されます。

注: コマンドを実行する前に、Shelf1 タブがなければなりません。

moveTool

Python コマンド spMoveToolCmd と spMoveToolContext を作成する

これは、選択アクション ツールのサンプルです。何も選択しないと、このツールは、Maya のセレクション ツールと全く同じように動作します。オブジェクトを選択すると、このツールは、移動ツールに変わります。

この時点で、プラグインでは次のオブジェクトを移動することができます。

- Transform オブジェクト
- NURBS カーブの複数の CV
- NURBS サーフェスの複数の CV
- ポリゴン頂点

このプラグインでは、正投影ビューでの移動のみを行います。また、元に戻す、やり直し、ジャーナリングをサポートしています。

このプラグインを使用するには、次のコマンドを実行します。

    maya.cmds.spMoveToolContext("spMoveToolContext1")
    shelfTopLevel = maya.mel.eval("global string $gShelfTopLevel;$temp = $gShelfTopLevel")
    maya.cmds.setParent("%s|General" % shelfTopLevel)
    maya.cmds.toolButton("spMoveTool1", cl="toolCluster", t="spMoveToolContext1", i1="moveTool.xpm")
    # Remove UI objects with
    maya.cmds.deleteUI("spMoveToolContext1")
    maya.cmds.deleteUI("spMoveTool1")

これによって、ツール シェルフの「Shelf1」タブに「moveTool」という新しいエントリが作成されます。新しいアイコンをクリックしてオブジェクトを選択し、正投影ビュー内でドラッグします。左マウス ボタンを使用すると、2 方向の動きが可能になり、中マウス ボタンを使用すると、動きが単一方向にコンストレインされます。

注: コマンドを実行する前に、Shelf1 タブがなければなりません。

narrowPolyViewer

この例は、MPx3dModelView クラスと MPxModelEditorCommand クラスを使用してビューアを実装する方法を示しています。ビューアにより狭いポリゴンがハイライトされるので、ビューアには三角化されたジオメトリを指定する必要があります。この例を使用するには、次のようにします。

- プラグインをロードします
- メッシュ ジオメトリを作成し、三角化します
- メッシュ ジオメトリを選択します
- スクリプト showNarrowPolyViewer.py を実行します
- 頂点を操作して、狭いポリゴンを作成します。プラグインの許容値設定により定義された狭いポリゴンはシェーディングされます。

parentAddedMsgCmd

Python コマンド spParentAddedMsg を作成する

このプラグインは、Python でメッセージの作成と処理を行う方法を例示します。「parent added」グローバル メッセージと、ユーザ定義のクライアント データが一緒に作成されます。Maya でポリゴン プレーンの作成などなんらかの操作を起動すると、コールバックが起動されます。

プラグインのロード後、次のコマンドを実行できます。

    import maya.cmds as cmds
    cmds.spParentAddedMsg()
    cmds.polyPlane()

polyModifier

polyModifierCmd はポリゴン メッシュの修正を支援するために設計されています。Maya では、すべてのポリゴンが、コンストラクション ヒストリと微調整という 2 つの機能を備えています。どちらも、オブジェクトの構造とその詳細な操作方法に対して、大きな影響を与えています。ただし、これらを実装するのは容易ではありません。polyModifier 抽象クラスが必要なのはこのためです。polyModifierCmd は、ポリゴン メッシュ上のコンストラクション ヒストリと微調整の DG メンテナンスを自動的に処理します。

詳細な説明、使用法の指示、制限事項については、polyModifier.py スクリプトを確認してください。

rockingTransform

カスタム トランスフォーム ノード spRockingTransformNode を作成する

このプラグインは、サンプルのカスタム トランスフォームを実装し、X 軸の周囲でロッキング モーションを実行するために使用できます。

エフェクトを例示するために、任意の回転のジオメトリをこの変換の子にすることができます。

このプラグインには、2 つの要素が含まれます。

1. カスタム変換ノード -- rockingTransformNode

2. カスタム変換行列 -- rockingTransformMatrix

ロッキング モーションを実行する場合、これらのクラスを同時に使用します。ロック アトリビュートは通常のトランスフォーム アトリビュートの外に格納されることに注意してください。

たとえば、次のコマンドを実行します。

    maya.cmds.file(f=True,new=True)
    maya.cmds.polyPlane()
    maya.cmds.select("pPlane1",r=True)
    maya.cmds.rotate(-15,-15,-15,r=True,ws=True)
    maya.cmds.createNode("spRockingTransform")
    maya.cmds.parent("pPlane1","spRockingTransform1")
    maya.cmds.setAttr("spRockingTransform1.rockx",55)

simpleEmitter

ディペンデンシー グラフ ノード simpleEmitter を作成する

このノードは、ある位置から一定方向に放射するパーティクル エミッタのサンプルです。

ノードと適切な接続を作成して、ユーザ定義のパーティクル エミッタを正しく設定する方法を示すサンプル Python スクリプト simpleEmitter.py があります。

simpleImageFile

単純なイメージ ファイル プラグインを作成する

このプラグインはファイル拡張子「.moo」の新しいイメージ ファイル フォーマットを登録します。「.moo」イメージ ファイル をロードすると、0 ～ 1 の範囲外の値を含む、手続き上生成されるカラー スペクトルが生成されます。

このプラグインの使用法を示すため、次のサンプルを使用できます。

1. ポリゴン プレーンを作成します。
2. プレーンにシェーダを割り当てます。
3. 任意のイメージ ファイルに test.moo という名前を付けます。
4. test.moo をファイル テクスチャとしてプレーンに追加します。
5. ハードウェア レンダリングをオンにします。
6. シーンをレンダーします。

simpleSolverNode

IK ソルバ simpleSolverNode を登録する

このプラグインは、Python で IK ソルバの作成と登録を行う方法を例示します。このプラグインをロードすると、新規の IK ソルバが、simpleSolverNode 型として Maya に登録されます。

ソルバを使用するには、アニメーション(Animation)メニュー セットでスケルトン > ジョイント ツール(Skeleton > Joint Tool)を選択して、2 つのジョイントを持つ単一の IK ボーンを作成します。その後、コマンド ウィンドウに次のコマンドを入力して、新しいソルバを使用する IK ハンドルを作成します。

    import maya.cmds as cmds
    cmds.createNode("spSimpleSolverNode", name="spSimpleSolverNode1")

XY プレーンでハンドルを動かすと、ジョイントが回転します。

コマンド:

    cmds.ikHandle(sol="spSimpleSolverNode1", sj="joint1", ee="joint2")

このコマンドを使用すると、ハンドルを使用しているソルバを判断することができます。

simpleSpring

ディペンデンシー グラフ ノード simpleSpring を作成する

このノードは、Maya がシミュレーションに使用するスプリングの動きを計算する、スプリング ノードのサンプルです。

ノードと適切な接続を作成して、ユーザ定義のばねの法則を正しく設定する方法を示すサンプル Python スクリプト simpleSpring.py があります。

sineNode

ディペンデンシー グラフ ノード spSineNode を作成する

このプラグインは、ユーザ定義のディペンデンシー グラフ ノードのサンプルです。単一の入力値を取り、正弦を 10 倍にして出力します。これが、プローシージャ型アニメーションの簡単な作成例です。この数値は、入力の変化にともない、サイン カーブを生成します。この数値がオブジェクトの X 移動値にフックされると、そのオブジェクトは時間の変化にともなった X 軸上の移動を記述します。

slopeShader

ディペンデンシー グラフ ノード spSlopeShader を作成する

このプラグインは、Maya ソフトウェア シェーダを Python で実装します。シェーディング対象のオブジェクトにある、渡すことができる、または渡すことができないスペースを定義するのに角度アトリビュートが使用されます。渡すことができる、またはできないカラーは、ノードのアトリビュートとして設定されます。シェーダは、設定されたカラーに基づいて、渡すことができる、またはできない領域をともにレンダリングします。

このプラグインの使用法を示すため、次のサンプルを使用できます。

1. slopeShader.py プラグインを Maya にロードします。
2. ポリゴン球を作成します。
3. 球にシェーダを割り当てます。
4. アトリビュート エディタ > カラー チャネル > ユーティリティ(Attribute Editor > Color Channel > Utilities) > spSlopeShader を開いて、球にテクスチャを適用します。
5. シーンをソフトウェア レンダーし、結果を確認します。

角度アトリビュートを調整すると、異なる結果が得られます。

splitUVCmd

Python コマンド spSplitUV を作成する

splitUV コマンドは、ポリゴン メッシュの選択された UV の共有を解除(UV を「分割」)します。これは、ヒストリ、微調整などを適切に処理するポリゴン操作ノードを作成する場合の良い例にもなります。このコマンドの作成の詳細については、オンライン マニュアルの「Polygon API」の章にあるサンプル splitUVCmd を参照してください。

注: オンライン マニュアルのサンプルは、例示のために MEL スクリプトを使用しています。Python バージョンのサンプルについては、Maya 開発キットの splitUVCmd.py スクリプトを使用してください。

swissArmyManip

ディペンデンシー グラフ ノード spSwissArmyLocator と spSwissArmyLocatorManip を作成する

これは、全ての種類のユーザ定義のマニピュレータをノードに加えることを意図したサンプル プラグインです。これは、各ユーザ定義マニピュレータの作成に必要な、ソース コードの例です。これを使用するには、次のコマンドを実行します。

    maya.cmds.createNode("spSwissArmyLocator")

次に、サイド ツール バーにある、マニピュレータの表示ツール(Show Manipulator Tool)アイコンをクリックします。画面上のロケータが、各種のユーザ定義マニピュレータのいずれかに上書きされます。

torusField

ディペンデンシー グラフ ノード spTorusField を作成する

spTorusField フィールドは、attract-repel フィールドを実装します。

このフィールドは、それ自体と repelDistance アトリビュートの間のすべてのオブジェクトに対して反発し、それ自体と attractDistance アトリビュートの距離より大きいオブジェクトを引き寄せます。これにより最終的に、オブジェクトがフィールドの周りでトーラスの形にまとまります。

このノードの使い方のサンプルについては、torusFieldTest.py スクリプトを確認してください。このサンプルは新しいフィールド ノードとパーティクル ノードを作成して、それらを接続します。

whatIsCmd

Python コマンド spWhatIs を作成する

これは、Maya オブジェクトの API 型を記述するメッセージを出力する単純なコマンドです。このコマンドに Maya オブジェクトが指定されていないと、現在選択済みの全オブジェクトの型がリスト表示されます。

各オブジェクトについて、次の情報が出力されます。

- オブジェクトの名前
- オブジェクトの API 型
- オブジェクトに使用できる API 関数セット。リストされた関数セットがすべて実際に存在するとは限らないことに注意してください。

このリストは本質的に、当該オブジェクトのすべての親クラスを含むクラス派生リストです。

たとえば、NURBS 球を作成し、その球が選択されていることを確認してから、次のコマンドを実行します。

    maya.cmds.spWhatIs()

このコマンドの結果、スクリプト エディタに次が出力されます。

Name: nurbsSphere1

Type: kTransform

Function Sets: kBase, kNamedObject, kDependencyNode, kDagNode , kTransform

yTwistNode

ディペンデンシー グラフ ノード spyTwistNode を作成する

このプラグインは、ユーザ定義デフォーマの作成方法を例示します。デフォーマとは、任意の数の入力ジオメトリを受け取り、それらを変形して、出力ジオメトリ アトリビュートに出力するノードです。このサンプル プラグインでは、Y 軸を中心に入力の頂点をツイスト変形する、新規のデフォーマノードを定義します。

このノードを使用するには、球(またはその他のオブジェクト)を作成します。

    maya.cmds.sphere()

球を選択してから、次のコマンドを入力します。

    maya.cmds.deformer( type='spyTwistNode' )

チャネル ボックスを前面に表示させ、spyTwistNode1 入力を選択します。角度(Angle)値を変更して、ジオメトリを変形できます。

zoomCameraCmd

Python コマンド spZoomCamera を作成する

これは、現在アクティブになっているカメラのビュー フィールドを、水平方向に 2 つに分割する単純なプラグインです。現在アクティブになっているビューの取得、カメラの変更に関する良い例です。

このプラグインを使用するには、次のようにします。

1. シーンに任意のオブジェクトを作成します。
2. レンダリング(Rendering)メニュー項目で、作成 > カメラ > カメラ(Create > Cameras > Camera)を選択します。
3. カメラの方向を変更し、シーン内のオブジェクトを向くようにします。
4. パネル > パースビュー > camera1 (Panel > Perspective > camera1)を選択します。

カメラを通したビューで、次のコマンドを実行します。

    maya.cmds.spZoomCamera()

カメラを通したビューが 2 倍に拡大されます。