サンプル
シーングラフからのノードの取得
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,
&pmc -> data_count,
pIDecodInflat,
pURIIstream,
&pMe ->e );
/* データ中のWorldオブジェクトを取得する */
for ( i = 0; i < pmc -> data_count; i ++ ) {
pmc -> pworld = ( m3dGroup* ) IMICRO3Dv4es_m3dObject3D_find ( pMe -> pIM3D,
2. シーングラフから特定のノードを取得する
m3dWorld オブジェクトが表すシーングラフから特定のノードを取得する場合、IMICRO3Dv4es_m3dObject3D_find(inst, object3d, uid) メソッドを使用します。このメソッドは、nodeが配下に持つ全てのノードを検索し、uid と同じユーザIDを持つノードを取得します。ユーザID とはシーングラフ中の各オブジェクトに一つずつ割り当てられる ID のことです。M3GViewerで確認すると、下図のように表示されています。
下記のコードは、上図が表すシーングラフから、ユーザIDが10である m3dAppearance オブジェクトを取得しています。ここでは m3dWorld オブジェクトを引数にすることで、シーングラフ中の全てのノードを探索対象にしています。
[ 特定ノードの取得 ]IMICRO3Dv4es_m3dObject3D_find( pMe -> pIM3D, pmc -> pworld, 10 );


