MDt ライブラリを使用する
 
 
 

MDtApi は Maya API を使用する 1 つの方法にすぎません。MDtApi は、Maya からシーン情報を取得するための唯一の方法というわけではありません。MDtApi は、Maya API 関数と MEL コマンドの実行を組み合わせてデータにアクセスする方法です。

MDtApi は Maya API に代替されるものではありません。さまざまなユーザにとって必要な共通の関数をまとめたものと考えることができます。たとえば、すべてのシェーダ(Shader)アトリビュートがデータベースにキャッシュされるわけではありません。静的で繰り返し使用されることが検出されたアトリビュートのみがキャッシュされます。しかし、この API は、オリジナルの Maya オブジェクトを参照して、必要な追加データを取得することができます。したがって、MDtApi は共通ルーチンの上位にあるグルーピング関数と考えることができます。

内部データベースを生成し、次にそのデータを使用してトランスレータを実行するという、2 段階のプロセスが一般的です。DAG ツリーをスキャンして内部データベースを生成するには多少時間がかかります。その場合は、Maya API を直接使用する、より高速なトランスレータを書くことができます。VRML2 やほかの MDt ベースのトランスレータに使用されているアプローチは、各トランスレータに対して同じことを繰り返すという作業負荷を軽減し、既存のトランスレータで可な関数を再利用するというものです。

VRML2、RTG、GE2 ゲーム トランスレータは、「ファイル トランスレータ」として実装されています。これらは通常の Maya MPxCommand プラグインとしても実装可能です。

内部データベースの構造

DAG ツリーをスキャンして生成される内部データベースは、ファイル トランスレータのオプション ボックスでユーザが設定するオプションで制御することができます。

内部データベースは、次の情報を収集して生成されます。

Shape、Group、Material、Texture、Light、Camera

Controls(コントロール)

Controls オプションについては、MDtApI を使用して実行する各ゲーム トランスレータのセクションで説明しています。

これらのオプションはかなりフレキシブルに設定することができます。また、ソース コードも提供されているため、別のオプションを追加してローカルにカスタマイズすることもできます。

このオプションはファイル MDtLayer.cpp とヘッダ ファイル MDtExt.h に実装されます。ソース コードにさらにコントロール フラグを追加することも、MEL オプション スクリプトを修正して、オプションを設定/リセットすることもできます。

さらに、各オプションに対して特定の関数を持たせた MDt ファイルを変更したり、トランスレータのオプションの MEL スクリプトファイルを変更してオプションの値をトランスレータ自体に渡すこともできます。

Shapes(シェイプ)

Shape は、基本的なトランスフォーム、ジョイント、ポリゴン/NURBS オブジェクトに関する情報です。各 Shape にはそれぞれ関連するパラメータがあります。

また、各 Shape にはそれぞれ関連する Groups リストがあります。Shape が純粋なトランスフォーム ノードまたはジョイント ノードの場合、Groups 数は 0 になります(シェーダが割り当てられていません)。これは通常、階層を FULL に設定した場合や、すべてのトランスフォームがフラットに行われている場合、あるいはジオメトリがすべての Shape に関連付けられている場合に起こります。

Shape インデックスを使用して動作する API 関数には、次のようなものがあります。

一般に、ByGroup ではなく ByShape ベースの関数を使用してジオメトリ情報を取得した方が処理が速くなります。ただし、コール側に渡される二次コピーは生成されません。

Shape 関数は、MDtShape.cpp ファイルにあります。

Groups(グループ)

Group は Shape を構成するサブセットで、Shape に割り当てられた複数のシェーダによって定義されます。NURBS オブジェクトでは、最大でも 1 つの Group しかありません。ポリゴン オブジェクトでは、割り当てられた各シェーダに対して 1 つの Group があります。ポリゴン オブジェクトにシェーダが割り当てられていなければ、Group 数は 0 になります。この場合、ほとんどが何らかのトランスフォーム ノードです。

ByGroup 関数は、リストを生成して返す際にメモリを割り当てることが必要です。API 関数はメモリが解放されたことを認識しないため、リストが返されたらユーザが解放しなければなりません。

これらの関数は MDtShape.cpp ファイルにあります。

Materials(マテリアル)

Material は、DAG ツリーをスキャンして検出されたシェーダです。

検出された各シェーダについてリファレンスが作成され、name または ID 番号のいずれかでアクセスできます。このリファレンスを使用して、Maya API を直接呼び出し、目的のシェーダのパラメータを取得することができます。

これらの関数は MDtMaterial.cpp ファイルにあります。

Textures(テクスチャ)

Texture はシェーダにマップされたテクスチャです。デフォルトでは、カラー テクスチャと透明テクスチャだけが評価されて、RGBA 複合ファイル イメージがメモリに作成されます。さらに処理を行って、シェーダにマップされたすべてまたはほとんどのテクスチャを出力することもできます。これは、MultiTexture オプションの一部です。

これらの関数は MDtMaterial.cpp ファイルにあります。

Lights(ライト)

ライトの情報を収集して使用することができます。Material と同様、リファレンスが一時的に記憶され、目的のライトのパラメータにアクセスすることができます。

これらの関数は MDtLights.cpp ファイルにあります。

Camera(カメラ)

カメラの情報を収集して使用することができます。Material と同様、リファレンスが一時的に記憶され、目的のカメラのパラメータにアクセスすることができます。

これらの関数は MDtCamera.cpp ファイルにあります。

Utility(ユーティリティ)

マトリックスの分解やほかの一般的な機能を提供するユーティリティ関数も用意されています。これらの関数は、DAG ツリーのスキャンを制御するオプションと一緒に MDtLayer.cpp ファイルにあります。

Animation(アニメーション)

MDt 関数からアニメーション データを取得する方法は、アニメーション以外のデータを取得する方法とまったく同じです。

DAG ツリーをスキャンして内部データベースが作成されると、リファレンスが保存され、これを使用して必要なジオメトリやマテリアルの情報を取得することができます。

カレント フレーム タイムを設定する DtFrameSet(frame) コールを使用してアニメーション レンジにわたりこの操作を繰り返すと、ディペンデンシー グラフが自動的に更新されます。

各フレームについて、DtFrameSet コールが必要なパラメータを更新します。現在のところ、同じファンクション コールを再利用して次のフレームのジオメトリ データが取得できるように、そのほとんどはジオメトリ(頂点、法線、UV)が対象です。

トランスフォーム データはトランスフォーム オブジェクトを参照して取得されます。ただし、トランスフォーム データはキャッシュされません。

アニメーション レンジに対する、この繰り返し操作の回数は最小限に抑えることをお勧めします。次にその例を示します。

for ( animation = start, to end )
	for ( shape = 0, to last Shape )
		get and save TRS data for shape
	next shape
next frame