サンプル

シーングラフからのノードの取得

ここでは、シーングラフからのノードの取得方法について解説します。

目次




1. オブジェクトの配列から特定のオブジェクトを取得する

オブジェクトの配列から特定のオブジェクトを取得する作業は、M3Gファイルを読み込んでm3dWorld オブジェクトを取得する場合などによく行われます。
M3G ファイルからデータを取得する場合、IMICRO3Dv4es_m3dLoader_loadByteArray() メソッドや IMICRO3Dv4es_m3dLoader_loadURI() メソッドを使用します。これらのメソッドは、データを m3dObject3D クラスの配列として取得します。

下図のような構造のM3Gファイルの場合、m3dCompositingMode オブジェクト、 m3dPolygonMode オブジェクト、 m3dWorld オブジェクトの3つが格納された配列が取得されます。この中から m3dWorld オブジェクトを取得するには、配列からそれを見つける必要があります。

シーングラフからのノードの取得:オブジェクトの配列から特定のオブジェクトを取得

下記のコードはM3G ファイルを読み込み、 m3dWorld オブジェクトを取得しています。ここでは IMICRO3Dv4es_m3dObject3D_getClassID() メソッドを使用して読み込んだ各オブジェクトのクラスIDを順番に調べることで、m3dWorld クラスのクラスIDを持つオブジェクトを検索しています。

/* シーングラフデータを読み込む */
pmc -> ppData = IMICRO3Dv4es_m3dLoader_loadURI( pMe -> pIM3D,
         "\\res\\cap.m3g",
         &pmc -> data_count,
         pIDecodInflat,
         pURIIstream,
         &pMe ->e );

/* データ中のWorldオブジェクトを取得する */
for ( i = 0; i < pmc -> data_count; i ++ ) {
if ( IMICRO3Dv4es_m3dObject3D_getClassID( pMe -> pIM3D,
( m3dObject3D* ) pmc -> ppData[ i ] ) == m3dObject3D_World ){
pmc -> pworld = ( m3dGroup* ) IMICRO3Dv4es_m3dObject3D_find ( pMe -> pIM3D,
( m3dObject3D* ) pmc -> ppData [ i ] , 3 );
break;
}
}


2. シーングラフから特定のノードを取得する

m3dWorld オブジェクトが表すシーングラフから特定のノードを取得する場合、IMICRO3Dv4es_m3dObject3D_find(inst, object3d, uid) メソッドを使用します。このメソッドは、nodeが配下に持つ全てのノードを検索し、uid と同じユーザIDを持つノードを取得します。ユーザID とはシーングラフ中の各オブジェクトに一つずつ割り当てられる ID のことです。M3GViewerで確認すると、下図のように表示されています。

シーングラフからのノードの取得:シーングラフから特定のノードを取得する



下記のコードは、上図が表すシーングラフから、ユーザIDが10である m3dAppearance オブジェクトを取得しています。ここでは m3dWorld オブジェクトを引数にすることで、シーングラフ中の全てのノードを探索対象にしています。

  [ 特定ノードの取得 ]
/* Appearance の取得 */
IMICRO3Dv4es_m3dObject3D_find( pMe -> pIM3D, pmc -> pworld, 10 );


このページの先頭へ戻る