3Dグラフィックスの描画(リテインモード)
ここでは MascotCapsule V4 を用いて 3D グラフィックスを描画するための基本的な手順について解説します。
目次
MascotCapsule V4 が扱う M3G データは、シーングラフと呼ばれるツリー構造を持っています。
シーングラフは、3D 空間に配置される各オブジェクトをツリー構造にまとめたもので、ルートノードとして m3dWorld オブジェクトを持ちます。 m3dWorld を描画することで、シーングラフに含まれる全てのオブジェクトを描画することができます。これをリテインモード描画と呼びます。
3Dグラフィックスの描画手順
ここではM3Gデータからシーングラフを読み込み、取得したワールドを描画する手順について解説します。
1. データの読み込みとワールドの取得
まず、シーングラフのデータを持つM3Gファイルを読み込みます。データの読み込みにはIMICRO3Dv4es_m3dLoader_loadURI() メソッドを使用します。このメソッドはM3Gデータが持つシーングラフを配列として読み込みます。
pURIIstream = IMICRO3Dv4es_URIIstream_create( pMe -> pIM3D, &pMe -> applet );
pIDecodInflat = IMICRO3Dv4es_IDecodInflat_create( pMe -> pIM3D );
/* シーングラフデータを読み込む */
pmc -> ppData = IMICRO3Dv4es_m3dLoader_loadURI( pMe -> pIM3D,
&pmc -> data_count,
pIDecodInflat,
pURIIstream,
&pMe -> e
データを読み込めたら、ここからm3dWorldクラスのオブジェクトを取得します。
for ( i = 0; i < pmc -> data_count; i ++ ) {
pmc -> pWorld = ( m3dWorld* ) pmc -> ppData [ i ] ;
break;
IMICRO3Dv4es_m3dObject3D_getClassID(inst, object) は object のクラスIDを返すメソッドです。m3dObject3D_World は m3dWorld クラスのクラスIDを表します。これを用いてM3Gから読み込んだデータ配列から、m3dWorld クラスのオブジェクトを見つけます。
2. アニメーションの設定
モデルデータにアニメーションが設定されている場合、アニメーションの再生を行うことが可能です。 アニメーションは IMICRO3Dv4es_m3dObject3D_animate() メソッドでモデルに現在時刻を設定することで行います。設定は子ノードにも受け継がれるため、m3dWorldオブジェクトに時刻を設定すればシーングラフ中の全てのモデルをアニメーションすることができます。
pMe -> g_total_time += ( ISHELL_GetUpTimeMS ( po ) - pMe -> g_sus_time ) - pMe -> g_old_time;
pMe -> g_sus_time = 0;
pMe -> g_old_time = ISHELL_GetUpTimeMS ( po );
( 中略 )
/* アニメーション処理 */
IMICRO3Dv4es_m3dObject3D_animate ( pMe -> pIM3D, ( m3dObject3D* ) pmc -> pWorld, pMe -> total_time, &pMe -> e );
3.シーングラフの描画
MascotCapsule V4 における描画は、3D描画用のグラフィックスコンテキスト(m3dGraphics3D)に対する操作として実行します。
具体的には以下の処理を行うことで描画が行われます。
- レンダリングターゲットと結合する
- レンダリングを実行する
- レンダリングターゲットを解放する
レンダリングターゲットとは3D描画が可能なオブジェクトのことです。
以下は、サンプルコードで m3dGraphics3D クラスのオブジェクトを作成し、先ほど取得したシーングラフを描画しているところです。
pmc -> pG3D = IMICRO3Dv4es_m3dGraphics3D_create( pMe -> pIM3D,
( 中略 )
/* レンダリングターゲットと結合 */
IMICRO3Dv4es_m3dGraphics3D_bindTarget_g( pMe -> pIM3D,
pMe -> cyScreen, pMe -> cxScreen, pMe -> cyScreen, 1, 0 );
/* World描画 */
if ( m3d_NoException != IMICRO3Dv4es_m3dGraphics3D_render_w( pMe -> pIM3D,
/* レンダリングターゲットを開放 */
IMICRO3Dv4es_mcext_ReleaseTarget( pMe -> pIM3D, pmc -> pG3D );

描画結果

