Maya はオープンで柔軟性があり、拡張可能な製品として設計されています。
Maya の API およびそのコマンド スクリプト言語(MEL と Python)は、オープンで拡張可能なソフトウェアを開発するための重要な要素です。 最初の Maya の設計において、Maya とその C++ API はその拡張性を最大限に高めるため一緒にビルドされました。 この関係を十分に利用するためには、まず Maya のアーキテクチャを理解しなければなりません。
最も基本的なことは、Maya がグラフィック情報を格納するための非常に効率的なデータベースであるということです。 このデータベースはディペンデンシー グラフ(DG)と呼ばれています。 DG 内の情報はノードと呼ばれるオブジェクトに格納されます。 ノードには各ノードの設定可能な特性を格納するアトリビュートと呼ばれるプロパティがあります。 タイプが似ているアトリビュートを接続して、アトリビュート間でデータをやりとりすることができます。
たとえば、nurbsCurve ノードには NURBS カーブを含むアトリビュートがあります。 このアトリビュートは、回転ノードの入力カーブ アトリビュートに接続することができます。 回転ノードにはさらにスイープ角度、および回転軸について記述する入力アトリビュートがあります。 回転ノードの出力アトリビュートは NURBS サーフェスです。 サーフェスを描画する nurbsSurface ノードの入力にこのアトリビュートを接続することができます。 その後、nurbsSurface ノードを、オブジェクトを 3D 空間に配置するトランスフォーム ノードの子にすることができます。
実際、このデータ フローはコンストラクション ヒストリを実装するためのメカニズムです。 回転サーフェスのコンストラクションに関与するノードへの入力の 1 つを変更した場合、DG は、履歴の中で影響を受ける部分のみを再計算してサーフェスを更新します。 DG は、何が何に影響を与えるのかについて明確な記録を保持し、必要な場合のみグラフを再計算します。
Maya システムには、600 を超えるビルトイン ノードが含まれています。 Maya ヘルプには、これらのノードとそのアトリビュートについて記述した『ノード & アトリビュート リファレンス(英語) 』と呼ばれるマニュアルが付属しています。
直接 DG レベルで作業することにより柔軟性とパワーを最大限に引き出すことができますが、制限もあります。 Maya には 900 を超えるコマンドが用意されているので、これらを使用すれば直接このレベルで作業する必要はありません。 これらのコマンドは DG ノードを作成し、それらのアトリビュートを設定および接続し、オブジェクトを配置するトランスフォーム ノードを作成します。 たとえば、回転コマンドは引数としてスイープ角度と軸を取り、選択された NURBS カーブから上述の回転ネットワークを構築します。 このコマンドはすべての低レベル詳細を扱います。 Maya ヘルプには、すべての Maya ビルトイン コマンドとその引数について記述した『MEL コマンド リファレンス』と呼ばれるマニュアルが付属しています。
Maya コマンドのうち約 200 は UI 作成コマンドで、ウィンドウ、メニュー、ボタン、アイコンなどの構築に使用されます。 Maya には、その UI を構築するために使用する膨大なスクリプトが含まれています。 回転ノードおよび回転コマンドに加えて、UI シェルフには、回転(Revolve)と呼ばれるメニュー項目および回転アイコンがあります。 メニュー項目またはアイコンは、DG ネットワークを作成するコマンドを実行します。 スクリプティングは、Maya の U Iの約 98 % を実装するのに使用されます。
ハイ レベル(たとえばテクニカル ディレクタ向け)では、Maya は高度にカスタマイズ可能な環境を提供します。 MEL と Python は、アーティストのツール パレットを拡張するために使用することができる非常に強力なスクリプト言語です。 両方とも非常に強力な UI 作成言語です。 たとえば、シーン内でアニメートされた各キャラクタのための特定の UI を作成することで、生産性を大きく向上させることができます。
最後に、記述したいスクリプトに必要な Maya コマンドが存在しない場合、あるいは、特性の特定のセットを備えたノードが存在すれば記述するスクリプトがより簡単になる場合は、API を使用してそのようなコマンドやノードを追加することができます。
Maya の API は Maya の基本となるアーキテクチャを正確に反映したものです。したがってデータがどのように処理されるかを管理するシーン グラフおよび DG は、Maya API を通じて、その基本となる実装に一致した方法で扱うことができます。
Maya API は、ランタイムに Maya にロードすることのできるプラグイン共有オブジェクトを記述するために開発者が使用する C++ インタフェースです。 必要でない場合、プラグインをアンロードすることができます。 その結果、コンパイル、ロード、テスト、アンロード、ソースコード変更、再コンパイル、再ロードによって効率的にプラグインを開発することができます。 Maya の Python API を使用して実装されたプラグインについても同じ処理を実行することができます。
Maya 向けに開発されたプラグイン(C++ でコーディング)は、Linux® および Windows オペレーティング システムの標準デバッグ環境と連動します。 Linux の場合、-d フラグを使用して Maya を起動すると、デバッガの制御機能が有効になります。 また、他の Unix® アプリケーションと同様に、プラグイン内でブレークポイントを設定し、スタック トレースを取得することができます。 Windows の場合、Microsoft ® Visual Studio ® 開発システムから Maya を直接起動し、他の Windows アプリケーションと同様にプラグインをデバッグすることができます。
Maya の API は、Maya の機能の重要な部分へのアクセスを提供します。 これには、ジオメトリ、トランスフォーム、階層、シーン グラフ、および DG ノードなどの既存データを問い合わせて変更する機能などが含まれます(ただしこれらに限定されない)。 また、これらの API によって、レンダラで使用可能なシェーダ タイプなどの新しいオブジェクトを作成することができ、また、OpenGL ® 内で描画することができます。 OpenMaya API にはまた、シェイプのハードウェア レンダーされた概観をカスタマイズするためのクラスが含まれており、アーティストが自分の作業をリアルタイム環境で確認できるようなツールを開発することができます。 プラグイン機能はスクリプト言語コマンドを使用して、いつでも追加または削除することができます。 プラグインは Maya の 2 つの動作モード、すなわちインタラクティブ モードまたはバッチ モードのいずれかで動作することができます。 Maya API は、個別のスタンドアローン アプリケーションを記述する場合はスタンドアローンの形式で使用します。 これらのアプリケーションは Maya の ASCII およびバイナリ シーン ファイルを読み書きし、ファイルに含まれるデータに対する操作を実行することができます。
前のセクションで説明したとおり、通常は、API の 1 つを使用して Maya に新しいコマンドまたはノード(あるいは両方)を追加し、続いて新しい機能に対する UI を提供するスクリプトを作成します。 たとえば、API の 1 つを使用して新しいタイプのノードを作成します。次にノードのインスタンスを作成し、それをシーンに配置し、適切なノードに接続する新しいコマンドを書くことができます。 最後に、コマンドをメニューに挿入する MEL または Python スクリプトを記述し、メニューからコマンドにアクセスすることができます。
Maya API および Maya Python API はどのプラットフォームでも使用できるように設計されています。 ほとんどの場合、Linux、Windows、または Mac OS X の間でプラグインを「移植」する際にコードを書き換える必要はありません。通常、プラットフォーム固有のコードが必要となるのは、ウィンドウの作成または操作の際にスクリプティングのプラットフォーム独立 UI 作成機能を使用しない場合、あるいは、プラットフォーム固有のサードパーティ ライブラリを使用する場合です。
Maya API と Maya Python API は、両方ともソースコード互換性を提供します。 したがって、以前の Maya のリリースのために書かれた C++ プラグインは、Maya の現在のバージョンでもソース コードを変更せずに再コンパイルすることができます。 ソース コード互換性が維持されていれば、既存の Python プラグインを、ソース コードの変更をせずにそのまま読み込んで正しく実行できるはずです。 ソース コードの非互換性が発生した場合は、新しいリリースのマニュアルには、プラグインに対してどのような変更が必要かについての詳しい説明が含まれます。
Maya の API は、オブジェクトおよび関数セットを使用して Maya の内部オブジェクトにアクセスします。 オブジェクトは RTTI (実行時型識別)を提供する非常に軽量のクラスで、型を指定せずに使用することができます。 関数セットは、ユーザが所有する構造で、Maya の所有するオブジェクト上での操作を可能にします。 オブジェクトは単にその型を認識するハンドルなので、関数セットは、正しい型のオブジェクト上で動作するツールを提供します。 これらの機能セットは通常、MFnSkinCluster および MFnNurbsSurface のように Maya の機能と一致する名前を持っています。 たとえば、MFnSkinCluster クラスは、型 kSkinCluster のオブジェクトでインスタンス化し、そのオブジェクトに対する動作を実行するために使用することができます。 オブジェクト自体は、その関数セットが動作しない限り関数を実行することはできません。
プロキシを使用すると、新しいタイプのオブジェクトを開発することができます。 プロキシ オブジェクト クラスを使用すると、Maya に第一級オブジェクトとして統合される機能を作成することができます。 プロキシの例としては、コマンド、ファイル トランスレータおよび新しいタイプのシェーダなどがあります。
Maya の API は非常に柔軟です。 この柔軟性により、ある特定のタスクを様々な方法で実現することができ、また、開発のスピードとプラグインのパフォーマンスの間のトレードオフをどこに設定するかを判断することができます。 どちらの API でも、プラグインのパフォーマンスが重要でない場合、特定の問題に対するソリューションを迅速にプロトタイピングすることが可能です。 パフォーマンスが重要である場合は、C++ Maya API を使用します。