Japanese | English | Korean

Samples


プリミティブは、明示的に作成・設定された各ポリゴンの頂点により構成されます。頂点には座標値、色、法線、テクスチャ座標といった属性があり、それらを設定することでポリゴンを作成します。
また、画像を3次元空間中に描画する2次元スプライトというオブジェクトも用意されています。

1. ポリゴンの描画

ここではポリゴンの作成から描画までを解説します。

1.1. 頂点属性の設定

まず、ポリゴンの頂点属性を定義していきます。頂点属性の定義には m3dVertexArray クラスを用います。 m3dVertexArray クラスは頂点属性を表す整数ベクトルの配列になっています。

m3dVertexArray オブジェクトは「頂点数、各頂点が持つ要素数、各要素のサイズ」を指定することで作成されます。m3dVertexArray オブジェクトには、 IMICRO3Dv4es_m3dVertexArray_set_b() メソッドかIMICRO3Dv4es_m3dVertexArray_set_s() メソッドを用いて「配列中における先頭頂点のインデックス、頂点数、頂点属性コピー元の整数配列」といった頂点属性を設定できます。2つのメソッドの違いは、頂点属性を表す配列として hi_sint8 型の配列を取るか hi_sint16 型の配列を取るかにあります。

以下は、サンプルコードで m3dVertexArray クラスオブジェクトを作成し、頂点属性( 座標、法線、色 )を定義している部分です。

hi_sint16 triVert[] = { 0, 10, 0,     -6,    0,  0,       6,   0,  0,        // 上表
   -6,  0,  0,      0, -10,  0,      6,    0,  0,       // 下表
   -6,  0, 0,       6,    0,  0,       0, -10, 0,       // 下裏
};
hi_sint8 triNorm[] = { 0, 0, 127,       0, 0, 127,       0, 0, 127,
    0, 0, 127,       0, 0, 127,       0, 0, 127,
    0, 0, 127,       0, 0, 127,       0, 0, 127,
};
hi_sint8 triColor[] = { 127,     0, 0, 0,      127,     0,     0, 0,        127,     0,     0,  0,
        0, 127, 0, 0,          0,     0, 127, 0,            0, 127,     0,  0,
        0, 127, 0, 0,          0, 127,     0, 0,            0,     0, 127,  0,
};

m3dVertexArray *triVertArray, *triNormArray, *triColorArray;

/* VertexArrayの作成 */
triVertArray  = IMICRO3Dv4es_m3dVertexArray_create ( pMe -> pIM3D, TRI_VERT_NUM, 3, 2, &pMe -> e );
triNormArray = IMICRO3Dv4es_m3dVertexArray_create ( pMe -> pIM3D, TRI_VERT_NUM, 3, 1, &pMe -> e );
triColorArray = IMICRO3Dv4es_m3dVertexArray_create ( pMe -> pIM3D, TRI_VERT_NUM, 4, 1, &pMe -> e );

/* VertexArrayの設定 */
IMICRO3Dv4es_m3dVertexArray_set_s ( pMe -> pIM3D, triVertArray, 0, TRI_VERT_NUM, triVert );
IMICRO3Dv4es_m3dVertexArray_set_b ( pMe -> pIM3D, triNormArray, 0, TRI_VERT_NUM, triNorm );
IMICRO3Dv4es_m3dVertexArray_set_b ( pMe -> pIM3D, triColorArray, 0, TRI_VERT_NUM, triColor );

このとき、頂点座標、法線ベクトル、テクスチャ座標はhi_sint8 型か hi_sint16 型どちらでも設定できますが、色情報は hi_sint8 型により設定しなければなりません。

m3dVertexArray クラスへの作成・設定が終わった後、これらの m3dVertexArray クラスを m3dVertexBuffer クラスに登録します。 m3dVertexBuffer クラスは頂点属性の配列を保持するクラスです。同一の m3dVertexBuffer に対し、頂点属性のうち頂点座標配列、色情報配列、法線ベクトル配列の3種はそれぞれ1つまでしか登録できません。テクスチャ座標配列の登録は、実装がサポートするテクスチャ単位数まで行うことができます。それぞれの頂点属性配列の設定には、IMICRO3Dv4es_m3dVertexBuffer_setPositions()、IMICRO3Dv4es_m3dVertexBuffer_setNormals()、IMICRO3Dv4es_m3dVertexBuffer_setColors()、IMICRO3Dv4es_m3dVertexBuffer_setTexCoords() メソッドを使用します。

/* VertexBufferの作成 */
pmc -> pTriVertexBuffer = IMICRO3Dv4es_m3dVertexBuffer_create ( pMe -> pIM3D );

/* VertexBufferにVertexArrayを設定 */
IMICRO3Dv4es_m3dVertexBuffer_setPositions ( pMe -> pIM3D, pmc -> pTriVertexBuffer, triVertArray, 1.f, NULL );
IMICRO3Dv4es_m3dVertexBuffer_setNormals   ( pMe -> pIM3D, pmc -> pTriVertexBuffer, triNormArray );
IMICRO3Dv4es_m3dVertexBuffer_setColors     ( pMe -> pIM3D, pmc -> pTriVertexBuffer, triColorArray );

なお、頂点座標、テクスチャ座標、法線ベクトルは 4D の同次座標として解釈されます。このとき、頂点座標とテクスチャ座標において4つ目の成分は暗黙的に " 1 " に、法線ベクトルでは " 0 " とされます。これは頂点座標とテクスチャ座標は位置の情報を持った座標として、法線ベクトルは方向の情報を持った座標として解釈されることを意味しています。 2D テクスチャ座標の場合、3つ目の成分は暗黙的に " 0 " とされます。

1.2. 三角形ストリップの設定

ポリゴンの描画は、先ほど作成した頂点属性の配列だけではできません。描画を行うためには、頂点属性から三角形ストリップの配列を定義する必要があります。三角形ストリップ配列は m3dTriangleStripArray クラスにより表されます。

三角形ストリップ配列のインデックスは、明示的、または暗黙的に指定することができます。なお、このインデックスは描画対象となる頂点配列の各頂点に対応するインデックスです。

明示的な指定を行う場合、 m3dTriangleStripArray クラスに指定された頂点配列の先頭3頂点によって最初の三角形が形成されます。次の三角形は前の3頂点のうち先頭を除く、2頂点と新しく追加された1頂点により形成されます。たとえば頂点 ( 0, 1, 2, 3, 4 ) が設定されているときに、ストリップ S = ( 2, 0, 1, 4 ) は頂点 ( 2, 0, 1 ) により形成される三角形と頂点 ( 0, 1, 4 ) により形成される三角形の2つの三角形を形成します。このとき m3dTriangleStripArray クラスのコンストラクタには頂点配列と各ストリップ長を表す配列を設定します。

暗黙的に指定する場合、 m3dTriangleStripArray クラスには最初のストリップの先頭インデックスのみが指定されます。後続の頂点インデックスは前のインデックスに " 1 " を加算して求められます。先頭インデックスが 10 で、ストリップ長が 3 と 4 の場合、次のようなストリップとして解釈されます : S1 = ( 10, 11, 12 ), S2 = ( 13, 14, 15, 16 ) 。このとき m3dTriangleStripArray クラスのコンストラクタには先頭ストリップの先頭頂点が持つインデックスと各ストリップ長を表す配列を設定します。

以下は、サンプルコードで三角形ストリップの配列を定義している部分です。ここでは、インデックスを暗黙的に指定しています。

hi_sint32 triStripLen[] = { 3, 3, 3 };

/* IndexBufferの作成 */
pmc -> pTriIndexBuffer = IMICRO3Dv4es_m3dTriangleStripArray_create_i ( pMe -> pIM3D, 0, triStripLen, 3, &pMe -> e );

1.3. 外観の設定

ポリゴンの外観や材質に関する要素群を設定します。外観の設定には m3dAppearance クラスを使用します。 m3dAppearance オブジェクトを新規に作成するとその要素の初期値はすべて NULL となっています。レンダリングの際に m3dAppearance の要素が NULL であっても問題はありませんが、m3dAppearance ポリゴンに対する m3dAppearance の設定は必須です。 m3dAppearance オブジェクトそのものを null にした場合、ポリゴンのレンダリングは無効となり、描画が行われません。

以下は、サンプルコードで m3dAppearance オブジェクトを設定している部分です。ここでは、 m3dMaterial クラスを使用して光源からの光を反射するように設定しています。また、テクスチャを設定した m3dAppearance も作成しています。

/* Material の作成 */
pmc -> pMaterial = IMICRO3Dv4es_m3dMaterial_create ( pMe -> pIM3D );

/* 頂点のカラートラッキングを設定 */
IMICRO3Dv4es_m3dMaterial_setVertexColorTrackingEnable ( pMe -> pIM3D, pmc -> pMaterial, HI_TRUE );

/* Material に含まれる指定色の成分値を設定 */
IMICRO3Dv4es_m3dMaterial_setColor ( pMe -> pIM3D, pmc -> pMaterial, m3dMaterial_SPECULAR, 0x00ffffff );

/* Material の輝度を設定 */
IMICRO3Dv4es_m3dMaterial_setShininess ( pMe -> pIM3D, pmc -> pMaterial, 100.f );

/* 三角形モデル用Appearanceの作成 */
pmc -> pAppearance = IMICRO3Dv4es_m3dAppearance_create ( pMe -> pIM3D );

/* ライティングを設定 */
IMICRO3Dv4es_m3dAppearance_setMaterial ( pMe -> pIM3D, pmc -> pAppearance, pmc -> pMaterial );

/* 四角形モデル用Appearanceの作成 */
pmc -> pTexAppearance = IMICRO3Dv4es_m3dAppearance_create ( pMe -> pIM3D s);

/* テクスチャ単位に用いる画像と属性を設定 */
IMICRO3Dv4es_m3dAppearance_setTexture ( pMe -> pIM3D, pmc -> pTexAppearance, 0, pmc -> pTexture );

IMICRO3Dv4es_m3dAppearance_setMaterial ( pMe -> pIM3D, pmc -> pTexAppearance, pmc -> pMaterial );

m3dAppearance クラスへの m3dMaterial オブジェクトの登録には、IMICRO3Dv4es_m3dAppearance_setMaterial () メソッドを用います。 また、ポリゴンに対しテクスチャを貼り付ける場合、IMICRO3Dv4es_m3dAppearance_setTexture () を用いて m3dTexture2D オブジェクトを設定します。

1.4. 描画の設定

作成したポリゴンの描画には、IMICRO3Dv4es_m3dGraphics3D_render ( inst, graphics3d, vertex, index, appearance, transform ) を使用します。引数のうち vertex, index, appearance は、上で作成した m3dVertexBuffer, m3dIndexBuffer ( m3dTriangleStripArray ), m3dAppearance の各オブジェクトであり、transform は変換行列を表す m3dTransform オブジェクトです。

以下は、サンプルコードでポリゴンの描画を行っている部分です。

/* 三角形モデルの描画 */
IMICRO3Dv4es_m3dGraphics3D_render ( pMe -> pIM3D,
pmc -> pG3D, pmc -> pTriVertexBuffer, pmc -> pTriIndexBuffer,
pmc -> pAppearance, pmc -> pPrimTrans )

/* 四角形モデルの描画 */
IMICRO3Dv4es_m3dGraphics3D_render ( pMe -> pIM3D,
pmc -> pG3D, pmc -> pSqrVertexBuffer, pmc -> pSqrIndexBuffer,
pmc -> pTexAppearance, pmc -> pPrimTrans )

なお、テクスチャを貼り付けられないポリゴンは、m3dTexture2D が設定された m3dAppearance で描画を行うことはできません。





2. 2次元スプライトの描画

ここでは、2次元スプライトの作成から描画までを解説します。

2次元スプライトとは、前述の通り3次元空間中に配置された画像のことです。常に画面方向を向いて描画されます。
MascotCapsule V4 で2次元スプライトを扱うためには m3dSprite3D クラスを使用します。

2.1. m3dSprite3D オブジェクトの生成

m3dSprite3D オブジェクトの作成には、IMICRO3Dv4es_m3dSprite3D_create ( IMicro3Dv4es inst, scaled, image, appearance, exception ) メソッドを使用します。 scaled は m3dSprite3D オブジェクトの拡大縮小の有効無効、 image は貼り付ける画像、 appearance は2次元スプライトの外観を表します。画像や外観は後から変更可能ですが、拡大縮小の有無については生成時にしか設定できません。

以下は、サンプルコードで m3dSprite3D オブジェクトを作成している部分です。

/* Sprite3Dを作成する */
pmc -> pSprite = IMICRO3Dv4es_m3dSprite3D_create ( pMe -> pIM3D,
HI_TRUE, pmc -> pTexImage, pmc -> pAppearance, &pMe -> e );

2.2. テクスチャ座標の設定

次に、 m3dSprite3D オブジェクトの設定を行います。元画像のトリミング範囲の設定にはIMICRO3Dv4es_m3dSprite3D_setCrop ( inst, sprite, cropX, cropY, width, height ) を使用します。

/* トリミング範囲を指定する */
/* imageがすべて見えるよう設定 */
IMICRO3Dv4es_m3dSprite3D_setCrop ( pMe -> pIM3D, pmc -> pSprite, 0, 0, 256, 256 );

2.3. m3dSprite3D オブジェクトの描画

m3dSprite3Dの描画は、IMICRO3Dv4es_m3dGraphics3D_render_n ( inst, graphics3d, node, transform ) メソッドを用いて行います。

以下は、サンプルコードで m3dSprite3D の描画を行っている部分です。

/* Sprite3Dの描画 */
IMICRO3Dv4es_m3dGraphics3D_render_n ( pMe -> pIM3D, pmc -> pG3D, ( m3dNode* ) pmc -> pSprite, pmc -> pSpriteTrans );



環境光源+表面

直接光源+表面

環境光源+裏面

直接光源+裏面