Japanese | English | Korean

Samples


描画できるプリミティブは以下のものがあります。

プリミティブ 説明
1ピクセルで描画される点
プリミティブ単位で色を指定できる
ブレンド処理方法(ブレンドなし、半透明、加算、減算)を属性として選択できる
ライン 2点を直線で結んだ幅 1ピクセルのライン
プリミティブ単位で色を指定できる
ブレンド処理方法を属性として選択できる
三角ポリゴン 3点を指定することで描画される三角ポリゴン
  • カラーポリゴン又はテクスチャポリゴン
  • 頂点単位の法線又はプリミティブ単位の法線
  • ブレンド処理方法
  • 光源処理の有無
  • スフィアマップの有無
といったポリゴン属性を選択できる
四角ポリゴン 4点を指定することで描画される四角ポリゴン
選択できるポリゴン属性は三角ポリゴンと同様
ポイントスプライト 表示座標を指定し、常に視点方向を向いた四角ポリゴンを描画する
ブレンド処理方法を指定できる
 
SamplePrimitive3D 実行画面 ( 左画像 : 表面,右画像 : 裏面 )



1. 各種プリミティブ

ここでは MascotCapsule V3 で描画できるプリミティブについて説明します。

1.1. 点

3次元座標を指定して点を描画します。描画される点はスクリーンの設定によらず、1ピクセルで表現されます。
点を描画する際には、以下のパラメータが必要です。

  • 点を描画する3次元座標(モデル座標系)
  • 点の色
  • 点の属性とデータタイプ

1.2. ライン

3次元座標で示される2点間を結ぶラインを描画します。描画されるラインの幅はスクリーンの設定によらず、1ピクセルで表現されます。
ラインを描画する際には、以下のパラメータが必要です。

  • ラインの両端の3次元座標(モデル座標系)
  • ラインの色
  • ラインの属性とデータタイプ

1.3. 三角ポリゴン

3次元座標で示される 3点で構成される三角ポリゴンを描画します。三角ポリゴンにはテクスチャを貼り付けるテクスチャポリゴンと、色を指定し、単色で描画されるカラーポリゴンがあります。
三角ポリゴンを描画する際には、以下のパラメータが必要です。

  • 三角ポリゴンを構成する 3点の3次元座標(モデル座標系)
  • 三角ポリゴンの法線
  • 三角ポリゴンに貼り付けるテクスチャ座標(テクスチャポリゴンの場合)
  • 三角ポリゴンの色(カラーポリゴンの場合)
  • 三角ポリゴンの属性とデータタイプ

1.4. 四角ポリゴン

3次元座標で示される 4点で構成される四角ポリゴンを描画します。三角ポリゴン同様、四角ポリゴンもテクスチャポリゴンとカラーポリゴンがあります。
四角ポリゴンを描画する際には、以下のパラメータが必要です。

  • 四角ポリゴンを構成する 4点の3次元座標(モデル座標系)
  • 四角ポリゴンの法線
  • 四角ポリゴンに貼り付けるテクスチャ座標(テクスチャポリゴンの場合)
  • 四角ポリゴンの色(カラーポリゴンの場合)
  • 四角ポリゴンの属性とデータタイプ

1.5. ポイントスプライト

3次元座標で示される 1点を中心とした、視点に対し常に正面を向く四角ポリゴンを描画します。
ポイントスプライトを描画する際には、以下のパラメータが必要です。

  • ポイントスプライトの表示位置を示す 1つの3次元座標(モデル座標系)
  • ポイントスプライトに貼り付けるテクスチャ座標
  • ポイントスプライトのサイズとアングル
  • ポイントスプライトの表示フラグ
  • ポイントスプライトの属性とデータタイプ

なお、MascotCapsule V3 におけるポイントスプライトは、表示の際、以下のフラグを指定して表示方法を決定します。

フラグ 説明
M3DPSF_LOCAL_SIZE モデル座標系におけるサイズを指定します
M3DPSF_PIXEL_SIZE スクリーン座標系におけるサイズを指定します
M3DPSF_PERSPECTIVE 透視投影においてパースを有効にします
M3DPSF_NO_PERS 透視投影においてパースを無効にします

これらのフラグを論理和で表示方式として指定します。
ただし、M3DPSF_LOCAL_SIZE と M3DPSF_PIXEL_SIZE 、および M3DPSF_PERSPECTIVE と M3DPSF_NO_PERS はそれぞれ排他的な関係にあります。




2. プリミティブ描画

IMICRO3D_Render_drawPrimitive()を使用することにより、複数のプリミティブを一括して描画登録することが可能です。描画登録後、IMICRO3D_Render_flush() を呼び出すことにより、実際の描画が行われます。なおこのとき、一度に登録できるのは同じ属性を持つ、同じプリミティブのみです。異なるプリミティブ、あるいは同じプリミティブでも異なる属性を持つ場合には別々に描画登録を行う必要があります。

(例) 同じプリミティブで異なる属性を持つ場合
        法線をプリミティブ単位で持つ三角ポリゴンと頂点単位で持つ三角ポリゴン等


IMICRO3D_Render_drawPrimitive() は引数として以下のものを指定する必要があります。

  • 描画位置の座標
  • プリミティブの種類と属性、データタイプ
  • プリミティブの数
  • プリミティブを描画する際に使用する頂点配列
  • プリミティブを描画する際に使用する法線配列
  • プリミティブを描画する際に使用するテクスチャ位置情報配列
  • プリミティブを描画する際に使用する色情報配列

また、テクスチャを用いる場合には Texture オブジェクトを指定する必要があります。

以下に各引数の説明を行います。

2.1. プリミティブの種類、属性、データタイプ、数の指定

IMICRO3D_Render_drawPrimitive() の第三引数でこれらの情報を指定します。

プリミティブの種類|プリミティブの属性 | プリミティブのデータタイプ | (プリミティブの数 << 16)

というように各項目の論理和を指定します。
属性、およびデータタイプは必要なものを連記することができます。


プリミティブの種類は以下の宣言から指定します。

プリミティブ 宣言
M3DP_POINTS
ライン M3DP_LINES
三角ポリゴン M3DP_TRIANGLES
四角ポリゴン M3DP_QUADS
ポイントスプライト M3DP_POINT_SPRITES

プリミティブの指定は一回の描画登録につき、必ず一種類だけです。



属性に関しては以下の宣言から指定します。

宣言 説明
M3DP_LIGHTING プリミティブは光源処理の対象となります
点、ライン、ポイントスプライトでは無効です
M3DP_SPHERE_MAP プリミティブはスフィアマップ処理の対象となります
点、ライン、ポイントスプライトでは無効です
M3DP_COLORKEY プリミティブはカラーキーによる透過処理の対象となります
点、ラインでは無効です
M3DP_BLEND_NORM ブレンド処理を行いません
M3DP_BLEND_HALF 半透明処理を行います
M3DP_BLEND_ADD 加算処理を行います
M3DP_BLEND_SUB 減算処理を行います

属性の設定は必要なものを論理和で追加してください。
ただし、プリミティブによっては受け付けない属性もあります。
また、光源、スフィアマップ、カラーキー、ブレンド処理等については、下記BREW for KDDI - MascotCapsule V3 用サンプルも合わせてご覧ください。

データタイプに関しては以下の宣言から指定します。

宣言 説明
M3DPD_NORAML_PER_FACE プリミティブ単位で法線を持ちます
点、ライン、ポイントスプライトでは無効です
M3DPD_NORMAL_PER_VERTEX 頂点単位で法線を持ちます
点、ライン、ポイントスプライトでは無効です
M3DPD_COLOR_PER_FACE プリミティブ単位で色情報を持ちます
ポイントスプライトでは無効です
点、ラインでは必ず指定してください
M3DPD_TEXCOORD テクスチャ位置情報を持ちます
点、ラインでは無効です
M3DPD_TEXCOORD_AND_PS_PARAMS_PER_FACE ポイントスプライトのテクスチャ位置情報を持ちます
ポイントスプライトでのみ有効です
ポイントスプライトではこれかM3DPD_TEXCOORD_AND_PS_PARAMS_PER_VERTEX を必ず指定してください
M3DPD_TEXCOORD_AND_PS_PARAMS_PER_VERTEX ポイントスプライトのテクスチャ位置情報を持ちます
ポイントスプライトでのみ有効です
ポイントスプライトではこれか M3DPD_TEXCOORD_AND_PS_PARAMS_PER_FACE を必ず指定してください
M3DPD_NORMAL_NONE 法線情報を持ちません
M3DPD_COLOR_NONE 色情報を持ちません
M3DPD_TEXCOORD_NONE テクスチャ位置情報を持ちません

( * ) M3DPD_TEXCOORD_AND_PS_PARAMS_PER_FACE と M3DPD_TEXCOORD_AND_PS_PARAMS_PER_VERTEX は処理としては同じ効果が得られます。両者の違いは、プログラム上の使用方法の相違になります。

データタイプの設定も属性等同様、必要なものを論理和で追記してください。プリミティブによっては受け付けないデータタイプ、または必須のデータタイプがあります。

2.2. 頂点配列

IMICRO3D_Render_drawPrimitive () の第四引数でプリミティブに必要な頂点を設定します。
指定には、 IntArray を使用します。
プリミティブの種類によって必要な頂点数は異なりますので、適切な数の頂点を設定してください。

(例)三角ポリゴンの場合
IntArray       coord;

/* 三角ポリゴンの頂点を配列で指定 ( 二つ分 ) */
hi_sint32 coord_array [] = {
-1000,500,0,    1000,500,0,    0, 1414+500,0,      /* 1 */
-1000,500,0,    1000,500,0,    0,-1414+500,0      /* 2 */
};

/* 配列の情報を IntArray にまとめる */
coord.num   = sizeof ( coord_array ) / sizeof ( coord_array [ 0 ] ) ;
coord.array  = coord_array;

プリミティブ 必要な頂点数
プリミティブ数×1
ライン プリミティブ数×2
三角ポリゴン プリミティブ数×3
四角ポリゴン プリミティブ数×4
ポイントスプライト プリミティブ数×1

実際には各頂点は ( x, y, z ) の三要素から成り立ちますので、配列そのものの大きさは頂点数×3となります。頂点の三要素の格納順は x, y, z の順です。

2.3. 法線配列

MICRO3D_Render_drawPrimitive() の第五引数でプリミティブに必要な法線を設定します。
指定には、IntArrayを使用します。
プリミティブの種類、データタイプによって必要な法線数は異なりますので、適切な数の法線を設定してください。

(例)三角ポリゴンの場合
IntArray       normal;

/* 三角ポリゴンの法線を配列で指定( 2つ分 )*/
hi_sint32 normal_array [] = {
 
0,0,4096,                          /* 1 */
0,0,4096                           /* 2 */
};

/* 配列の情報をIntArrayにまとめる */
normal.num    = sizeof ( normal_array) / sizeof ( normal_array [ 0 ] ) ;
normal.array   = normal_array;
プリミティブ データタイプ 必要な法線数
- - - 0
ライン - - - 0
三角ポリゴン M3DPD_NORMAL_NONE 0
M3DPD_NORMAL_PER_FACE プリミティブ数×1
M3DPD_NORMAL_PER_VERTEX プリミティブ数×3
四角ポリゴン M3DPD_NORMAL_NONE 0
M3DPD_NORMAL_PER_FACE プリミティブ数×1
M3DPD_NORMAL_PER_VERTEX プリミティブ数×4
ポイントスプライト - - - 0

実際には各法線は ( x, y, z ) の三要素から成り立ちますので、配列そのものの大きさは法線数×3 となります。法線の三要素の格納順は x, y, z の順です。
また、法線は正規化されている必要があります。MascotCapsule での正規化は長さが 4096 の状態を言います。

2.4. テクスチャ位置情報配列

IMICRO3D_Render_drawPrimitive () の第六引数でプリミティブに必要なテクスチャ位置情報を設定します。指定には、 IntArray を使用します。
プリミティブの種類、データタイプによって必要なテクスチャ位置情報数は異なりますので、適切な数のテクスチャ位置情報を設定してください。

(例)四角ポリゴンの場合
IntArray       texcoord;

/* 四角ポリゴンのテクスチャ位置情報を配列で指定 */
hi_sint32 texcoord_array [] = {
255,255,         0,255,         0,0,         255,0
};

/* 配列の情報を IntArray にまとめる */
texcoord.num   = sizeof ( texcoord_array ) / sizeof ( texcoord_array [ 0 ] ) ;
texcoord.array  = texcoord_array;

プリミティブ データタイプ 必要なテクスチャ位置情報の数
- - - 0
ライン - - - 0
三角ポリゴン M3DPD_COLOR_PER_FACE 0
M3DPD_TEXCOORD プリミティブ数×3
四角ポリゴン M3DPD_COLOR_PER_FACE 0
M3DPD_TEXCOORD プリミティブ数×4
ポイントスプライト M3DPD_TEXCOORD_AND_PS_PARAMS_PER_FACE プリミティブ数×1  (*)
M3DPD_TEXCOORD_AND_PS_PARAMS_PER_VERTEX 頂点数×1  (*)

三角ポリゴン、および四角ポリゴンの頂点情報はテクスチャ上の2次元座標 ( x, y ) ですので、配列そのものの大きさはテクスチャ位置情報の数×2 となります。また、三角ポリゴン、および四角ポリゴンの頂点情報で設定された座標と、テクスチャ位置情報で設定された座標は設定された順番に応じて対応付けがなされます。

( * ) ポイントスプライトの場合、ポイントスプライトの各パラメータもここに含まれます。 ポイントスプライトに必要なパラメータは、

  • ポイントスプライトの幅
  • ポイントスプライトの高さ
  • ポイントスプライトのアングル ( 360度 = 4096 )
  • ポイントスプライトの左上に相当するテクスチャ位置情報 ( x, y )
  • ポイントスプライトの右下に相当するテクスチャ位置情報 ( x, y )
  • ポイントスプライトの表示フラグ( 1.5.ポイントスプライトの項目を参照 )

以上のものがあり、配列そのものの大きさはプリミティブ数×8 となります。

/* ポイントスプライトの各種パラメータ */
hi_sint32 texcoord_array [] = {
1414,1414,                                                     /* width, height                            */
4096,                                                             /* angle                                      */
0,0,                                                                /* texture position ( On the left ) */
255,255,                                                         /* texture position ( Lower right ) */
M3DPSF_LOCAL_SIZE | M3DPSF_PERSPECTIVE   /* display flag                               */
};

2.5. 色情報配列

IMICRO3D_Render_drawPrimitive () の第七引数でプリミティブに必要な色情報を設定します。
指定には、 IntArray を使用します。
プリミティブの種類、データタイプによって必要な色情報数は異なりますので、適切な数の色情報を設定してください。

(例)三角ポリゴンの場合
IntArray      color;

/* 三角ポリゴンの色情報を配列で指定 ( 2つ分 ) */
hi_sint32 color_array [] = {
255 << 16 |     0 << 8 | 0,                /* 1 */
    0 << 16 | 255 << 8 | 0                 /* 2 */
};

/* 配列の情報を IntArray にまとめる */
color.num  = sizeof ( color_array ) / sizeof ( color_array [ 0 ] ) ;
color.array = color_array;

プリミティブ データタイプ 必要な色情報の数
M3DPD_COLOR_PER_FACE プリミティブ数×1
ライン M3DPD_COLOR_PER_FACE プリミティブ数×1
三角ポリゴン M3DPD_COLOR_NONE 0
M3DPD_COLOR_PER_FACE プリミティブ数×1
M3DPD_TEXCOORD 0
四角ポリゴン M3DPD_COLOR_NONE 0
M3DPD_COLOR_PER_FACE プリミティブ数×1
M3DPD_TEXCOORD 0
ポイントスプライト - - - 0

色情報は RGB で各要素が 8bit の 24bit 形式で指定します。これは、実際の環境のピクセル情報に左右されることがありません。

( R 要素 << 16 ) | ( G << 8 ) | ( B )

したがって、配列そのものの大きさは必要な色情報の数×1となります。

以上を設定後、 IMICRO3D_Render_drawPrimitive () を用いてプリミティブの描画登録を行います。
以下にその例を示します。

hi_sint32      type = M3DPD_NORMAL_PER_FACE;

/* 描画登録 */
IMICRO3D_Render_drawPrimitive ( pMe-> pIM3D,
&pMe -> mc_data.render,
M3DP_TRIANGLES                |
M3D_BLEND_NORM               | M3D_LIGHTING                 |
M3DPD_COLOR_PER_FACE    | M3DPD_TEXCOORD_NONE |
type                                   |
( 2 << 16 ),
&coord, &normal, NULL, &color
);



3. プリミティブ描画のサンプルコード

プリミティブの描画に関する部分のコードを以下に示します。ここでは三角ポリゴンの描画を例としています。

IntArray      coord;        /* 頂点配列      */
IntArray      normal;       /* 法線配列     */
IntArray      color;          /* 色情報配列 */
hi_sint32 type = M3DPD_NORMAL_PER_FACE;                    /* プリミティブのタイプ */
                  /* 法線情報有         */

/* 頂点情報 */
hi_sint32 coord_array [] = {
-1000,500,0,    1000,500,0,    0, 1414+500,0,       /* 1 */
-1000,500,0,    1000,500,0,    0,-1414+500,0       /* 2 */
};

/* 法線配列 */
hi_sint32 normal_array [] = {
0,0,4096,                                                         /* 1 */
0,0,4096                                                          /* 2 */
};

/* 色情報配列 */
hi_sint32 color_array[] = {
( 255 << SHIFT_R ) | (     0 << SHIFT_G ) | 0,         /* 1 */
(     0 << SHIFT_R ) | ( 255 << SHIFT_G ) | 0          /* 2 */
};

coord.num = sizeof ( coord_array ) / sizeof ( coord_array [ 0 ] ) ;
coord.array = coord_array;

normal.num = sizeof ( normal_array ) / sizeof ( normal_array [ 0 ] ) ;
normal.array = normal_array;

color.num = sizeof ( color_array ) / sizeof ( color_array [ 0 ] ) ;
color.array = color_array;
if( pMe -> mc_data.normal_flag ! = TRUE )
{
type = M3DPD_NORMAL_NONE;                           /* 法線情報なし */
}

/* 描画登録 */
IMICRO3D_Render_drawPrimitive ( pMe -> pIM3D,
       &pMe -> mc_data.render,
       M3DP_TRIANGLES             |
       M3D_BLEND_NORM            | M3D_LIGHTING |
       M3DPD_COLOR_PER_FACE | M3DPD_TEXCOORD_NONE |
       type                                |
       ( 2 << 16 ),
       &coord,
       &normal,
       NULL,
       &color ) ;

以上の流れで、1種類のプリミティブを複数個一括で描画することができます。 他の種類のプリミティブの描画を行う場合、再度上記の流れを行います。