次に、付属の C++ プラグインの簡単な説明と使用法を示します。
このプラグインの使用方法については、 ASHLI シェーダを操作するを参照してください。
このプラグインは作用対象(Affects)と呼ばれるノードを作成します。「A」と「B」と呼ばれる 2 つのダイナミック アトリビュートを追加します。A の値を変更すると、B が再計算されることに注意してください。
次のコマンド シーケンスにより、このプラグインの使用方法について説明します。
// Create an "affects" node by typing the MEL command:
createNode affects;
// Add two integer dynamic attributes to the newly created affects node by typing the MEL command:
addAttr -ln A -at long affects1;
addAttr -ln B -at long affects1;
// Change the value of "A" to 10 by typing the MEL command:
setAttr affects1.A 10;
// At this point, the affectsNode::setDependentsDirty() method gets called which causes "B" to be marked dirty.
// Compute the value on "B" by doing a getAttr:
getAttr affects1.B;
// The affectsNode::compute() method is entered which copies the value from "A" (i.e. 10) to "B".
ジオメトリをディペンデンシー ノードへの入力として処理する方法を示す、単純なサンプル ノードです。このノードは、NURBS カーブを入力として取り、円弧長(Arc Length)を出力します。この計算には、MFnNurbsCurve 関数を使用します。
このノードへの入力は、「inputCurve」という NURBS カーブ アトリビュートです。NURBS カーブ シェイプ ノードには、arcLen ノードへの入力として使用できる互換性のある 2 つの出力アトリビュート、ローカル(local)とワールド空間(Worldspace)があります。
arcLen ノードの出力アトリビュートは、単純に出力(Output)と言います。これは、0.001 という微小な値でカーブ全体の長さを示す double 値です。
次の MEL コードは、ノードをカーブにフックする方法を示します。
createNode -n arcLen1 arcLen;
connectAttr curveShape1.local arcLen1.inputCurve;
ここからは、出力アトリビュートを任意のノードにコネクトすることも、次のコマンドを使用して読み取りだけを行うこともできます。
getAttr arcLen1.output;
このサンプル ノードは、ジオメトリを入力として処理する方法を示します。ただし、Maya には、このノードと同様のサービスを実行する「curveInfo」ノードがすでに存在する点に注意してください。
ディペンデンシー グラフ ノード animCube を作成する
このプラグインは、入力として時間を取り、出力としてポリゴン ジオメトリを作成する方法を例示します。このノードの compute メソッドによって、ポリゴン立方体が構成されます。大きさはカレント フレーム番号に依存します。その結果生成されるメッシュが、内部の Maya ノードに渡って表示され、配置できるようになります。
このノードを使用するには、次のコマンドを含む MEL コマンド「animCubeNode.mel」を実行します。
createNode transform -n animCube1;
createNode mesh -n animCubeShape1 -p animCube1;
createNode animCube -n animCubeNode1;
connectAttr time1.outTime animCubeNode1.time;
connectAttr animCubeNode1.outputMesh animCubeShape1.inMesh;
このコマンドによって、表示用にワールドにフックされた Transform ノードの下に Mesh ノードが作成されます。その後 animCube ノードが作成されます。入力は Time ノードにコネクトされ、出力は Mesh ノードにコネクトされます。
この時点で、立方体が画面に表示されます。タイム スライダ上の再生ボタンを押すと、フレーム番号の変更にともなって、表示されている立方体が拡大/縮小します。
シェイプ ノード apiMesh、ディペンデンシー グラフ ノード apiMeshCreator、およびデータ型 apiMeshData を作成する
このプラグインは、選択、移動、アニメート、および変形の可能な頂点を持つ、ポリゴン メッシュ シェイプを作成する方法を例示します。このシェイプは、各マテリアルの OpenGL 表示もサポートします。
また、このプラグインは、新しい型のジオメトリ データ apiMeshData を登録し、このデータをノード間で受け渡しする方法を例示します。
apiMeshCreator ノードでは、2 種類の apiMeshData、すなわち立方体と球体を作成することができます。作成するシェイプ型を指定するには、「shapeType」アトリビュートを使用します。また、このノードでは、通常のメッシュ データを入力として取り、そのデータを apiMeshData に変換します。入力メッシュがない場合の出力は、shapeType アトリビュートに基づきます。
apiMesh シェイプを作成するには、次に示すように、まず apiMesh ノードを作成し、次に apiMeshCreator ノードを作成して、この 2 つのノードをコネクトします。
createNode apiMesh -n m1;
createNode apiMeshCreator -n c1;
connectAttr c1.outputSurface m1.inputSurface;
このプラグインは、MPxComponentShape クラスを使用して、コンポーネントを持つサーフェス Shape を作成する方法を例示します。プラグインがロードされた後でノードを作成するには、次の MEL を使用します。
string $node = `createNode apiSimpleShape`;
// Add some CVs
string $attr = $node + ".controlPoints[0]";
int $idx = 0;
for ( $i=0; $i<100; $i++)
{
for ( $j=0; $j<100; $j++)
{
string $attr = $node + ".controlPoints[ " + $idx + "]";
setAttr $attr $i $j 3;
$idx++;
}
}
MEL コマンド blindComplexData とユーザ定義のデータ型 blindComplexData を作成する
このプラグインは、ユーザ定義のデータ型に基づくブラインド データ(ダイナミック アトリビュート)の作成方法を例示します。このプラグインでは、各エレメントにユーザ データ型として double と int の両方を含む構造の配列を使用します。
また、Maya ASCII および Maya Binary ファイル フォーマットでのデータの格納、検索を実装する読み書きルーチンとして、MPlug クラスを使用してアトリビュートの値を設定、検索する方法を例示します。
このプラグインを使用するには、ディペンデンシー ノードを選択してから、コマンド blindComplexData を実行します。5 エレメントの配列からなるダイナミック アトリビュートが、選択した各ディペンデンシー ノードにアタッチされます。Maya ASCII フォーマットでシーンを保存すると、ダイナミック アトリビュートの値を保存する MEL コマンドを表示することができます。シーンをリロードすると、ダイナミック アトリビュートが適切なノードに再びアタッチされます。
次の 2 つのディペンデンシー グラフ ノードを作成する: blindDataShader と blindDataMesh
このプラグインは、カラー情報をハードウェア シェーディング ノードに供給するためのビルド データの使用を例示しています。これは blindDataMesh と blindDataShader の 2 つから成ります。
blindDataMesh ノードはメッシュを構築し、そのブラインド データをカラー情報とともに置きます。blindDataShader ノードは、描画のためにカラー情報を取り出すハードウェア シェーダです。このプラグインのシェーダ部分は、MPxHwShaderNode::geometry() メソッドの頂点 ID を使用し、ブラインド データのカラー情報を取得します。
このプラグインを使用するには、blindDataShader.mel ファイルを開き、そのコンテンツを実行します。結果はシェーディング メニューを使って表示することができ、スムース シェーディングを行ってからハードウェア テクスチャリング(Hardware Texturing)をオンにします。
MEL コマンド blindDoubleData とユーザ定義のデータ型 blindDoubleData を作成する
このプラグインは、ユーザ定義のデータ型に基づくブラインド データ(ダイナミック アトリビュート)の作成方法を例示します。このプラグインでは、ユーザデータ型として単純な double 値を使用します。また、Maya ASCII および Maya Binary ファイル フォーマットでのデータの格納、検索を実装する読み書きルーチンとして、MPlug クラスを使用してアトリビュートの値を設定、検索する方法を例示します。
このプラグインを使用するには、ディペンデンシー ノードを選択してから、コマンド blindDoubleData を実行します。double 値 3.2 からなるダイナミック アトリビュートが、選択した各ディペンデンシー ノードにアタッチされます。Maya ASCII フォーマットでシーンを保存すると、ダイナミック アトリビュートの値を保存する MEL コマンドを表示することができます。シーンをリロードすると、ダイナミック アトリビュートが適切なノードに再びアタッチされます。
このサンプル ノードは、現在選択されている各項目のディペンデンシー ノードにダイナミック アトリビュートを追加します。このアトリビュートは short で、デフォルト値は 99 に設定されています。このプラグインを使用するには、オブジェクトを選択して ウィンドウ > アトリビュート エディタ(Window > Attribute Editor)でアトリビュート エディタ(Attribute Editor)を起動し、追加のアトリビュート(Extra Attribute)タブをクリックします。アトリビュート エディタには、余分なアトリビュートは表示されません。次に、コマンド ウィンドウで blindShortData を実行します。アトリビュートは、値が 99 に設定されてエディタに表示されます。この値は、エディタまたは MEL コマンド setAttr と getAttr を使用して変更できます。シーンを保存すると、選択済みの各項目に対して新たに設定したアトリビュートと値も保存されます。このサンプルでは、単純なブラインド データをオブジェクトにアタッチする方法を例示します。
ディペンデンシー グラフ ノード buildRotation を作成する
このサンプル ノードは、入力に基づく線形代数計算を実行し、その結果を出力する例を示します。
このノードでは、アップ ベクトルと forward ベクトルを入力として取り、Y 軸と Z 軸を取る回転を出力し、それぞれを上方向ベクトルおよび前方向ベクトルになるように回転させます。
このノードの使用例では、法線と接線ベクトルに基づいて、オブジェクトを別のサーフェスにアラインします。また、Maya 付属の標準ノードである pointOnSurfaceNode も使用します。
sphere -radius 4;
cone -ax 0 1 0;
createNode pointOnSurfaceInfo;
connectAttr nurbsSphereShape1.worldSpace pointOnSurfaceInfo1.inputSurface;
connectAttr pointOnSurfaceInfo1.position nurbsCone1.translate;
setAttr pointOnSurfaceInfo1.u 0.01;
setAttr pointOnSurfaceInfo1.v 0.01;
この時点で、コーンは、球体のサーフェス上のポイントにコンストレインされます。pointOnSurfaceNode の u アトリビュートと v アトリビュートを変更すると、コーンがこのサーフェスの周囲を移動します。次の手順では、コーンをアラインして、先端が法線の方向を指すようにします。この操作には、buildRotation ノードを使用します。
createNode buildRotation;
connectAttr pointOnSurfaceInfo1.normal buildRotation1.up;
connectAttr pointOnSurfaceInfo1.tangentU buildRotation1.forward;
connectAttr buildRotation1.rotate nurbsCone1.rotate;
この時点で、コーンは、球体のサーフェスにコンストレインされます。また、コンストレインポイントで球体の法線にアラインされます。
このプラグイン名は cgfxShader.mll です。cgfxShader という名前のノードと、cgfxShader という名前のコマンドを定義します。このコマンドはノードを操作するために使用します。これはエクスプレッション コマンドとノードに非常に類似しています。
cgfxShader ノードは、MPxHwShaderNode から派生したハードウェア シェーダです。
シェーダまたはアトリビュート自体は、cgfxShader ノードに単独で可視となっているものにすぎません。このアトリビュートを .fx ファイルの名前に設定すると、多くの面白い効果が得られます。.fx ファイルでは、CgFX エフェクトが定義されています。このエフェクトはどのように描画が行われるかを完全に制御します。したがって、異なる .fx ファイルをロードすると、シーン上でまったく異なるエフェクトが得られます。理論的には、cgfxShader ノードは他のハードウェア シェーダ ノードができることなら何でもできます。
このエフェクトに加えて、CgFX ファイルは変更可能なパラメータ セットを提供し、制御された状態でエフェクトを変更することができます。たとえば、グロー エフェクトはカラー、輝度、およびグローのサイズの設定を行うことができます。バンプ テクスチャ マッピングを、でこぼこで光沢のあるエフェクトで変更できるようになります。これらのパラメータはすべて、ダイナミック アトリビュートとしてシェーダ ノード上に表示しています。そのエフェクトに glowColor パラメータがある場合、cgfxShader ノードには glowColor という名前のダイナミックなカラー アトリビュートがあります。アトリビュートの変更はパラメータに影響をおよぼします。
アトリビュート エディタ(Attribute Editor)から、または cgfxShader コマンドを使用して .fx ファイルを指定します。すでに適用されなくなったダイナミック アトリビュートはすべて削除され、新しいエフェクトに必要なすべてのアトリビュートが追加されます。すべての変更はアトリビュート エディタ(Attribute Editor)で確認することができます。
cgfxShader [-e] [-fx fileName] [-n name] [nodeName]
シェーダを使用する近道は、ハイパーシェード(Hypershade)ウィンドウを使用することです。ハイパーシェード ウィンドウを開く前にプラグインをロードしてから、作成 > マテリアル > CgFX シェーダ(Create > Material > CgFX Shader)を選択します。そして、そのマテリアルを割り当てるシェイプの上にドラッグするだけです。
このプラグインは、ユーザ定義のディペンデンシー グラフ ノードのサンプルです。このノードでは、数値を入力(時間など)として取り、2 つの出力数値を生成します。一方は入力の変化に従って正弦曲線を示し、他方は余弦曲線を生成します。この 2 つの出力が、オブジェクトの X および Z 移動アトリビュートにコネクトされると、そのオブジェクトは、時間の変化にともなった xz プレーンでの円上の移動を記述します。
コマンド「source circleNode」を実行すると、単一の項目を持つ新規の「Circle」メニューが作成されます。この項目を選択すると、タイム スライダ上の再生アイコンをクリックして再生できる、単純なモデル(円形パスを追従する球体)が構築されます。
このノードには他に 2 つのアトリビュートがあり、これらの値を変更することでアニメーションに影響をおよぼすことができます。スケール(Scale) は円形パスのサイズを定義し、フレーム(Frames)は、パスの全周に必要なフレーム数を定義します。いずれのアトリビュートも、その他のノードにフックすることも、MEL コマンド「setAttr」を通じて、MEL スクリプトで作成される円ノード「circleNode1」での動作を設定することもできます。たとえば、「setAttr circleNode1.scale #」では、円のサイズを変更することができ、「setAttr circleNode1.frames #」では、オブジェクトが記述する円を指定のフレーム数で完成させることができます。
MEL コマンド closestPointCmd を作成する
この例では、MMeshIntersector クラスを使用して、ポイント ライトとメッシュの間の最近接ポイントを検索する方法を示します。このプラグインを使用するには、まずこれをロードしてから、以下を実行します。
file -f -new;
defaultPointLight(1, 1,1,1, 0, 0, 0,0,0, 1);
move -r 0 5 0 ;
polyPlane -w 1 -h 1 -sx 10 -sy 10 -ax 0 1 0 -cuv 2 -ch 1;
scale -r 10 10 10 ;
closestPointCmd pointLight1 pPlane1;
入力位置から closestPointOnCurve(NURBS カーブ)を計算する
このプラグインは、MEL コマンドと DG ノードの両方を定義します。これは、NURBS カーブとワールド空間の位置を入力として受け取り、入力位置から Input カーブ上の最も近いポイントを計算します。
カーブ上の最も近いポイントのワールド空間「位置」に加えて、「法線」、「接線」、「U パラメータ」および「入力位置からの最近距離」を返します。
MEL コマンド clusterWeightFunction を作成する
このサンプル ノードでは、MFnWeightGeometryFilter::setWeight メソッドを使用し、数学関数に従ってクラスタの複数の CV にウェイトを設定する方法を例示します。
このプラグインを使用するには、クラスタと、そのクラスタの影響を受けるジオメトリを選択します。
select cluster1 nurbsSphereShape1;
次に、使用する数学関数を指定するフラグを立てて、MEL コマンド clusterWeightFunction を実行します。
clusterWeightFunction -sine;
componentScaleManip はマニピュレータ プラグインで、マニピュレータ API を使用したスケール マニピュレータを使ってコンポーネントをマニピュレートする方法について示します。この例では、MEL コマンド componentScaleContext を生成し、コンポーネントのスケール マニピュレータ用のツール コンテキストを作成します。
プラグインに対してツール ボタンを作成するには、「Shelf1」という名前の新規シェルフを作成し、次の MEL コマンドを実行してこのシェルフにツール ボタンを作成します。
componentScaleContext;
setParent Shelf1;
toolButton -cl toolCluster -t componentScaleContext1 -i1 "moveManip.xpm";
マニピュレータを使用するには、NURBS サーフェスを作成し、CV を選択します。それから上記で作成したツール ボタンをクリックし、プラグイン コンテキストを有効にします。ツールは、プラグインが NURBS CV 上だけで操作することを除けば、組み込みのスケール ツールと同じように機能します。
conditionTest プラグインは、Maya 内で変更されている「条件」を表示する、単純なプラグインです。Maya 内の条件とは、Maya 内部またはプラグインに関係することで、true 値または false 値を持つものです。たとえば、使用可能な条件としては、「SomethingSelected」や「playingBack」などがあります。これらの条件は、scriptJob コマンドの -conditionTrue フラグ、-conditionFalse フラグ、または -conditionChanged フラグによって、MEL レベルでトラックすることができます。
このプラグインには、使用可能な条件の表示、特定の条件のトラックとトラックされる条件の表示を可能にする「conditionTest」コマンドが追加されています。コマンドの基本構文は、次のとおりです。
conditionTest [-m on|off] [conditionName ...]
conditionName の引数は、条件の名前になります。名前を指定しないと、このコマンドは、使用可能なすべての条件に作用します。
-m フラグを使用すると、プラグインが、指定の条件に対するメッセージをトラックするかどうかを指定することができます。条件名を指定せずに -m フラグを指定すると、すべての条件に対するトラックが有効または無効になります。
mel: conditionTest -m 1 SomethingSelected
Condition Name State Msgs On
-------------------- ----- -------
SomethingSelected false yes
condition SomethingSelected changed to true
condition SomethingSelected changed to false
この行は、セレクション リストが空になったり、空でなくなったりするたびに表示されます。コマンド conditionTest -m off; を使用すると、すべての条件に対するトラックを無効にすることができます。
このプラグイン コマンドを使用すると、バンプ ファイル テクスチャを、Maya で使用されるグレースケールのハイト フィールド フォーマットからリアルタイム、ハードウェア ベースのレンダリングで法線マッピング フォーマットに変換することができます。
このコードは、また、MImage クラスを使用してイメージ ファイルをディスクにロード、保存、操作する方法も示しています。
このプラグインをテストするにはまず、プラグインをコンパイルし、プラグイン マネージャ(Plug-in Manager)でロードしてからスクリプト エディタに次を入力する必要があります。
convertBump "C:/bump.tga" "C:/bump_norm.tga" "tga" 1.0
これにより、デフォルトの bumpScale の比率で、入力テクスチャ(c:/bump.tga)が出力法線マップ(c:/bump_norm.tga)に変換されます。bumpScale パラメータを使用して、作成する法線マップのバンプの度合いを増減することができます。
サポートされている使用可能な全ファイル フォーマットのリストについては、MImage::saveToFil() のマニュアルを参照してください。
convertEdgesToContainedFacesCmd
MEL コマンド convertEdgesToContainedFaces を作成する
このプラグインは、選択したエッジをそのエッジによって形成されたフェース(つまり、オリジナルのエッジの選択部分にエッジが含まれているフェースのみ)に変換する MEL コマンドを作成します。
このコマンドの戻り値は、新しいすべてのフェースの名前を含む文字列配列です。この MEL コマンドにはフラグはありません。文字列配列を返します。また、選択されたエッジ上で動作します。
select -r pCube1.e[1:2] pCube1.e[6:7];
string $convertedFaces[] = `convertEdgesToContainedFaces`;
// Result: pCube1.f[1] //
convertVerticesToContainedEdgesCmd
MEL コマンド convertVerticesToContainedEdges を作成する
このプラグインは、選択した頂点をその頂点によって形成されたエッジ(つまり、オリジナルの頂点の選択部分に頂点が含まれるエッジのみ)に変換する MEL コマンドを作成します。このコマンドの戻り値は、新しいすべてのエッジの名前を含む文字列配列です。
この MEL コマンドにはフラグはありません。文字列配列を返します。また、選択された頂点上で動作します。
select -r pCube1.vtx[2:5];
string $convertedEdges[] = `convertVerticesToContainedEdges`;
// Result: pCube1.e[1:2] pCube1.e[6:7] //
convertVerticesToContainedFacesCmd
MEL コマンド convertVerticesToContainedFaces を作成する
このプラグインは、選択した頂点をその頂点によって形成されたフェース(つまり、オリジナルの頂点の選択部分に頂点が含まれるフェースのみ)に変換する MEL コマンドを作成します。このコマンドの戻り値は、新しいフェースのすべての名前を含む文字列配列です。
この MEL コマンドにはフラグはありません。文字列配列を返します。また、選択された頂点上で動作します。
select -r pCube1.vtx[0:5];
string $convertedFaces[] = `convertVerticesToContainedFaces`;
// Result: pCube1.f[0:1] //
このサンプル ノードは、API を使用してノンリニアのアニメーション クリップを作成する手順を示します。クリップは、選択した項目上か、-c/-char フラグで指定したキャラクタ セット ノード上に作成されます。このプラグインは、クリップを生成するアニメーション カーブを作成し、それらをソースクリップに配置して、そのソース クリップを 2 回インスタンス化します。
このプラグインを使用するには、球体を作成して選択し、次のコマンドを実行します。
createClip
ユーザ定義コンテキストからユーザ定義マニピュレータを作成する方法を示します。
source "customAttrManip.mel";
sphere;
move 5 0 0;
cone;
move -5 0 0;
select -cl;
ディペンデンシー グラフ ノード cvColor を作成する
このサンプル ノードは、NURBS サーフェスの複数の CV の上部に OpenGL ポイントを描き、それらの CV にカラーを適用する方法を例示します。このノードは、NURBS サーフェス シェイプの同胞を作成するためのロケータを実装し、同じトランスフォーム(Transform)ノードの下に配置されます。シェイプの「ローカル」空間出力アトリビュートが、ロケータノードの「inputSurface」アトリビュートにコネクトしている場合、ロケータ ノードは、カラーを適用したポイントを各 CV 位置に描画します。次に示すノードのカレント アルゴリズムによって、CV には、XY 位置に基づいて 4 色のいずれかが適用されます。
x < 0 && y < 0: Red x < 0 && y >= 0: Cyan x >= 0 && y < 0: Blue x >= 0 && y >= 0: Yellow
このプラグインを使用するには、まず、プラグインをロードし、コマンド「source cvColorNode」を実行して MEL コマンド attachColorNode を定義します。この MEL コマンドは、選択したオブジェクト間を反復し、検出した各 NURBS サーフェスに上記の cvColor ノードをアタッチします。cvColor ノードをアタッチした後にオブジェクトまたはその CV を移動すると、CV のカラーが変わります。このノードの pointSize アトリビュートは、描画されるポイントのサイズを制御します。drawingEnabled アトリビュートを false に設定すると、カラーを適用したポイントの表示が無効になります。
ディペンデンシー グラフ ノード cvColorShader を作成する
このプラグインは、頂点カラー(CPV)をソフトウェア レンダーできるようにするノードを作成します。このプラグインがいったんロードされると、ノードはハイパーシェード ウィンドウ内でカラー ユーティリティ(Color Utilities)として表示されます。このノードをシェーダのカラー(Color)または白熱光(Incandescence)アトリビュートに接続します。
このサンプル ノードは、セレクション リストを処理し、その内容をスクリプト言語が理解する文字列形式として返す方法を示します。cvExpand コマンドは、カレントのセレクション リストを調べ、CV の選択範囲を分割して、各 CV に個々の文字列を適用します。たとえば、次のようなセレクション リストがあるとします。
ls -selection;
// Result: curveShape1.cv[1:3] //
この場合、cvExpand コマンドは、代わりに次の値を返します。
cvExpand;
// Result: curveShape1.cv[1] curveShape1.cv[2] curveShape1.cv[3] //
このサンプルは、NURBS CV またはポリゴン頂点のローカル/ワールド空間位置を取得する方法を例示します。
このコマンドは、フラグに -l/-local または -w/-world を受け付けます。デフォルトは world です。これらのフラグは、CV のローカル/ワールド空間位置が必要かどうかを示します。このコマンドは、座標を 3 エレメントとして MEL float 配列に返すので、1 回の実行で処理できるのは 1 つの CV にすぎません。コマンドに引数が指定されていない場合は、アクティブ セレクション リストがチェックされます。そのリストに CV または頂点が 1 つだけ存在する場合は、その位置を返します。複数の CV または頂点が選択されている場合は、エラーが発生します。また、次の例のように、MEL 構文を使用して、コマンド ラインに単一のコンポーネントを指定することもできます。例:
cvPos nurbsSphereShape1.cv[0][0];
このサンプルは、スケルトンのバインド ポーズ、または、「dagPose」コマンドで作成されるその他のポーズに関する DAG pose 情報を抽出する方法を例示します。また、MltSelectionList イテレータを使用して選択されているジョイントを判断し、MPlug クラスを使用してプラグコネクションを走査し、グラフから行列 データを取得します。
このプラグインを使用するには、スケルトンを構築し、「Smooth」または「Rigid」のどちらかの Bind 機能でジオメトリをバインドします。次に、bindPose を検索する対象のジョイントを選択し、次のコマンドを実行します。
dagPoseInfo -f filename;
このプラグインは、Maya API で使用できる各ノード削除コールバックを例示します。このプラグインは、コールバックの各タイプを使い分けるために使用します。コマンドを起動してノードにコールバックを追加します。
deletedMessage <node 1> [<node 2> ...]
1) MNodeMessage::addNodeAboutToDeleteCallback は、ノード上のコールバックの削除情報を登録するために使用します。
2) MNodeMessage::addNodePreRemovalCallback は、ノード上の削除前のコールバックを登録するために使用します。
3) MDGMessage::addNodeRemovedCallback は、ノードが削除されるときにコールされるコールバックを登録するために使用します。
たとえば、NURBS 球体のコールバックを登録するには次のようにします。
sphere;
deletedMessage nurbsSphere1;
delete nurbsSphere1;
// Removal callback node: makeNurbSphere1
// Removal callback node: nurbsSphereShape1
// About to delete callback for node: nurbsSphere1
// Pre-removal callback for node: nurbsSphere1
// Removal callback node: nurbsSphere1
このプラグインは、均一なフィールド用の dynExprField ノードを含みます。これにより、パーティクル単位のアトリビュートをフィールドのアトリビュートにすることができます。
source dynExprFieldTest.mel
dynExprFieldTest;
eventTest プラグインは、Maya 内で発生している「イベント」を表示する、単純なプラグインです。Maya のイベントとは、Maya 内部またはプラグインにおいて、特定の時点で発生する出来事です。たとえば、使用可能なイベントには、「SelectionChanged」や「timeChanged」などがあります。これらのイベントは、scriptJob コマンドの -event フラグによって、MEL レベルでトラックすることができます。
このプラグインには、使用可能なイベントの表示、特定のイベントのトラック、およびトラックされるイベントの表示を可能にする「eventTest」コマンドが追加されています。コマンドの基本構文は、次のとおりです。
eventTest [-m on|off] [eventName ...]
eventName 引数は、イベントの名前です。名前を指定しないと、使用可能なすべてのイベントに対してこのコマンドが実行されます。
-m フラグを使用すると、プラグインが、指定のイベントに対するメッセージをトラックするかどうかを指定することができます。イベント名を指定せずに -m フラグを指定すると、すべてのイベントに対するトラックが有効または無効になります。
mel: eventTest -m 1 timeChanged
Event Name Msgs On
-------------------- -------
timeChanged yes
event timeChanged occurred
この行は、カレント タイムが変化するたびに表示されます。コマンド eventTest -m off; を使用すると、すべてのイベントに対するトラックを無効にすることができます。
ディペンデンシー グラフ ノード exampleRampAttrNode を作成する
このプラグインは、カスタム ノードでカーブ ランプとカラー ランプを作成する方法を例示します。また、このサンプルには AE テンプレートに必要なコーディングも含まれています。
loadPlugin exampleRampAttribute;
createNode exampleRampAttrNode;
MEL コマンド exportJointClusterData を作成する
このサンプルは、すべてのジョイント クラスタ ノードを検索する方法を示すと共に、MFnWeightGeometryFilter 関数セットと MItGeometry イテレータを使用し、各ジョイント クラスタによって変形する各ジオメトリについて、1CV あたりのウェイトをエクスポートします。
このプラグインを使用するには、スケルトンを構築してリジッド バインド(Rigid Bind)機能でジオメトリをバインドし、次のコマンドを入力します。
exportJointClusterData -f filename;
exportJointClusterData -f "C:/temp/skinData"
jointName <skinCount>
skin_1 <weightCount>
<skin_1_component_index1> <skin_1_wt1>
<skin_1_component_index2> <skin_1_wt2>
<skin_1_component_index3> <skin_1_wt3>
...
skin_2 <weightCount>
<skin_2_component_index1> <skin_2_wt1>
<skin_2_component_index2> <skin_2_wt2>
<skin_2_component_index3> <skin_2_wt3>
...
MEL コマンド exportSkinClusterData を作成する
このサンプルは、すべてのスキン クラスタ ノードを検索する方法を示すと共に、MFnSkinCluster 関数セットと MItGeometry イテレータを使用し、スキンとしてスケルトンにバインドされる全ジオメトリについて、1CV あたりのウェイトをエクスポートします。
このプラグインを使用するには、スケルトンを構築し、スムース バインド(Smooth Bind)機能でジオメトリをバインドして、次のコマンドを実行します。
exportSkinClusterData -f filename;
MEL コマンド findFileTextures を作成する
このサンプルは、ディペンデンシー グラフを手動および DG イテレータでナビゲートする方法を例示します。このコマンドは、ディペンデンシー グラフを検索して、シェーディング エンジンにアタッチされているファイル テクスチャ ノードを見つけます。また、DG をナビゲートする際のフィルタの使用法も示します。ファイル テクスチャ ノードが見つかると、それらのノードのアトリビュート情報が抽出されて、標準エラーに出力されます。より詳しい解説は、ソース コードに記載されています。
このプラグインを使用するには、いくつかのテクスチャ情報を含むシーンをロードし、ファイル テクスチャによってシェーディングされている 1 つまたは複数のノードを検索します。次に、「findFileTextures nodeName1 nodeName2 ...」を実行して、ファイル テクスチャを検索します。
MELコマンド findTexturesPerPolygon を作成する
このサンプルは、findFileTexturesCmd サンプルの変形です。ファイル テクスチャ ノードをシェーダのカラー アトリビュートにコネクトすると、そのファイル名が抽出され、ポリゴン インデックスと一緒に出力されます。より詳しい解説は、ソース コードに記載されています。
このプラグインを使用するには、選択したオブジェクトでカラー アトリビュートに適用されるファイル テクスチャノードがあるシェーダを適用し、コマンド「findTexturesPerPolygon」 を実行します。
このコマンドは単純なプラグインで、UV を操作する新しい MPxPolyTweakUVCommand クラスの使用例を表示します。
flipUV [-es on|off] [-fg on|off] [-h on|off]
使用されるテクスチャのタイプに応じて、結果がモデル ウィンドウに表示されない場合があります。結果を確認するには、UV エディタ(UV Editor)を使用します。
ディペンデンシー グラフ ノード footPrintLocator と footPrintLocatorManip を作成する
このサンプルは、マニピュレータの表示ツールとユーザ定義マニピュレータを併用する方法を例示します。このユーザ定義マニピュレータが、フット プリント ロケータに相当します。
このプラグインを使用するには、「createNode footPrintLocator」と入力してフット プリント ロケータを作成し、フット プリントを選択して、マニピュレータの表示ツール(Show Manipulator Tool)をクリックします。
ディペンデンシー グラフ ノード footPrint を作成する
このサンプルは、ユーザ定義ロケータを作成する方法を例示します。ロケータは、3D ビューに描画される DAG オブジェクトですが、レンダリングは行いません。このサンプル プラグインでは、フット プリントを描画する新規のロケータ ノードを定義します。フット プリントは、通常のマニピュレータを使用して選択、移動することができます。
このプラグインを使用するには、「createNode footPrint」と入力してフット プリント ロケータを作成します。
ディペンデンシー グラフ ノード fullLoft を作成する
このプラグインは、NURBS カーブの配列を入力として取り、出力として NURBS サーフェスを作成する方法を例示します。入力カーブには同数のノットが必要であり、また、形と角度は無視されます。
このコマンドを使用するには、2 つ以上のカーブを描き、カーブを選択して MEL コマンド「source fullLoftNode.mel」を実行します。これによって、fullLoft ノードと出力サーフェス、および fullLoft ノードに一定数の CV を提供する複数の rebuildCurve ノードが作成されます。
このコマンドは、ノード名を引数に取ります。次に、ノードの各アトリビュート上を反復し、影響を与える側と受ける側のアトリビュートリストを出力します。このプラグインを使用するには、コマンド「getAttrAffects nodeName」を実行します。ここで、nodeName は、アトリビュートを表示する対象のノード名です。引数を指定せずに getAttrAffects コマンドを実行すると、選択しているすべてのノードに関するアトリビュート情報が表示されます。
MEL コマンド convertGeometryCache を作成する
このサンプルでは、IFF ファイル API を使用して、ジオメトリ キャッシュ ファイルを ASCII 形式に変換します。
このプラグインでは、ジオメトリ キャッシュ データ解析の 1 つのアスペクトのみをカバーしています。より包括的なサンプルについては、cacheFileExample.py を確認してください。この Python スクリプトは、Maya キャッシュ(.mc)の解析と解釈を行う方法を例示します。このサンプルでは、任意のスタンドアローン アプリケーションに Maya キャッシュ ファイルの解析を組み込めるよう、特殊な IFF コードの使用を避けています。
MPxConstraint ノード geometrySurfaceConstraint、および MEL コマンド geometrySurfaceConstraint を作成します。
この例は、MPxConstraint および MPxConstraintCommand クラスを使用して、ジオメトリ コンストレインを作成する方法を示しています。このタイプのコンストレインは、ターゲットを移動しても、コンストレイン オブジェクトがターゲットにアタッチされたままになるように維持します。コンストレインされたオブジェクトは、複数のターゲットの 1 つにコンストレインできます。ウェイトが最も高い、または低いターゲットへのコンストレインを選択できます。このプラグインを使用するには、まずこれをロードしてから、以下を実行します。
file -f -new;
polyPlane -w 1 -h 1 -sx 10 -sy 10 -ax 0 1 0 -cuv 2 -ch 1;
scale -r 15 15 15;
polyCylinder -r 1 -h 2 -sx 20 -sy 1 -sz 1 -ax 0 1 0 -rcp 0 -cuv 3 -ch 1;
select -cl;
select -r pPlane1 pCylinder1;
geometrySurfaceConstraint -weight 1;
これは、Maya のダイナミック ヘア システムに対して、カスタム コリジョン ソルバを実装するプラグインです。ユーザーはこのプラグインを使用して、Maya のダイナミック ヘア システムの次のアスペクトをオーバーライドできます。
Maya のダイナミック ヘア システムはコリジョン検出の 4 エリアに関係し、このプラグインはヘア対オブジェクト アスペクトにのみ限定されることに注意してください。
これは、マニュアルにある helixCmd サンプルです。このサンプルは、元に戻す機能を持たない単純なコマンドの作成例を示します。このコマンドは、2 つの引数「-r」と「-p」を取ります。「-r」はらせんの半径を設定し、「-p」はらせんの高さを設定します。したがって、らせんを作成するには、コマンド ウィンドウでコマンド「helix [ -r #] [ -p #]」を実行します。
このサンプルには、コマンド「source helixCmd」によって実行可能な MEL スクリプトも組み込まれています。
このスクリプトは、「helix」コマンドが存在する場所の下に新規のプラグイン(Plug-ins)メニューを作成します。このメニュー項目を選択すると、新規のらせんの半径と高さを設定できるウィンドウが開きます。これは、コマンドを UI にフックするよい例です。
このサンプルは、選択されているカーブを受け取り、らせんに変更します。このプラグイン自体は、とくに興味深いものではありませんが、このプラグインでは、元に戻す関数とやり直し関数を実装しているので、変更を元に戻す、または再実行することができます。つまり、このプラグインは、実行、元に戻す、およびやり直しをサポートするコマンドを実装する、簡単なサンプルになっています。このプラグインを使用するには、カーブを作成してから、コマンド ウィンドウで「helix2」を実行します。すると、カーブがらせんに変わります。編集(Edit)メニューの元に戻す(Undo)を選択すると、この変更が取り消されます。やり直し(Redo)を選択すると、再実行されます。
このサンプルは、Maya と同じアプリケーション シェルを使用する Motif ウィンドウを 1 つ別個に作成する方法を例示します。
新規のウィンドウには、Create Helix というラベルが付いた Motif ボタンが 1 つあります。このボタンを押すと、getProjectedFacesCmd サンプルによるものと全く同じらせんが作成されます。X イベント ループは依然として Maya により制御されていますが、任意の X ウィジェットおよびコールバックを登録することができます。登録したイベントが発生すると、Maya によってディスパッチされます。
MEL コマンド helixToolCmd と helixToolContext を作成する
このサンプルでは、コンテキストでコマンドをラップすることにより、らせんのサンプルを大きく前進させます。これによって、らせんを描く領域をドラッグで指定することができます。これを使用するには、まずコマンド「source helixTool」を実行します。これによって、らせんツール(Helix Tool)というツール シェルフの「Shelf1」タブに新しいエントリが作成されます。新しいアイコンをクリックして、カーソルをパースビュー ウィンドウに移動し、らせんの生成先となるボリュームを定義するシリンダを、ドラッグして外側に出します。このプラグインは、コマンドを囲むコンテキストを構成するよいサンプルです。
idleTest プラグインは、単純なプラグイン内でアイドル メッセージと「UI deleted」メッセージを使用する例を示します。これらのメッセージは、scriptJob コマンドに対する -idleEvent フラグと -uiDeleted フラグに相当します。
プラグインをロードすると、コマンド「idleTest」が追加されます。これを実行するには、「idleTest n」を入力します。ここで、n には正の数を入力します。IdleTest コマンドを実行すると、ウィンドウが 1 つ作成されて、素数のリストの表示が開始されます。このテストは、受け取ったアイドル メッセージごとに1つの新しい素数を計算します。再生中やオブジェクトのドラッグ中は、アイドル メッセージが停止します。
入力した n の数字が大きすぎると、アイドル メッセージが、使用可能な「すべての」CPU サイクルを使い果たします。このため、プラグインでは通常、不要になった時点でアイドル メッセージに対する要求をキャンセルします。
idleTest によって作成されたウィンドウを削除すると、プラグインは、「UI deleted」メッセージを受け取り、未処理のアイドル メッセージ コールバックをすべてキャンセルします。
このコマンドは、IFF ファイル名と、イメージ内のピクセルの X 座標および Y 座標を引数に取ります。このコマンドは、当該ピクセルの r/g/b/a 値を返します。例: 「iffPixel sphere.iff 100 210」
このコマンドは、既存の IFF ファイルの名前と、それによって作成される PPM(portable pixmap)ファイルの名前を引数に取ります。IFF イメージが読み取られ、別のファイルに PPM フォーマットで書き込まれます。
このプラグインは MDagMessage クラスの機能を例示し、メッセージに関連したインスタンスを受け取ることができます。メッセージは次のインスタンスの受け取りをサポートしています。
1)特定のノード(およびそのインスタンス)用に追加されたインスタンス
2)特定のノード(およびそのインスタンス)用に削除されたインスタンス
ii. イテレータを使用している dagPath を取得します。
iii. この円に追加および削除するインスタンス用のコールバックを追加します。
コールバック機能は、登録したコールバック機能の起動を示すメッセージを表示するだけです。
instCallbackCmd;
このプラグインは、MFnMesh の加速度交差方法を使用して、メッシュとスポット ライトの間にある交差ポイントを探します。
まず、プラグインをロードし、次に spotLight と polyPlane を作成します。以下を実行します。
global proc intersectExample()
{
// Make sure light and poly plane names are the same
intersectCmd spotLight1 pPlane1;
select -r spotLight1;
}
scriptJob -ac "spotLight1.tx" intersectExample;
scriptJob -ac "spotLight1.ty" intersectExample;
scriptJob -ac "spotLight1.tz" intersectExample;
scriptJob -ac "spotLight1.rx" intersectExample;
scriptJob -ac "spotLight1.ry" intersectExample;
scriptJob -ac "spotLight1.rz" intersectExample;
このプラグインは、ユーザ定義のプロシージャ ディペンデンシー グラフ ノードのサンプルです。このノードは、主にアニメーション向けですが、このノードを使用して、任意の 2 つの float アトリビュート間にノイズを追加することもできます。その場合は、float 値を入力に取り、その入力に疑似乱数値を追加して、ノイズの float 値を出力します。たとえば、パラメータ カーブ ノードの出力をジッタ ノードの入力にコネクトし、ジッタ ノードの出力をサーフェスの translateX アトリビュートにコネクトすると、サーフェスのモーションは、X 軸に平行した「ジッタ(揺れ)」になります。
このノードには、もう 1 つ別の入力である「時間」があります。タイム スライダ ノードの出力である「time1.outTime」は、「ジッタ」のあるアニメーションを繰り返し可能にする場合、ジッタ ノードの時間(Time)アトリビュートにコネクトする必要があります。スケール(Scale)アトリビュートを使用すると、ジッタ ノードの入力に適用されるランダム オフセットのマグニチュードを加減することができます。
このプラグインをロードすると、次の MEL コマンドが実行されます。
jitter "jitter1" "someNode1.outFloat" "someNode2.inFloat";
これによって、ジッタ ノード jitter1 が作成され、アトリビュート someNode1.outFloat が jitter1.input にアタッチされ、jitter1.output が someNode2.inFloat にアタッチされます。また、タイム スライダ出力 time1.outTime も、jitter1.time と jitter2.time にアタッチされます。
さらに、スケール調整用のスライダを持つ 2 つのウィンドウが作成されます。
ジッタ ノードを circleNodeプラグインと併用すると分かりやすくなります。circleNode と jitterNode プラグインをロードします。それから次のコマンドを実行します。
source circleNode
source jitterNode
createSphereAndAttachCircleNode;
jitter "jitter1" "circleNode1.sineOutput" "sphere1.translateX";
jitter "jitter2" "circleNode1.cosineOutput" "sphere1.translateZ";
タイム スライダ上の再生アイコンをクリックすると、ジッタが適用された円に沿って球体が移動します。ジッタの程度は、「jitter1 Scale Editor」ウィンドウと「jitter2 Scale Editor」ウィンドウにあるスケール スライダで調整することができます。
MIDI 入力デバイス jlcVcrDevice を新規に登録する
このプラグインをロードすると、Maya に JL-Cooper MIDI VCR 入力デバイスが jlcVcrDevice 型として登録されます。
このデバイスを使用するには、MEL スクリプト「jlcVcrDevice.mel」を実行します。これによって、MIDI デバイスのボタンが Maya のアニメーション再生コマンドに次のようにアタッチされます。
Maya に現在登録されている全入力デバイスのリストを得るには、コマンド listInputDevices を使用します。
ディペンデンシー グラフ ノード latticeNoise と MEL コマンド latticeNoise を作成する
latticeNoise コマンドとは、現在選択されているジオメトリの周囲、または、コマンド ラインに指定されているオブジェクトの周囲に新規のラティス デフォーマを作成します。また、DAG のラティス シェイプと、デフォメーションを実行するノードとの間に latticeNoise ノードを挿入します。
latticeNoise コマンドの最終エフェクトは、ラティスを基準にしてラティス内のオブジェクトを変形させることですが、ランダムな揺れもノイズとしてラティス ポイントに適用されます。latticeNoise ノードには、適用するノイズの量を制御する振幅(amplitude)アトリビュートと周波数(frequency)アトリビュートがあります。
latticeNoise nurbsSphereShape1 nurbsConeShape1;
新規にファイル フォーマット Lep をファイル操作ダイアログに追加する
このプラグインをロードした時点で、開く(Open)、インポート(Import)、エクスポート(Export)の各ダイアログで新規のファイル フォーマットが使用可能になります。
ファイル セレクション ボックスに表示されるアイコンは、ファイル lepTranslator.rgb に保存されており、サンプル プラグイン ディレクトリにも格納されています。Maya は、アイコンが存在するディレクトリへのパスが、FILE_ICON_PATH 環境変数に設定されている限り、このアイコンを検出します。
「Lep」ファイルは ASCII ファイルであり、最初の行は「<LEP>」です。ファイルのほかの部分には、プリミティブ nurbsSphere、nurbsCone、およびnurbsCylinder の 1 つを作成する MEL コマンド、さらにこれらを配置する move コマンドが含まれています。
このファイルを作成すると、上記の 3 つのプリミティブだけが、3D 空間での配置を伴って作成されます。実際の読み取りルーチンでは、これより多くの MEL コマンドを処理しますが、書き込まれるのはこの 3 種類のみです。
同様に、このサンプルでは、ファイル オプションの使用法を示します。ファイルを保存するときに、 ファイル > エクスポート(File > Export)メニュー項目の横にあるオプション ボックスをクリックすると、ダイアログが表示されます。そこに位置の書き込み(Write Positions)を行うかどうかを尋ねる 2 つのラジオ ボックスがあります。デフォルトは true になっており、false を選択すると、プリミティブの move コマンドが出力ファイルに作成されません。このダイアログを実装するには、MEL スクリプト lepTranslatorOpts.mel を使用しますが、これはプラグイン ディレクトリにも格納されています。
サンプル入力ファイルは、サンプル プラグイン ディレクトリに lepTranslator.lep として格納されています。
この例では、MLightLinks クラスを使用して Maya のライト リンク情報を検索する方法を示します。このコマンドは引数を取りません。現在選択されているオブジェクトがライトであれば、このコマンドはそのライトで照らされているオブジェクトをすべて選択します。現在選択されているオブジェクトがジオメトリの一部であれば、このコマンドはそのジオメトリを照らすライトをすべて選択します。
この例では、関数 MFnMesh::getPolyHoles() を使用してポリゴン メッシュのすべての穴をリストする方法を示します。このコマンドは引数を取りません。起動時に、このコマンドは現在選択されているメッシュの穴すべてのリストを出力ウィンドウ(Output Window)(Windows の場合)、またはコンソール(Linux プラットフォームの場合)に出力します。
このプラグインは、ノードとプラグのロックに関する API コールバックを例を示します。このコールバックにより、プラグまたはノードのロック状態が内部で検索されたときに、通知を受けるようにすることができます。API プログラマはコールバックの受信に関して、ノードまたはプラグのロック状態を override/(-o) するオプションを使うことができます。このオーバーライド(override)は、コールバック関数に渡された決定変数を介して制御されます。この変数には 2 つの値を持つことができます。
1. decision = true --> ロック状態を承認し、内部のデフォルト動作が何であっても行うことを許可します。
2. decision = false --> ロック状態を拒否し、Maya の通常動作の逆の動作を行うことを許可します。
4. はい、このイベントをオーバーライドしません。decision = true
4. いいえ、このイベントをオーバーライドします。decision = false
sphere ;
// Watch the translateX plug on the sphere we just created
lockEvent -a 3 nurbsSphere1.translateX;
// Do not allow any changes to the plug.
lockEvent -o true;
// Now you can try changes nurbsSphere1.translateX 's value
// but you will not be allowed to do so.
//
setAttr "nurbsSphere1.translateX" 22;
ファイル トランスレータ Maya ASCII(プラグインを介して)を作成する
このプラグインは、ファイル トランスレータの例です。Maya が使用する実際のコードではないが(Maya は MayaAscii フォーマットでファイルを作成します)、同フォーマットに非常に近い形式のファイルを作成します。作成されたファイルがいかに MayaAscii に似ているかは、MayaAscii であるかのように Maya がロードされることからも分かります。
このプラグインを使用するには、ロードしてからすべてエクスポート(Export All)メニュー項目を通じて起動させます。
MEL コマンド marqueeToolContext を作成する
これはもう 1 つのコンテキスト サンプルですが、このサンプルには関連するコマンドがありません。このプラグインを使用するには、コマンド ウィンドウでコマンド「source marqueeTool」を実行する必要があります。この操作によって、セレクション ボックス ツール(Marquee Tool)というツール シェルフの「Shelf1」タブに新しいエントリが作成されます。このツールをアクティブ化すると、選択ツールを使用するときと同じ方法で 3D ウィンドウでオブジェクトを選択できます。また、いずれの選択方法も、Shift キーを押しながら操作すると、セレクション ツールと同じように機能します。
コマンド meshOp を作成する。ディペンデンシー ノード meshOpNode を作成する。
MFnMesh に追加された新しいハイ レベルなポリゴン API メソッドの使用例を示します。
注: このプラグインは splitUVCmd から次のファイルを再利用します。
このプラグインは、カーブをモーション パスとしてオブジェクトに割り当てます。このプラグインを使用するには、オブジェクトを作成して、カーブを描きます。すべての項目の選択を解除し、オブジェクト、カーブの順に選択します(この順番は重要です)。両方とも選択したら、コマンド ウィンドウで「motionPath」を実行し、再生ボタンをクリックします。オブジェクトがカーブに沿って移動します。これは、モーション パス関数セットの簡単な使用例です。
このプラグインを使用するには、まず、オブジェクトを作成し、キーフレームを設定することでそのオブジェクトをアニメートします。この操作を簡単に行うには、プリミティブを作成してから、 spiralAnimCurveCmdプラグインを使用してそのプリミティブに 1 組のキーフレームを設定します。
この作業を行ったら、アニメーション設定されたオブジェクトを選択して「motionTrace」を起動します。このオブジェクトは、プラグインのコントロールの下にあるアニメーション設定されたパスに沿って移動し、アニメーションが完成すると、プラグインはオブジェクトのモーションパスを示すカーブをシーンに作成します。
このプラグインは、アニメーションの実行に使用する startFrame 値、endFrame 値、および byFrame 値を制御するパラメータ -s、-e、および -b を受け付けます。
これは、NURBS カーブから選択した複数の CV を受け取って原点に移動する、単純な小さいプラグインです。このプラグイン自体はあまり実用的ではありませんが、セレクション リストから CV を取り出す方法と、カーブ CV(Curve CV)イテレータを使用する方法を示します。
このプラグインを使用するには、カーブを描き、Maya をオブジェクト セレクション モードからコンポーネント モードに切り替えて、カーブの一部または全部の CV を選択する必要があります。その後、コマンド ウィンドウでコマンド「moveCurveCVs」を入力して、選択した CV を移動します。
MEL コマンド moveManipContext を生成し、サンプル コンテキストを作成する
このプラグインを使用するには、コマンド「source moveManip」を実行します。これによって、ツール シェルフの Shelf1 タブに「moveTool」という新しいエントリが作成されます。球体を作成してシェルフ上の moveManip アイコンをクリックします。オブジェクトを選択すると、フリーのポイントが 3 つあるマニピュレータが表示されます。
MEL コマンド moveNumericToolCmd と moveNumericToolContext を作成する
これは選択アクション ツールのサンプルであり、ユーザは、移動ツールの使用時にこのツールを使用して、精密な移動値を入力することができます。オブジェクトを選択すると、このツールは、移動ツールに変わります。このモードでは、ユーザは、数値入力フィールドに数値を入力して、オブジェクトを移動することができます。
このツールは、トランスフォーム(Transform)オブジェクトの移動のみをサポートし、正射投影ビューでの移動のみを実行します。また、元に戻す、やり直し、およびジャーナリングをサポートしています。
このプラグインを使用するには、コマンド「source moveNumericTool」を実行します。これによって、「moveNumericTool」というツール シェルフの「Shelf1」タブに新しいエントリが作成されます。新しいアイコンをクリックしてオブジェクトを選択し、正射投影ビュー内でドラッグします。オブジェクトを選択した状態で、数値入力フィールドに特定の移動値を入力します。この数値入力フィールドの左側にあるボタンをクリックして、絶対移動値か相対移動値かを指定することができます。
MEL コマンド moveToolCmd と moveToolContext を作成する
これは、選択アクション ツールのサンプルです。何も選択しないと、このツールは、Maya のセレクション ツールと全く同じように動作します。オブジェクトを選択すると、このツールは、移動ツールに変わります。
この時点で、プラグインでは次のオブジェクトを移動することができます。
このプラグインでは、正射投影ビューでの移動のみを行います。また、元に戻す、やり直し、およびジャーナリングをサポートしています。
このプラグインを使用するには、コマンド「source moveTool」を実行します。これによって、ツール シェルフの「Shelf1」タブに「moveTool」という新しいエントリが作成されます。新しいアイコンをクリックしてオブジェクトを選択し、正射投影ビュー内でドラッグします。左マウス ボタンを使用すると、2 方向の動きが可能になり、中マウス ボタンを使用すると、動きが単一方向にコンストレインされます。
MEL コマンド moveManipContext を生成し、サンプル コンテキストを作成する
このプラグインを使用するには、コマンド「source moveManip」を実行します。これによって、ツール シェルフの Shelf1 タブに「moveTool」という新しいエントリが作成されます。球体を作成してシェルフ上の moveManip アイコンをクリックします。オブジェクトを選択すると、フリーのポイントが 3 つあるマニピュレータが表示されます。
ディペンデンシー グラフ ノード multiCurve を作成する
このプラグインは、MArrayDataBuilder クラスを使用して、計算関数に配列アトリビュートを作成する方法を例示します。このアトリビュートのエレメント数は、計算サイクルごとに変化します。
このノードでは、入力として nurbsCurve を受け付け、nurbsCurves の配列を出力します。カーブ数はアトリビュート numCurves によって制御され、各出力カーブ間の間隔は、アトリビュート curveOffset によって制御されます。numCurves と curveOffset は、いずれもキー設定可のアトリビュートです。
このプラグインを使用するには、プラグインをロードして MEL コマンド「source multiCurveNode.mel」を実行します。これによってカーブが作成され、multiCurve ノードのインスタンスにコネクトされて、numCurves アトリビュートと curveOffset アトリビュートにキーフレームが設定され、すべての出力カーブを表示する curveVarGroup ノードに multiCurve ノードの出力がコネクトされます。このスクリプトを実行し、再生ボタンを押すと、アニメーションの進行に従って、新規のカーブが作成され、各カーブ間の空間が増大します。
このプラグインは、ディペンデンシー ノードの型と、それにコネクトされるプラグを検索する方法を例示します。また、選択されている項目上を反復し、項目ごとに次の情報を出力します。
このプラグインを使用するには、オブジェクトをいくつか選択してから、コマンド ウィンドウで「nodeInfo」を実行します。Maya を起動した際の最初のウィンドウにノード情報が出力されます。
このプラグインは、MNodeMessage クラスを使用したコールバックの登録、登録解除の方法を例示します。このプラグインは、「nodeMessage」という新規のコマンドを Maya に登録します。このコマンドは、アクティブ セレクション リストにあるすべてのノードにコールバックを追加します。対象のノードに対してコネクションの確立または解除が行われるたびに、メッセージが標準出力に出力されます。
ディペンデンシー グラフ ノード offsetNode を作成する
このプラグインは、シェイプがコネクトされている、ユーザ定義のウェイト デフォーマの作成方法を例示します。デフォーマとは、任意の数の入力ジオメトリを受け取り、それらを変形して、出力ジオメトリ アトリビュートに出力するノードです。このサンプル プラグインでは、CV のウェイトに従って頂点をオフセットする、新規のデフォーマ ノードを定義します。
ディペンデンシー グラフ ノード ownerEmitter を作成する
このノードは、パーティクル シェイプによって定義される複数のポイントから一定方向に放射する、パーティクル エミッタのサンプルです。
ノードと適切なコネクションを作成して、ユーザ定義のパーティクル エミッタを正しく確立する方法を示すサンプル MEL スクリプト「ownerEmitter.mel」があります。
このサンプルプラグインは MEL コマンド「particlePaths」を作成し、パーティクル ID 情報を使用して、時間の経過に合わせてパーティクルの位置からカーブをトレースする方法を示します。
次のコマンド シーケンスは、パーティクルの急増に合わせて一連のカーブを作成します。
emitter -type omni -r 15 -sro 0 -nuv 0 -cye none -cyi 1 -spd 1 -srn 0 -nsp 1 -tsp 0 -mxd 0 -mnd 0 -dx 1 -dy 0 -dz 0 -sp 0;
particle ;
connectDynamic -em emitter1 particle1;
select -r particleShape1;
gravity -pos 0 0 0 -m 0.5 -att 0 -dx 0 -dy -1 -dz 0 -mxd -1 -vsh none -vex 0 -vof 0 0 0 -vsw 360 -tsr 0.5;
connectDynamic -f gravityField1 particle1;
particlePaths -s 0 -f 4 -i 0.5 particleShape1;
コマンドは関数セット MFnParticleSystem を使用し、時間ごとに個別のポイントで、パーティクルの位置と識別子をサンプリングします。
コマンドはオプション -s(開始時間)、-f(終了時間)、および -i(増分時間)をサポートしています。パーティクルの位置は、開始時間から終了時間まで、増分時間ごとにサンプリングされます。蓄積されたパーティクルの位置は MFnNurbsCurve 関数セットに渡され、その蓄積データからカーブが作成されます。
パーティクル情報を検索するための新しい MFnParticleSystem クラスの使用例を示します。後にその位置が付いたパーティクル位置の数が、スクリプト エディタ(Script Editor)に出力されます。
particleSystemInfo $particleNodeName;
particleSystemInfo particleShape2;
このプラグインは、Maya シーンからペイント エフェクトのレンダー ライン情報を抽出する方法を例示します。プラグインとペイント エフェクト情報を含む Maya シーンをロードし、次のコマンドを実行します。
// Get all data
pfxInfo strokeShape2;
// Or
pfxInfo strokeShape2 "all";
// Only line and width
pfxInfo pfxHairShape2 "lineAndWidth";
// Just line
pfxInfo strokeShape1 "line";
これは、名前別選択機能の例を示す単純なプラグインです。コマンド ウィンドウで「pick <object_name>」を実行するだけです。また、ある程度のパターン マッチングが可能で、「pick surface*」とすると、名前が「surface」で始まるオブジェクトがすべて選択されます。
このプラグインは ATI Radeon 専用のプラグインです。これはハードウェア シェーダ プラグインで、以下を実行します。
「PN Triangle 生成が有効になっている場合、三角形ベースのジオメトリック プリミティブはそれぞれ、プリミティブの頂点を制御点として使用して新しい曲面に置き換えられます。PN Triangle の目的は、アルゴリズムに従いテッセレーションして、シルエットがスムースでより有機的なシェイプに三角形ベースのジオメトリ セットを仕上げることです。新しいサーフェスは、パッチの法線を一次または二次に補間することができます。パッチの頂点は、一次的または三次的に補間することができます。ポイントの一次補間は、ジオメトリック シェイプのライティングのためのサンプル ポイントを何度も取得する場合に便利です。その他の頂点情報はすべて(カラー、テクスチャ座標、フォグ座標、および頂点のウェイト)、パッチで一次的に補間されます。」
このプラグインは、フェース インデックス、U パラメータ、V パラメータを入力として指定してポリゴン メッシュのワールド空間の位置と法線を計算する、MEL コマンドおよび DG ノードを定義します。
このプラグインの概念は、pointOnSurface MEL コマンドと pointOnSurfaceInfo ノードに基づいています。Maya API 開発キットの pointOnSubdNode.cpp プラグインのサンプルも、参照として使用されます。
MEL スクリプト AEpointOnSurfaceInfoTemplate.mel は、pointOnMeshInfo ノードに伴う AE テンプレート MEL スクリプトで参照されています。
ディペンデンシー グラフ コマンド pointOnSubd を作成する
このノードは、ディペンデンシー ノードへの入力としてサブディビジョン サーフェスを検索する方法を示す、単純なサンプルです。このノードでは、サブディビジョン サーフェスと、サブディビジョン サーフェス上のパラメータ ポイントを受け取り、そのポイントにおけるサーフェスの位置と法線を出力します。このプラグインに付随する MEL スクリプト「connectObjectToPointOnSubd.mel」には、このノードの使用法に関する詳細なマニュアルがあり、それ自体がその使用法を例示します。
MPolyMessage クラスを使用したコールバックの登録、登録解除の方法を例示する
このプラグインは、「polyMessage」という新規のコマンドを Maya に登録します。このコマンドは、アクティブ セレクション リストにあるすべてのノードにコールバックを追加します。対象のノードに対してコンポーネント ID が変更されるたびに、メッセージが標準出力に出力されます。
// create a poly plane
// open the outliner and select the poly shape
// Run the plug-in
polyMessage
// select some vertices of the poly shape
// hit the delete key to see the remapped ids of the edges, vertices and faces written out
このプラグインは、何種類かのポリゴン プリミティブを作成し、ポリゴン データの作成を例示します。このプラグインをロードして、コマンド ウィンドウで「polyPrimitive #」(「#」は 1 ~ 7 の整数)を実行すると、原点にポリゴンが作成されます。
コマンド「source polyPrimitiveCmd」を実行すると、スクリプト polyPrimitiveCmd.mel が実行されます。その後、コマンド「polyPrimitiveMenu」を実行すると、ウィンドウが開き、ボタンをクリックするだけでこれらのオブジェクトを作成できるようになります。
このプラグインは、新しい poly API クラス MPxPolyTrg を使用して、ユーザが定義したメッシュの三角分割を追加する方法について例示します。
このノードはユーザが定義したフェースの三角分割を登録します。この関数を登録しておくと、シーンのあらゆるメッシュでこの関数を使用して三角分割を行うことができます(メッシュの一般的な三角分割を置き換える)。メッシュにこの関数を使用するには、メッシュのアトリビュート「userTrg」にこの関数名を設定する必要があります。
メッシュごとに別々の関数を使用することができます。使用する関数は登録しておく必要があります。同一のノードに複数の関数を設定できます。
createNode polyTrgNode -n ptrg;
polyPlane -w 1 -h 1 -sx 10 -sy 10 -ax 0 1 0 -tx 0 -ch 1 -n pp1;
select -r pp1Shape;
setAttr pp1Shape.userTrg -type "string" "triangulate";
このプラグインは MProgressWindow クラスの使い方を例示します。コマンド「progressWindowPlugin」は、秒ごとに更新する単純なプログレス ウィンドウを表示します。プログレス ウィンドウを終了するには、ESC キーを押します。
progressWindowCmd;
プログレス ウィンドウを表示します。Maya は一度に 1 つのプログレス ウィンドウしか表示できないことに注意してください。MEL もプログレス ウィンドウの作成をサポートしていますが、MEL と API のプログレス ウィンドウが同時にコールされると、プログラム エラーが発生することがあります。
このプラグインで、「quadricShape」という Maya の新しいタイプのシェイプを登録します。このシェイプは、OpenGL gluQuadric 関数を使用して球体、シリンダ、円盤、円盤の一部などを表示します。
createNode quadricShape -n qSphere;
このシェイプには、出力アトリビュートがない点に注意してください。
このサンプルは、メイン シーンにあるリファレンス ファイルの有益な情報を示します。リファレンス ファイルごとの出力フォーマットは、次のとおりです。
Referenced File: filename1
Connections Made
sourceAttribute -> destinationAttribute
...
Connections Broken
sourceAttribute -> destinationAttribute
...
Attributes Changed Since File Referenced
attribute1
attribute2
...
このプラグインを使用するには、ファイル リファレンスのあるシーン ファイルを開き、MEL コマンド「referenceQuery」を実行します。リファレンス情報は、標準出力に作成されます。
ディペンデンシー グラフ ノード renderAccessNode を作成する
この例では、レンダー コールバックを使用した作業について説明します。このプラグインでは、レンダー コールバック、シャドウ キャスト コールバック、およびポスト プロセス コールバックを登録します。レンダーが始まると、レンダー コールバックをコールし、そのレンダーのサイズに関する情報を取得します。レンダーにシャドウ マッピングが存在する場合は、シャドウ マッピングの計算後にシャドウ キャスト コールバックをコールし、シャドウ マッピングのデータを取得します。最後に、ジオメトリのレンダーが終了すると、ポスト レンダー コールバックをコールし、レンダーされたピクセルのポインタを取得します。
このプラグインでは、ポスト プロセス コールバックでレンダー イメージを変更して、ピクセルの操作方法を例示します。アトリビュート pointWorld が画面空間に変換されてから、MRenderData::worldToScreen() と MRenderData::screenToWorld() のテストに戻ります。
renderViewInteractiveRenderCmd
MRenderView クラスの startRender() メソッドに追加された即座のフィードバック設定の例を示します。このプラグインのロード後に次のコマンドを実行し、サポートしているオプションを確認します。
help renderViewInteractiveRender;
MEL コマンド renderViewRender を作成する
この例では、MRenderView クラスを使用してレンダー ビュー(Render View)ウィンドウにフル イメージをレンダーする方法について説明します。このコマンドは引数を取りません。640x480 の紅白の円形柄のタイル状イメージを、レンダー ビューにレンダーします。
MEL コマンド renderViewRenderRegion を作成する
この例では、MRenderView クラスを使用して Maya のレンダー ビューで現在選択されているレンダー領域を更新する方法について示します。このコマンドは引数を取らず、青と白の円形柄でレンダー領域を常に更新します。このコマンドは、レンダー ビューが 640x480 のイメージを表示していることを前提とします(サンプルコマンド 'renderViewRender' によって生成されたイメージなど)。
rotateManip はマニピュレータ プラグインで、回転ベースのマニピュレータ関数セットを示します。この例では MEL コマンド rotateContext を生成して、このマニピュレータ用のツール コンテキストを作成します。
プラグインに対してツール ボタンを作成するには、「Shelf1」という名前の新規シェルフを作成し、次の MEL コマンドを実行してこのシェルフにツール ボタンを作成します。
rotateContext;
setParent Shelf1;
toolButton -cl toolCluster -t rotateContext1 -i1 "moveManip.xpm";
マニピュレータを使用するには、オブジェクトを選択して新規ツール ボタンをクリックします。状態マニピュレータに隣接するオブジェクト上に、回転マニピュレータが表示されます。プラグイン回転マニピュレータは、組み込み回転マニピュレータと同様に動作するように設定されます。状態マニピュレータは回転マニピュレータのモードを選択するために使用されます。モードは、オブジェクト空間モード、ワールド空間モード、ジンバル モードおよびスナップ可能なオブジェクト空間モードの中から選択できます。
この例では、MRenderUtil::sampleShadingNetwork() を使用してシェーディング グループやノードをサンプリングする方法を示します。
このコマンドは、pointCamera や UV 座標などのシェーディング情報のリストを受け取り、所定のシェーディング グループ/ノードをサンプリングし、結果となるカラーと透過性を返します。シェーディング グループをサンプリングすると、ライトが計算されます。同様に、-shadow フラグを指定すると、シャドウを計算することができます。例:
sampleCmd file1.outColor 4 -uvs 0 0 1 0 1 1 0 1;
sampleCmd creater1.outColor 4 -refPoints 0 0 0 1 0 0 1 0 1 0 0 1;
MEL コマンド sampleParticles を作成する
この例では、MRenderUtil::sampleShadingNetwork() を使用してシェーディング グループやノードをサンプリングし、パーティクル オブジェクトにカラーを割り当てる方法を示します。
このコマンドは、pointCamera や UV 座標などのシェーディング情報のリストを受け取り、所定のシェーディング グループまたはノードをサンプリングして、emit コマンドでパーティクルのグリッドに見本のカラーや透過性を割り当てます。シェーディング グループをサンプリングすると、ライトが計算されます。-shadow フラグを指定すると、シャドウを計算することができます。
このプラグインは、DAG イテレータ クラスを使用して DAG をスキャンする方法を例示します。このプラグインを使用するには、シーン内の任意の場所に複数のオブジェクトを作成し、コマンド scanDag を実行します。これによって、Maya を起動した際の最初のウィンドウに表示される、各ノードに関する DAG 出力情報が走査されます。このプラグインには、カメラ、ライト、および NURBS サーフェスに関する特定の情報が含まれており、それぞれの情報ごとにオブジェクト型特有の情報が出力されます。
このコマンド プラグインは、構文オブジェクトを介して構文解析を行うほかは、scanDagCmd と同じ機能を持ちます。このコマンドでは、次のフラグを受け付けます。
-b/-breadthFirst |
幅優先の検索を実行 |
-d/-depthFirst |
深さ優先の検索を実行 |
-c/-cameras |
スキャンをカメラに限定 |
-l/-lights |
スキャンをライトに限定 |
-n/-nurbsSurfaces |
スキャンを NURBS サーフェスに限定 |
ShapeMonitor は、シェイプやテクスチャ ノードをモニタして、最後のエクスポート以降変更されたものを追跡記録する、シングルトン(単一)クラスです。テクスチャに関する IFX シーン グラフの更新状況を記録するのにも使用されます。
また、ShapeMonitor が不要になった場合(シーンが閉じているときなど)、destroy() 関数で破棄することができます。最後に、すべてのコールバックとデータ構造は、initialize() 関数をコールして消去することができます。
このプラグインは、複雑なメッシュ オブジェクトを手順を追って生成する方法を例示します。また、ノードに対するアトリビュート エディタをカスタマイズする方法も例示します。
このプラグインを使用するには、MEL コマンド「shell」を入力して、新規のシェル ノードを作成します。また、出力を表示するためにメッシュ オブジェクトも作成されます。新規のシェル ノードに対するアトリビュート エディタを開き、事前に設定されている各種の貝殻を選択するカスタム コントロールを表示します。アトリビュート エディタのレイアウトは、ファイル AEShellTemplate.mel によって作成されます。これは、アトリビュート エディタテンプレートを作成する複雑な例です。
ディペンデンシー グラフ ノード shiftNode を作成する
このサンプル プラグインでは、プラグイン テクスチャ内から uvCoord と refPointCamera を変更する方法を例示します。uvCoord と refPointCamera には、「renderSource」アトリビュートのマークが付いています。現在のサンプル位置の uvCoord と refPointCamera が要求され、その後 4 回シフトされます。このアトリビュートを修正するたびに inColor アトリビュートが要求され、アトリビュートがレンダー ソースであるため、inColor が要求されるとシェーディング評価が強制されます。このため inColor にコネクトされた 2D テクスチャまたは 3D テクスチャは、シェードされるすべてのポイントでさらに 4 回評価されます。inColor 値は平均化され、結果はぼやけます。
ディペンデンシー グラフ ノード simpleEmitter を作成する
このノードは、ある位置から一定方向に放射するパーティクル エミッタのサンプルです。
ノードと適切なコネクションを作成して、ユーザ定義のパーティクル エミッタを正しく設定する方法を示すサンプル MEL スクリプト「simpleEmitter.mel」があります。
ディペンデンシー グラフ ノード simpleFluidEmitter を作成する
このサンプルは、新しい MPxFluidEmitterNode クラスを使用して Maya の標準的な流体エミッタの大半の機能を実行する手順を例示します。
createNode simpleFluidEmitter -name simpleFluidEmitter;
// create particle object and connect to the plugin emitter node.
particle -name particles ;
connectDynamic -em simpleFluidEmitter particles;
setAttr "simpleFluidEmitter.rate" 200;
setAttr "simpleFluidEmitter.speed" 25;
playbackOptions -e -min 0.00 -max 60.0;
currentTime -e 0;
play -wait -forward true;
// make some keyframes on emitter
currentTime 0 ;
select -r simpleFluidEmitter ;
setKeyframe "simpleFluidEmitter.tx";
setKeyframe "simpleFluidEmitter.ty";
setKeyframe "simpleFluidEmitter.tz";
setKeyframe "simpleFluidEmitter.rx";
setKeyframe "simpleFluidEmitter.ry";
setKeyframe "simpleFluidEmitter.rz";
currentTime 30 ;
move -r -2.011944 6.283524 -2.668834 ;
move -r -ls -wd 0 0 12.97635 ;
rotate -r -os 0 -75.139762 0 ;
setKeyframe "simpleFluidEmitter.tx";
setKeyframe "simpleFluidEmitter.ty";
setKeyframe "simpleFluidEmitter.tz";
setKeyframe "simpleFluidEmitter.rx";
setKeyframe "simpleFluidEmitter.ry";
setKeyframe "simpleFluidEmitter.rz";
currentTime 60 ;
move -r 0 0 -14.526107 ;
move -r 0 -8.130523 0 ;
rotate -r -os 0 0 78.039751 ;
rotate -r -os 0 0 53.86918 ;
setKeyframe "simpleFluidEmitter.tx";
setKeyframe "simpleFluidEmitter.ty";
setKeyframe "simpleFluidEmitter.tz";
setKeyframe "simpleFluidEmitter.rx";
setKeyframe "simpleFluidEmitter.ry";
setKeyframe "simpleFluidEmitter.rz";
ディペンデンシー グラフ ノード userLoft を作成する
このプラグインは、ジオメトリを入力として受け取り、出力用のジオメトリを作成する方法を例示します。NURBS カーブがノードに入力されて、そのカーブから NURBS サーフェスが作成されます。結果のジオメトリは、Maya 内部ノードに渡って表示され、配置できるようになります。
このノードを使用するには、XY プレーンにカーブを描いてから、次のコマンドを含む MEL コマンド「simpleLoftNode.mel」を実行します。
createNode transform -n simpleLoft1;
createNode nurbsSurface -n simpleLoftShape1 -p simpleLoft1;
createNode simpleLoft -n simpleLoftNode1;
connectAttr curveShape1.local simpleLoftNode1.inputCurve;
connectAttr simpleLoftNode1.outputSurface simpleLoftShape1.create;
これによって、nurbsSurface ノードが作成され、その結果が表示用のワールドにフックされます。その後、simpleLoft ノードが作成されて、入力が curveShape1(最初に描いたカーブからのジオメトリ)に、出力が NURBS サーフェスノードにそれぞれコネクトされます。
この時点で、画面にサーフェスが表示されます。元のカーブの複数の CV を選択、移動すると、サーフェスもそれに合わせて再構成されます。
このプラグインをロードすると、新規の IK ソルバが、simpleSolverNode 型として Maya に登録されます。このソルバを使用するには、ジョイント ツール(Joint Tool)を使用して、2 つのジョイントによる単一の IK ボーンを作成してから、コマンド ウィンドウに次のコマンドを入力して、新規のソルバを使用する IK ハンドルを作成します。
ikHandle -sol simpleSolverNode -sj joint1 -ee joint2
XY プレーンでハンドルを動かすと、ジョイントが回転します。
ikHandle -q -sol handleName
ディペンデンシー グラフ ノード simpleSpring を作成する
このノードは、Maya がシミュレーションに使用するスプリングの動きを計算する、スプリング ノードのサンプルです。
ノードと適切なコネクションを作成してユーザ定義のスプリング法を正しく設定する方法を示す、サンプル MEL スクリプト「simpleEmitter.mel」があります。
このプラグインは、 circleNodeを単純にしたものです。単一の入力値を取り、正弦を 10 倍にして出力します。これが、プローシージャ型アニメーションの簡単な作成例です。以下に、このノードを球体にアタッチする一連の簡単なコマンドを示します。
sphere -n sphere;
createNode sine -n sine1;
connectAttr sine1.output sphere.tx;
connectAttr time1.outTime sine1.input;
このコマンドを実行すると、球体が、時間の変化に合わせて、X 軸に沿った粗い動きを定期的に取ります
(粗い動きになるのは、入力が通常 1 ~ 48 であり、sine ノードの計算法では、ラジアンとなる正弦だけを入力として処理するためです)。
MEL コマンド spiralAnimCurve を作成する
このプラグインは、選択済みのオブジェクトの X、Y、Z の各移動アトリビュートにアニメーション カーブをアタッチして、らせん状のパス沿いにオブジェクトをアニメートします。これは、オブジェクトのアトリビュートにアニメーション カーブをアタッチするよい例です。
このプラグインを使用するには、Maya のパース ビューウィンドウでオブジェクト(複数選択可)を選択して、コマンド「spiralAnimCurve」を実行します。次に、画面の右下にあるタイム スライダの再生ボタンをクリックします。選択したオブジェクトが、アニメーションの再生に伴ってらせん状に移動します。
splitUV コマンドは、ポリゴン メッシュの選択された UV の共有を解除(UV を「分割」)します。これは、ヒストリ、tweak などを適切に処理する poly operation ノードを作成する場合の良い例にもなります。このコマンドの作成の詳細については、『<PalItal>Maya Developer’s Tool Kit』の「Polygon API」の章にあるサンプル splitUVCmd を参照してください。
surfaceBumpManip はマニピュレータ プラグインで、pointOnSurface ベース マニピュレータの使用方法を例示します。この例では MEL コマンド surfaceBumpContex を生成して、このマニピュレータ用のツール コンテキストを作成します。
プラグインに対してツール ボタンを作成するには、「Shelf1」という名前の新規シェルフを作成し、次の MEL コマンドを実行してこのシェルフにツール ボタンを作成します。
surfaceBumpContext;
setParent Shelf1;
toolButton -cl toolCluster -t surfaceBumpContext1 -i1 "moveManip.xpm";
マニピュレータを使用するには、NURBS 球体を作成し、ツール ボタンを選択します。マニピュレータが球体のサーフェスに表示されます。球体のサーフェス上のマニピュレータを移動すると、球体の法線に沿って CV が移動し、マニピュレータの近くのサーフェスが変更されます。
このコマンドを使用するには、まず、複数の NURBS サーフェスまたはポリゴンを作成して選択します(ツイストした変わったサーフェスは、 surfaceCreateCmd コマンドで作成されます)。次に、コマンド「surfaceTwist」を入力すると、選択したすべてのサーフェスが、y 軸を中心にツイストします。
ディペンデンシー グラフ ノード sweptEmitter を作成する
このノードは、カーブまたはサーフェスから一定方向に放射する、パーティクル エミッタのサンプルです。
ノードと適切なコネクションを作成して、ユーザ定義のパーティクル エミッタを正しく設定する方法を示す、サンプル MEL スクリプト「sweptEmitter.mel」があります。
ディペンデンシー グラフ ノード swissArmyLocator と swissArmyLocatorManip を作成する
これは、全ての種類のユーザ定義のマニピュレータをノードに加えることを意図したサンプル プラグインです。これは、各ユーザ定義マニピュレータの作成に必要な、ソース コードの良い例です。これを使用するには、次のコマンドを実行します。
createNode swissArmyLocator
次に、ツール バーにある showManip アイコンをクリックします。画面上のロケータが、各種のユーザ定義マニピュレータのいずれかに上書きされます。
この例は、MThreadPool クラスとスレッド アルゴリズムを使って素数を計算する方法を示します。比較のために、素数のシリアル計算も示します。このプラグインを使用するには、まずこれをロードしてから、以下を実行します。
threadTestCmd 1 10000
MEL コマンド threadTestWithLocksCmd を作成します。
threadTestCmd と非常によく似ていますが、MSpinLock クラスとロックされているスレッド スピンが組み込まれています。このプラグインを使用するには、まずこれをロードしてから、以下を実行します。
threadTestWithLocksCmd 100000
ディペンデンシー グラフ ノード torusField を作成する
このノードは、それ自体と一定距離との間での attract-repel フィールドを作成するダイナミクス フィールド ノードのサンプルです。
ノードと適切なコネクションを作成して、ユーザ定義のフィールドを正しく設定する方法を示す、サンプル MEL スクリプト「torusField.mel」があります。
ディペンデンシー グラフ ノード transCircle を作成する
このプラグインは、複数の値を持つアトリビュート(複合アトリビュート)を使用する方法を例示します。トランスフォーム(Transform)ノードの移動(translate)アトリビュートを使用します。このアトリビュートは、複数のエレメント移動 X(translate X)、移動 Y(translate Y)、移動 Z(translate Z)からなり、どのエレメントも単一のディペンデンシー グラフ コネクションを介して通信します。
このノードを使用するには、次のコマンドを含む MEL コマンド「transCircleNode.mel」を実行します。
createNode transCircle -n circleNode1;
sphere -n sphere1 -r 1;
sphere -n sphere2 -r 2;
connectAttr sphere2.translate circleNode1.inputTranslate;
connectAttr circleNode1.outputTranslate sphere1.translate;
connectAttr time1.outTime circleNode1.input;
これによって、2 つの球体と transCircle ノードが作成されます。sphere1 の translate アトリビュートは、transCircle ノードの入力にコネクトされ、その出力は、sphere2 の translate アトリビュートにコネクトされます。
再生ボタンを押すと、2 番目の球体が 1 番目の球体の周りを回ります。1 番目の球体が移動すると、2 番目の球体も移動するので、1 番目の球体が常に円の中心に維持されます。
このプラグインは、アトリビュート エディタ テンプレートのサンプルにも付属しています。このサンプルでは、スケール(Scale)とフレーム(Frames)以外のすべてのアトリビュートの表示が抑制されます。また、スケール アトリビュートについては、アトリビュート値の更新にラジオ ボタンを使用する特別なクイック設定コントロールが備わっています。
このプラグインは、選択済みのカーブ、サーフェス、またはポリゴン オブジェクトの複数の CV を、ユーザが指定した数値だけ移動します。これは、この 3 つのデータ型の CV を操作する良い例です。このプラグインを使用するには、オブジェクトを選択してから、コマンド ウィンドウで「translate 1.0 2.0 3.0」を実行します。
このコマンドは、コンストラクション ヒストリが設定された NURBS プリミティブでは機能しない点に注意してください。このヒストリが設定されていると、translate コマンドで CV を移動しても、すぐに元の位置に戻ります。このようなサーフェスに対して translate コマンドを機能させるには、オブジェクトに対するコンストラクション ヒストリを削除するか 編集 > 種類ごとに削除 > コンストラクション ヒストリ(Edit > Delete By Type > Construction History)、サーフェスを作成する前にツール設定(Tool Settings)ウィンドウを開き、ヒストリ(History)をオフにする必要があります。
このプラグイン サンプルでは、MEventMessage クラスを使用した元に戻す(Undo)とやり直し(Redo)メッセージ イベントを受け取る方法を例示します。
undoRedoMsg add;
undoRedoMsg remove;
add 引数により、元に戻す/やり直しの受け取りを有効にします。remove 引数により、元に戻す/やり直しの受け取りを削除します。
このサンプル プラグインは、MEL コマンド 「userMessage」を生成してプラグインがユーザ定義メッセージを使用する方法を示しています。
// Register a user-defined event named “test”. The plug-in will internally register
// callbacks for the event.
userMessage -r test;
// Post to the user-defined event. The plug-in prints info messages from the callbacks.
userMessage -p test;
// Entered userMessage::userCallback2
// Received data: Sample Client Data (an MString object)
// Entered userMessage::userCallback1
// Received data: Sample Client Data (an MString object)
// Deregister the user-defined event
userMessage -d test;
// Trying to post a message after the event has been removed will fail.
userMessage -p test;
このプラグインは、MUiMessage のプリ レンダリング コールバックとポスト レンダリング コールバックをインストールします。簡単な例として、奥行きに基づき、モデリング ビューを反転、またはシェーディングすることができます。シェーディング モードでは、オブジェクトが近くにあればあるほど、色が薄くなります。以下に、ロードされたこのプラグインを使用するための MEL サンプルをいくつか紹介します。
// Invert mode
viewCallbackTest -bo "invert" `getPanel -withFocus`;
// Depth mode
viewCallbackTest -bo "showDepth" `getPanel -withFocus`;
このプラグインでは、OpenGL を使用してカレントの 3D ビューを取り込み、PPM ファイルに書き込みます。このプラグインを使用するには、引数として、カレントビューの PPM イメージを書き込むファイル名を指定します。
MFnVolumeLight クラスの使用例を示します。この例では、ボリューム ライトを作成してから、数多くのアトリビュートを検索して設定を行います。
volumeLight;
volumeLight -a $arc -c $coneEndRadius -e $emitAmbient;
デフォーマ ノードにあるマルチ アトリビュートを操作する方法を例示します。weightList ノードはこのプラグインによって作成されます。このプラグインの ::compute() メソッドは、マルチ アトリビュートを操作する方法を例示しているのに対し、::initialize() はアトリビュートの作成方法を例示しています。このプラグインがロードされたら、以下のデモを実行することができます。
createNode weightList;
setAttr weightList1.bias 1;
getAttr -type weightList1.weightsList;
// check result in shell window
これは、Maya オブジェクトの API 型を記述するメッセージを標準出力に出力する単純なコマンドです。このコマンドに Maya オブジェクトが指定されていないと、現在選択済みの全オブジェクトの型がリスト表示されます。
このリストは本質的に、当該オブジェクトのすべての親クラスを含むクラス派生リストです。
whatis nurbsSphereShape1
Name: nurbsSphereShape1
Type: kNurbsSurface
Function Sets: kBase, kNamedObject, kDependencyNode, kDagNode, kShape, kGeometric, kSurface, kNurbsSurface, kNurbsSurfaceGeom
このプラグインは、ユーザ定義デフォーマの作成方法を例示します。デフォーマとは、任意の数の入力ジオメトリを受け取り、それらを変形して、出力ジオメトリ アトリビュートに出力するノードです。このサンプル プラグインでは、Y 軸を中心に入力の頂点をツイスト変形する、新規のデフォーマノードを定義します。
これは、現在アクティブになっているカメラのビュー フィールドを、水平方向に 2 つに分割する単純なプラグインです。現在アクティブになっているビューの取得、およびカメラの変更に関する良い例です。このプラグインを使用するには、まず、メニュー項目の 作成 > カメラ > カメラ(Create > Cameras > Camera)を選択してカメラを作成し、シーン内のオブジェクトを「見る」ようにカメラを位置づけます。その後、次のいずれかの操作を行います。
この時点で、カメラを通した視点になります。コマンド ウィンドウで「zoomCamera」を実行し、カメラを通したビューを 2 倍に拡大します。
MEL コマンド listParticleInstances を生成する
このプラグインは、MFnInstancer クラスと MItInstancer クラスを使用して、シーンでパーティクル インスタンスを列挙する方法を例示します。コマンドの起動時に 1 つまたは複数のノードが選択されている場合、MFnInstancer を使用して、各インスタンサのインスタンスを列挙し、instancesForParticle() と allInstances() メソッドを実行します。インスタンサが選択されていない場合、MItInstancer を使用して、シーンのすべてのパーティクル インスタンスを反復します。
ディペンデンシー ノード genericAttributeNode を生成する
このプラグインは、汎用アトリビュートを含む MPxNode の作成方法を例示します。複数の汎用アトリビュートはノードに追加され、compute method() がコントロール タイプ アトリビュートに基づいてその結果を設定します。
ディペンデンシー ノード curvedArrows を生成する
ロケータ ノードの透明度フラグを例示する単純な ロケータ ノード。透明なオブジェクトは、Maya による特別な描画パスで描画する必要があります。これはレンダーされる出力がオブジェクトの描画順序に依存するためです。isTransparent() メソッドは、このロケータをレンダリングのために特別な透明度待ち行列に配置する必要があることを通知します。
API プログラマは、このノードの「transparencySort」アトリビュートを切り替えることで、この描画操作の効果を確認できます。このアトリビュートに true が設定されると、すべての透明なオブジェクトがシーンにある状態で、ロケータがソートされた順序で描画されます。このアトリビュートに false が設定されると、すべての不透明なオブジェクトがシーンにある状態で描画されます。
これは関連する drawLast() フラグも例示します。このフラグを使用すると、ロケータを最新のオブジェクトとして指定し、指定したリフレッシュ パスで描画することができます。このフラグは特別な目的に対応しますが、決定的な状況で isTransparent フラグを使用する場合にも重要です。
ディペンデンシー ノード customImagePlane を生成する
Maya の内部イメージ プレーン クラスに基づいて、ユーザ固有のカスタム イメージ プレーンを作成する方法を例示します。これを使用すると、API ユーザはデフォルトの Maya イメージ プレーンの動作をオーバーライドすることができます。このクラスは、計算メソッドを持ち、API ユーザが追加したスタティック アトリビュートを含めることができるという点で、標準的な API ノードと似ています。このサンプル クラスは、デフォルト イメージ プレーンの動作をオーバーライドし、ユーザはノードの透明度アトリビュートを使用してイメージ プレーンに透明度を追加できます。また、このコードは MImage を使用して浮動小数点デプス バッファをコントロールする方法も例示します。useDepthMap に true が設定される場合、イメージの半分がニア クリップ プレーン、残りの半分がファー クリップ プレーンになるように、イメージにデプスが追加されます。
イメージ プレーン ノードが作成されると、これをノードを表示しているカメラ シェイプにアタッチする必要があります。イメージ プレーンは、カメラ シェイプの imagePlane メッセージ アトリビュートからカメラにアタッチされます。このサンプル イメージ プレーンをアタッチするには、イメージ プレーンのメッセージ アトリビュートを cameraShapes imagePlane アトリビュートにコネクトする必要があります。imagePlane アトリビュートはマルチ アトリビュートであり、複数のイメージ プレーンへのリファレンスを保持できます。
string $imageP = `createNode customImagePlane`;
connectAttr -f ($imageP + ".message") "perspShape.imagePlane[0]"
ディペンデンシー ノード stringFormat を生成する
このプラグインは、ユーザ定義のディペンデンシー グラフ ノードのサンプルです。フォーマット文字列と同様に、入力として複数の数字を取ります。出力としてフォーマットされた文字列を生成します。
^[0-9][dft] のすべての発生は、指定したフォーマットを使用して対応する入力パラメータに置き換えられます。
たとえば、文字列「format ^1f ^2d ^0t end format」は配列 {2.3, 3.4, 4.5} を入力として使用して、「format 3.4 4 00:00:02 end format」を生成します。
ディペンデンシー ノード particleAttr を生成する
particleAttrNode は MPxParticleAttributeMapperNode タイプを拡張するサンプル ノードです。パーティクル単位のアトリビュート データをパーティクル シェイプにマッピングするカスタム ノードを定義することができます。
この特定のサンプルでは、次の 2 つの操作が定義されています。
compute2DTexture() は、API レベルで Maya の内部の「arrayMapper」ノードの内部動作を繰り返します。入力テクスチャ ノードとパーティクル単位の U/V 座標入力が与えられて、このノードは指定した座標でテクスチャを評価し、結果を outColorPP または outValuePP アトリビュートにマッピングします。適切なアトリビュート マップ グラフのセットアップ方法の詳細については、compute2DTexture() のメソッドの説明を参照してください。
computeMesh() はユーザ定義操作です。これは「computeNode」アトリビュートがポリゴン メッシュにコネクトされるときにコールされます。パーティクル カウントが与えられると、メッシュのオブジェクト空間の頂点位置がユーザ定義「outPositions」ベクトル型アトリビュートにマッピングされます。この「outPositions」アトリビュートをコネクトすると、パーティクル単位のシェイプの vector 型アトリビュートのいずれかを駆動できます。指定したサンプルでは、パーティクル シェイプの「rampPosition」アトリビュートが駆動されています。詳細については、このサンプルのセットアップ方法に関する computeMesh() メソッドの説明を参照してください。
ディペンデンシー ノード hwManagedTextureShader を生成する
ハードウェア シェーダでテクスチャ キャッシュを効率的に使用する方法を例示します。このサンプルでは、supportsBatching() メソッドが使用されています。
D3DViewportRenderer(Windows のみ)
このプラグインは、ビューポートのレンダラとして Direct3D を使用する方法を例示します。これは Maya シーンでポリゴン サーフェスごとにバウンディング ボックスをレンダーする簡単な例です。
MEL コマンド customSourceFile を生成する
このプラグインは、ユーザ定義の MPxMayaAsciiFilter のサンプルです。ユーザは各種ノード タイプを含むファイルにシーンをセグメント化することができます。ユーザはファイル コマンドで「includeType」および「excludeType」オプションを使用してエクスポートするノード タイプを指定できます。たとえば、以下は renderLayer ノードだけを保存します。
mel: file -rename "myLayerData";
mel: file -type "filteredAsciiFile";
mel: file -save -options ";includeType kRenderLayer;";
さらに、ASCII ファイルに書き込まれる connectAttrs のタイプはエクスポートされるノード タイプによって定義されます。connectAttr のソース ノードが出力されると、connectAttr が書き込まれます。シーンをセグメント化できるだけでなく、このプラグインでは ASCII ファイルが他の ASCII ファイルをソースとするラインを書き込むことができます。このプラグインを使用すると、シーン セグメントを含むさまざまなファイルのすべてにおいて、単一のマスタ ファイル ソースが許可されます。これはファイル コマンド オプションからもコントロールされます。次のコマンドは、上記のサンプルに保存されるレンダー レイヤ セグメントをソースとする方法を例示します。
mel: file -rename "myMasterFile";
mel: file -save -options ";excludeType kRenderLayer; sourceFile myLayerData.faf"
上記の例では、excludeType 引数が使用され、レンダー レイヤ情報は myMasterFile に出力されなくなります。sourceFile オプションは myMasterFile.faf に次の行を出力します。
customSourceFile -fileName "myLayerData.faf";
この行は myMasterFile.faf がロードされるときに解析され、このプラグインに含まれる customSourceFile コマンドが実行されます。これは myLayerData.faf をソースとして、myMasterFile.faf のパスを先頭に付加するだけです。
単純なイメージ ファイル プラグイン。このプラグインはファイル拡張子 .moo の新しいイメージ ファイル フォーマットを登録します。.moo イメージ ファイル をロードすると、0 ~ 1 の範囲外の値を含む、手続き上生成されるカラー スペクトルが生成されます。