Japanese | English | Korean

Samples

3Dグラフィックスの描画(リテインモード)

ここでは M3G を用いて 3D グラフィックスを描画するための基本的な手順について解説します。


目次



M3G データはシーングラフと呼ばれる木構造を持ちます。この構造は複数の構成要素をまとめて取り扱うことができ、その頂点として World クラスが定義されています。 World クラスが表すワールドを描画することで、木構造中のすべてのオブジェクトを描画することができます。ここでは M3G データから得られたワールド(カメラの設定を含む)を直接描画します。

3Dグラフィックスの描画手順

ここではサンプルを用いて3Dグラフィックスをリテインモードにて描画する基本的な手順について解説します。

1.データの読み込み

まず 3Dモデルデータを作成するために、 M3G データを読み込みます。

/**
  * private Object3D [] roots = null;
  * private World myWorld;
  *
  */

/* データロード */
try {
loadData ();
} catch ( Exception e ) {
e.printStackTrace ();
}

( 中略 )

/**
  * loadData () メソッド
  * データのロード
  */
private void loadData () {

/* リソースからのデータ取得 */
try {
roots = Loader.load( "/airplane.m3g" );
} catch ( IOException e ) {
e.printStackTrace ();
}

/* Object3D クラスの配列から World オブジェクトを取得 */
if ( roots [ 1 ] .getUserID () == 69 )
myWorld = ( World ) roots [ 1 ] ;

}

各種データの読み込みには、Loader クラスの load() メソッドを使います。読み込んだデータは Object3D 型の配列ですので、配列の要素を取り出し各クラスにキャストして扱います。
なお、 M3G データのシーングラフに含まれるオブジェクトにはすべて ID が付与されています。この ID は弊社が配布しているM3GViewer で確認することができます。

2. アニメーションの設定

モデルデータにアニメーションが設定されている場合、アニメーションの再生を行うことが可能です。 KeyframeSequence クラスの getDuration() メソッドによりアニメーションの最大フレーム値が取得できます。アニメーションの時刻設定は Object3D クラスおよびそのサブクラスのanimate() メソッドにより行われます。

/* アニメーション用 */
private KeyframeSequence myKeyframe = null;

/* パラメタ */
private int maxTime = 0;         // アニメーションの最大フレーム数
private int currentTime = 0;   // モデルの描画フレーム

( 中略 )

/* World オブジェクトから KeyframeSequence オブジェクトを取得 */
myKeyframe = ( KeyframeSequence ) myWorld.find ( 1 );
/* 最大フレーム値を取得 */
maxTime = myKeyframe.getDuration ();

( 中略 )

/* 現在時刻設定 */
myWorld.animate( currentTime );

( 中略 )

/* アニメーション設定 */
currentTime += 50;
if ( currentTime >= maxTime )
currentTime -= maxTime;

このサンプルでは1回のループで 50msec 分のアニメーションが更新されます。
なお、 Object3D クラスおよびそのサブクラスの find () メソッドはシーングラフ内で該当する UserID を持つオブジェクトを返すメソッドです。

3. Graphics3D オブジェクトの設定

今まで設定してきたシーングラフを Graphics3D オブジェクトにレンダリングします。
まず Graphics3D クラスの getInstance() メソッドを用いて Graphics3D クラスのインスタンスを取得します。次に Graphics オブジェクトを Graphics3D オブジェクトにレンダリング対象として束縛します。このとき、 Graphics3D クラスの bindTarget() メソッドを使用します。 Graphics オブジェクトの束縛後、 render() メソッドによってシーングラフを Graphics3D オブジェクトにレンダリングします。レンダリング後は releaseTarget() メソッドを用いて Graphics クラスを解放します。

// Graphics g;

/* グラフィックスクラス */
private Graphics3D g3d;

( 中略 )

/* グラフィックスクラスの取得 */
g3d = Graphics3D.getInstance ();

( 中略 )

/* 描画処理 */
try {
g3d.bindTarget ( g );
g3d.render ( myWorld );
g3d.releaseTarget ();
} catch ( Throwable h ) {
h.printStackTrace ();
}
this.flushGraphics ();

4. ディスプレイに描画

オブジェクトをレンダリングするだけではディスプレイには何も描画されません。ディスプレイにモデルを描画するには、GameCanvas クラスの flushGraphics () メソッドを使用します。

this.flushGraphics ();

flushGraphics () メソッドを使用することで、レンダリングバッファに蓄積された結果がすべて描画されます。このメソッドの使用後はレンダリング用バッファの中身は空になります。



描画結果