Japanese | English | Korean

Samples

D4Dデータからの描画

ここではD4Dデータからの3Dグラフィックスの描画について解説します。


目次

1. D4D データ

D4DデータはDoJa 4.0 プロファイルで新しく導入されたファイル形式です。モデルやアニメーションデータなどを1つ以上含んでいます。テクスチャデータを含むこともできますが、別ファイルとして扱うことも可能です。通常はグループデータですが、単体のデータである場合もあります。

D4D データを作成するには、以下のような方法があります。

( 1 ). MBAC、 MTRA からコンバート

MBAC、 MTRA データを D4DEditor に読み込ませると D4D データを作成します。 MBAC、 MTRA は以前のバージョンのものですのでメッシュグループを作りません。単にグループが作られます。

( 2 ). H3T ファイルからコンバート

3D ツールに弊社提供の H3T Exporter プラグインを追加します。この H3T Exporter からは H3T ファイルを出力できますので、これを D4D データに変換します。変換には弊社提供のツール D4D Converter を利用します。各ツールのマニュアルもあわせて参照してください。 H3T から作られた D4D ではメッシュグループとして扱われます。

メッシュグループ、グループについては後述します。



2. Group オブジェクトについて

ここでは Group オブジェクトについて解説します。

Group オブジェクトは1つ以上のオブジェクトから構成される 3D オブジェクトです。 Group オブジェクト内のオブジェクトはインデックス管理されたリスト構造をとっており、 Group オブジェクト内に他の Group オブジェクトを含むことが可能です。ただしその場合、 Group オブジェクトの参照がループするような構造をとることはできません。

Group オブジェクトには通常のグループと、メッシュグループと呼ばれるものが存在します。Group オブジェクトがどちらのグループであるかは、 Object3D.getType() メソッドで調べることができます。
それぞれの特徴は以下のようになります。

通常のグループ ( Object3D.TYPE_GROUP )
  • グループ内のオブジェクトの追加、削除が可能
  • グループ内のオブジェクト間の関係は保持されていない

通常のグループは、管理するオブジェクトをプログラム中で変更することが可能となっており、動的なデータ構造を持つコンテンツに適しています。ただし、 Figure オブジェクトと ActionTable オブジェクトや Texture オブジェクトの関係等、管理するオブジェクト間の関係についてはプログラム中で明示的に示す必要があります。
また、基本となるデータは MascotCapsule V3 以前のデータです。過去のコンテンツからの流用は容易ですが、テクスチャタイリング等の新機能は使用することができません。

メッシュグループ( Object3D.TYPE_MESH_GROUP )
  • グループ内のオブジェクトの追加、削除は禁止
  • グループ内のオブジェクト間の関係が常に保持されている
  • メッシュグループの管理オブジェクトとして、通常のグループを持つことはできない

メッシュグループは作成したデータ構造をプログラム側で変更することができません。
メッシュグループでは管理されているオブジェクト間のデータ構造の関係を内部で保持しているため、通常のグループと比較すると、少ない手間でアニメーションを実現することが可能です。静的なデータ構造を持つコンテンツに適しています。



3. D4D データからの描画

D4Dデータからの描画について解説します。

( 1 ). MBAC 、 MTRA データからコンバートされた D4D データ

[MBAC 、MTRA データからの D4D データによる 3D モデル描画]

// 3D オブジェクトのグループ、フィギュア、アクションテーブル
Group group = null;
Figure fig = null;
ActionTable act = null;

・・・

// 3D オブジェクト個数取得用
int num_obj = 0;

// アニメーションキーフレーム時
int frame = 0;

・・・

// Sample04Canvas.java 60行
// Group オブジェクトの生成
group = ( Group ) Object3D.createInstance(
Connector.openInputStream( "resource:///airplane.d4d" ) );

// Figure オブジェクトの取得
fig = ( Figure )group.getElement( 0 );

// Group オブジェクト中に保持されている 3D オブジェクトの個数を取得
num_obj = group.getNumElements();

// ActionTable オブジェクトの取得
for( int i = 0; i < num_obj; i++ ) {
Object3D obj = group.getElement( i );
if( obj.getType() == Object3D.TYPE_ACTION_TABLE ) {
act = ( ActionTable ) obj;
break;
}
}

・・・

// Sample04Canvas.java 122行
// Graphics3D オブジェクトのアクションテーブルを設定
fig.setAction( act, 0 );

// アニメーションキーフレーム時間の設定
frame = frame < act.getMaxFrame( 0 ) ? frame + act.getMaxFrame( 0 )/ 250 : 0;
fig.setTime( frame );

・・・

MBAC、MTRA データからコンバートされた D4D データによるモデルの描画は、まず Group オブジェクトのインスタンスを取得する必要があります。その後、 Group オブジェクトから Figure オブジェクトや ActionTable オブジェクトを取り出して、MBAC、MTRA データからの描画のときと同様に、それぞれの関連付けを行っていきます。

Group オブジェクト内では 3D オブジェクトはインデックスによって参照が管理されています。 Group オブジェクトから Figure オブジェクト等の 3D オブジェクトを取り出す場合、 getElement() メソッドを使用します。このメソッドにより、 Group オブジェクトが保持している 3D オブジェクトへの参照を取得することができます。

またこのメソッドの戻り値は Object3D クラスですので、それぞれのクラスにキャストする必要があります。このとき選択的に特定の 3D オブジェクトを取得したい場合、 Group オブジェクトから Object3D オブジェクトを取得します。そしてその Object3D オブジェクトを getType() メソッドにより必要とされる 3D オブジェクトであるかを判定し、特定のクラスにキャストして取得することとなります。
このとき描画対象は DrawableObject3D クラスのサブクラスである Group オブジェクトです。


MBAC, MTRA データからコンバートされた D4D データによる描画




( 2 )H3T データからコンバートされた D4D データ

[H3T データからの D4D データによる3Dモデル描画 ( Sample05Canvas.java L.55 - 57, L.102 - 104 )]

// 3D オブジェクトのグループ
Group group = null;

・・・

// アニメーションキーフレーム時間
int frame = 0;

・・・

// Sample05Canvas.java 55行
// Group オブジェクトの生成
group = ( Group ) Object3D.createInstance(
Connector.openInputStream( "resource:///airplane.d4d" ) );

・・・

// Sample05Canvas.java 102行
// アニメーションキーフレーム時間の設定
frame += 250;
group.setTime( frame );

・・・

H3Tデータからコンバートされた D4D データによるモデルの描画は、やはり Group オブジェクトのインスタンスを取得する必要があります。
この D4D データに含まれる Group オブジェクトはメッシュグループですので、直接 ActionTalble オブジェクトを操作することはできません。そのため、 Figure オブジェクトに対してアニメーションを操作したい場合、既に Figure オブジェクトにアニメーションが関連付けられていれば setTime() メソッドを使用して操作を行うことになります。
このときの描画対象もDrawableObject3D クラスのサブクラスである Group オブジェクトです。


H3T データからコンバートされた D4D データによる描画