Maya 開発キットには、Maya Python API のプロキシ クラスの使用法を例示するスクリプト プラグインが含まれています。
ディペンデンシー グラフ ノード 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 ノードにコネクトされます。
この時点で、立方体が画面に表示されます。タイム スライダ上の再生ボタンを押すと、フレーム番号の変更にともなって、表示されている立方体が拡大/縮小します。
objectSet ノード spBasicObjectSet を作成する
このプラグインは、新規作成された spBasicObjectSet ノードに、プロキシ objectSet ノードと、選択したエレメントを追加するためのコマンドを実装します。これらのノードの 1 つを作成するには、プラグインがロードされた後に次のコマンドを入力します。
import maya.cmds as cmds
cmds.createNode( ‘spBasicObjectSet’ )
開発キットで、サンプル スクリプト basicObjectSetTest.py を提供しています。このサンプルは spBasicObjectSet ノードにオブジェクトを追加したり、このノードからオブジェクトを削除したりします。
サーフェス シェイプ ノード spBasicShape を作成します。
このプラグインにより、標準 OpenGL コールを使用して、長方形、三角形、円を表示するプロキシ サーフェス シェイプ ノードが実装されます。これらのノードの 1 つを作成するには、プラグインがロードされた後に次のコマンドを入力します。
import maya.cmds as cmds
cmds.createNode("spBasicShape")
Python コマンド spBlindDoubleDataCmd とユーザ定義のデータ型 spBlindDoubleData を作成する
このプラグインは、ユーザ定義のデータ型に基づくブラインド データ(ダイナミック アトリビュート)の作成方法を例示します。このプラグインでは、ユーザデータ型として単純な double 値を使用します。また、Maya ASCII および Maya Binary ファイル フォーマットでのデータの格納、検索を実装する読み書きルーチンとして、MPlug クラスを使用してアトリビュートの値を設定、検索する方法を例示します。
このプラグインを使用するには、ディペンデンシー ノードを選択してから次のコマンドを実行します。
maya.cmds.spBlindDoubleData()
double 値 3.2 からなるダイナミック アトリビュートが、選択した各ディペンデンシー ノードにアタッチされます。Maya ASCII フォーマットでシーンを保存すると、ダイナミック アトリビュートの値を保存する Python コマンドを表示することができます。シーンをリロードすると、ダイナミック アトリビュートが適切なノードに再びアタッチされます。
ディペンデンシー グラフ ノード 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」メニューが作成されます。この項目を選択すると、タイム スライダ上の再生アイコンをクリックして再生できる、単純なモデル(円形パスを追従する球体)が構築されます。
ディペンデンシー グラフ ノード 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)
ファイル トランスレータ spCustomNodeTranslator を作成する
このサンプルは、単純な入力および出力ファイル トランスレータを実装します。トランスレータの書き込み機能では、Maya シーン内でプロキシ ノードを検索し、ファイルに名前情報を書き出します。トランスレータの読み取り機能では、ファイルを読み取り、各ラインを表示します。
このファイル トランスレータを使用するには、まずプラグインをロードし、その後で spSineNode などのプロキシ ノードを作成します。それから、を使用して、ファイルの種類(Files of Type)オプションで「spCustomNodeTranslator」を選択してプロキシ ノードの情報を保存します。
情報を読み戻すには、 ファイル > インポート(File > Import)を選択できます。ファイルを読み戻すと、出力がスクリプト エディタのヒストリ(History)パネルに送信されます。
ディペンデンシー グラフ ノード spFootPrintLocator と spFootPrintLocatorManip を作成する
このサンプルは、マニピュレータの表示ツールとユーザ定義マニピュレータを併用する方法を例示します。このユーザ定義マニピュレータが、フット プリント ロケータに相当します。
このプラグインを使用するには、footPrintManip.py スクリプトを実行してフット プリント ロケータを作成し、フット プリントを選択して、マニピュレータの表示ツール(Show Manipulator Tool)をクリックします。
ディペンデンシー グラフ ノード spFootPrint を作成する
このサンプルは、ユーザ定義ロケータを作成する方法を例示します。ロケータは、3D ビューに描画される DAG オブジェクトですが、レンダリングは行いません。このサンプル プラグインでは、フット プリントを描画する新規のロケータ ノードを定義します。フット プリントは、通常のマニピュレータを使用して選択、移動することができます。
このプラグインを使用するには、footPrintNode.py スクリプトを実行してフット プリント ロケータを作成します。
ディペンデンシー グラフ ノード spGeomShader を作成する
このノードは、オブジェクトにおけるジオメトリの XYZ 位置を評価するサンプルです。
このノードへの入力は、このノード用のアトリビュート エディタにスライダとして描画されるスケールとオフセットです。
spGeomShader ノードの出力アトリビュートは「outColor」です。これは、オブジェクトの xyz の位置を表す 3 つの float 型の値です。このシェーダを使用するには、spGeomShader ノードを作成し、その出力「outColor」をカラー(Color)などのサーフェス/シェーダ ノードの入力にコネクトします。
このスクリプトは、らせんの形をした NURBS カーブを作成します。このコマンドは、2 つの引数「r」と「p」を取ります。「-r」はらせんの半径を設定し、「-p」はらせんの高さを設定します。らせんを作成するには、次のコマンドを実行します。
maya.cmds.spHelix(p=0.3, r=7)
Python コマンド spMathTableControl を作成する
このプラグインは、別の出力ウィンドウに簡単なスプレッドシートの表を作成します。この表で、加算や乗算などの計算を行うことができます。
行とカラムを持つ表を作成するには、次のコマンドを実行します。
import maya.cmds as cmds
window = cmds.window(title="Math Table",widthHeight=(400,150))
cmds.paneLayout()
cmds.showWindow()
cmds.spMathTableControl()
Python コマンド spMotionTrace を作成する
このプラグインを使用するには、まず、オブジェクトを作成し、キーフレームを設定することでそのオブジェクトをアニメートします。この操作を簡単に行うには、プリミティブを作成してから、そのプリミティブにいくつかのキーフレームを設定します。
この作業を行ったら、アニメーション設定されたオブジェクトを選択して spMotionTrace コマンドを起動します。例:
import maya.cmds as cmds
cmds.spMotionTrace(s=1, e=100, b=2)
このオブジェクトは、プラグインのコントロールの下にあるアニメーション設定されたパスに沿って移動し、アニメーションが完成すると、プラグインはオブジェクトのモーションパスを示すカーブをシーンに作成します。
このプラグインは、アニメーションの実行に使用する startFrame、endFrame、および byFrame 値を制御するパラメータ s=、e=、および b= を受け付けます。
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 つあるマニピュレータが表示されます。
Python コマンド spMoveToolCmd と spMoveToolContext を作成する
これは、選択アクション ツールのサンプルです。何も選択しないと、このツールは、Maya のセレクション ツールと全く同じように動作します。オブジェクトを選択すると、このツールは、移動ツールに変わります。
この時点で、プラグインでは次のオブジェクトを移動することができます。
このプラグインでは、正射投影ビューでの移動のみを行います。また、元に戻す、やり直し、およびジャーナリングをサポートしています。
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 方向の動きが可能になり、中マウス ボタンを使用すると、動きが単一方向にコンストレインされます。
この例は、MPx3dModelView クラス、および MPxModelEditorCommand クラスを使用して、ビューアを実装する方法を示しています。ビューアにより狭いポリゴンがハイライトされるので、ビューアには三角化されたジオメトリを指定する必要があります。この例を使用するには、次のようにします。
Python コマンド spParentAddedMsg を作成する
このプラグインは、Python でメッセージの作成と処理を行う方法を例示します。「parent added」グローバル メッセージと、ユーザ定義のクライアント データが一緒に作成されます。Maya でポリゴン プレーンの作成などなんらかの操作を起動すると、コールバックが起動されます。
import maya.cmds as cmds
cmds.spParentAddedMsg()
cmds.polyPlane()
polyModifierCmd はポリゴン メッシュの修正を支援するために設計されています。Maya では、すべてのポリゴンが、コンストラクション ヒストリとツィークという 2 つの機能を備えています。どちらも、オブジェクトの構造とその詳細な操作方法に対して、大きな影響を与えています。ただし、これらを実装するのは容易ではありません。polyModifier 抽象クラスが必要なのはこのためです。polyModifierCmd は、ポリゴン メッシュ上のコンストラクション ヒストリとツィークの DG メンテナンスを自動的に処理します。
カスタム トランスフォーム ノード spRockingTransformNode を作成する
このプラグインは、サンプルのカスタム トランスフォームを実装し、X 軸の周囲でロッキング モーションを実行するために使用できます。
エフェクトを例示するために、任意の回転のジオメトリをこの変換の子にすることができます。
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 を作成する
このノードは、ある位置から一定方向に放射するパーティクル エミッタのサンプルです。
ノードと適切なコネクションを作成して、ユーザ定義のパーティクル エミッタを正しく設定する方法を示すサンプル Python スクリプト simpleEmitter.py があります。
このプラグインはファイル拡張子「.moo」の新しいイメージ ファイル フォーマットを登録します。「.moo」イメージ ファイル をロードすると、0 ~ 1 の範囲外の値を含む、手続き上生成されるカラー スペクトルが生成されます。
このプラグインの使用法を示すため、次のサンプルを使用できます。
このプラグインは、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 を作成する
このノードは、Maya がシミュレーションに使用するスプリングの動きを計算する、スプリング ノードのサンプルです。
ノードと適切なコネクションを作成して、ユーザ定義のばねの法則を正しく設定する方法を示すサンプル Python スクリプト simpleSpring.py があります。
ディペンデンシー グラフ ノード spSineNode を作成する
このプラグインは、ユーザ定義のディペンデンシー グラフ ノードのサンプルです。単一の入力値を取り、正弦を 10 倍にして出力します。これが、プローシージャ型アニメーションの簡単な作成例です。この数値は、入力の変化にともない、サイン カーブを生成します。この数値がオブジェクトの X 移動値にフックされると、そのオブジェクトは時間の変化にともなった X 軸上の移動を記述します。
ディペンデンシー グラフ ノード spSlopeShader を作成する
このプラグインは、Maya ソフトウェア シェーダを Python で実装します。シェーディング対象のオブジェクトにある、渡すことができる、または渡すことができないスペースを定義するのに角度アトリビュートが使用されます。渡すことができる、またはできないカラーは、ノードのアトリビュートとして設定されます。シェーダは、設定されたカラーに基づいて、渡すことができる、またはできない領域をともにレンダリングします。
このプラグインの使用法を示すため、次のサンプルを使用できます。
splitUV コマンドは、ポリゴン メッシュの選択された UV の共有を解除(UV を「分割」)します。これは、ヒストリ、ツィークなどを適切に処理するポリゴン操作ノードを作成する場合の良い例にもなります。このコマンドの作成の詳細については、オンライン マニュアルの「Polygon API」の章にあるサンプル splitUVCmd を参照してください。
注: オンライン マニュアルのサンプルは、例示のために MEL スクリプトを使用しています。Python バージョンのサンプルについては、Maya 開発キットの splitUVCmd.py スクリプトを使用してください。
ディペンデンシー グラフ ノード spSwissArmyLocator と spSwissArmyLocatorManip を作成する
これは、全ての種類のユーザ定義のマニピュレータをノードに加えることを意図したサンプル プラグインです。これは、各ユーザ定義マニピュレータの作成に必要な、ソース コードの例です。これを使用するには、次のコマンドを実行します。
maya.cmds.createNode("spSwissArmyLocator")
次に、サイド ツール バーにある、マニピュレータの表示ツール(Show Manipulator Tool)アイコンをクリックします。画面上のロケータが、各種のユーザ定義マニピュレータのいずれかに上書きされます。
ディペンデンシー グラフ ノード spTorusField を作成する
spTorusField フィールドは、attract-repel フィールドを実装します。
このフィールドは、それ自体と repelDistance アトリビュートの間のすべてのオブジェクトに対して反発し、それ自体と attractDistance アトリビュートの距離より大きいオブジェクトを引き寄せます。これにより最終的に、オブジェクトがフィールドの周りでトーラスの形にまとまります。
このノードの使い方のサンプルについては、torusFieldTest.py スクリプトを確認してください。このサンプルは新しいフィールド ノードとパーティクル ノードを作成して、それらをコネクトします。
これは、Maya オブジェクトの API 型を記述するメッセージを出力する単純なコマンドです。このコマンドに Maya オブジェクトが指定されていないと、現在選択済みの全オブジェクトの型がリスト表示されます。
このリストは本質的に、当該オブジェクトのすべての親クラスを含むクラス派生リストです。
たとえば、NURBS 球体を作成し、その球体が選択されていることを確認してから、次のコマンドを実行します。
maya.cmds.spWhatIs()
このコマンドの結果、スクリプト エディタに次が出力されます。
Function Sets: kBase, kNamedObject, kDependencyNode, kDagNode , kTransform
ディペンデンシー グラフ ノード spyTwistNode を作成する
このプラグインは、ユーザ定義デフォーマの作成方法を例示します。デフォーマとは、任意の数の入力ジオメトリを受け取り、それらを変形して、出力ジオメトリ アトリビュートに出力するノードです。このサンプル プラグインでは、Y 軸を中心に入力の頂点をツイスト変形する、新規のデフォーマノードを定義します。
このノードを使用するには、球体(またはその他のオブジェクト)を作成します。
maya.cmds.sphere()
maya.cmds.deformer( type='spyTwistNode' )
チャンネル ボックスを前面に表示させ、spyTwistNode1 入力を選択します。角度(Angle)値を変更して、ジオメトリを変形できます。
Python コマンド spZoomCamera を作成する
これは、現在アクティブになっているカメラのビュー フィールドを、水平方向に 2 つに分割する単純なプラグインです。現在アクティブになっているビューの取得、およびカメラの変更に関する良い例です。
maya.cmds.spZoomCamera()