プリミティブ
MascotCapsule V3 では Low Level API を利用したプリミティブの描画が可能です。
目次
1. 各種プリミティブ
MascotCapsule V3 で描画できるプリミティブは 以下のものがあります。
| プリミティブ | 説明 |
|---|---|
| 点 | 1ピクセルで描画される点 プリミティブ単位で色を指定できる ブレンド処理方法(ブレンドなし、半透明、加算、減算)を属性として選択できる |
| ライン | 2点を直線で結んだ幅1ピクセルのライン プリミティブ単位で色を指定できる ブレンド処理方法を属性として選択できる |
| 三角ポリゴン |
3点を指定することで描画される三角ポリゴン
|
| 四角ポリゴン | 4点を指定することで描画される四角ポリゴン 選択できるポリゴン属性は三角ポリゴンと同様 |
| ポイントスプライト | 表示座標を指定し、常に視点方向を向いた四角ポリゴンを描画する ブレンド処理方法を指定できる |
SamplePrimitive3D 実行画面 (左画像:表面,右画像:裏面)
1.1. 点
三次元座標を指定して点を描画します。描画される点はスクリーンの設定によらず、1ピクセルで表現されます。
点を描画する際には、以下のパラメータが必要です。
- 点を描画する三次元座標(モデル座標系)
- 点の色
- 点の属性とデータタイプ
1.2. ライン
三次元座標で示される2点間を結ぶラインを描画します。描画されるラインの幅はスクリーンの設定によらず、1ピクセルで表現されます。
ラインを描画する際には、以下のパラメータが必要です。
- ラインの両端の三次元座標(モデル座標系)
- ラインの色
- ラインの属性とデータタイプ
1.3. 三角ポリゴン
三次元座標で示される3点で構成される三角ポリゴンを描画します。三角ポリゴンにはテクスチャを貼り付けるテクスチャポリゴンと、色を指定し、単色で描画されるカラーポリゴンがあります。
三角ポリゴンを描画する際には、以下のパラメータが必要です。
- 三角ポリゴンを構成する3点の三次元座標(モデル座標系)
- 三角ポリゴンの法線
- 三角ポリゴンに貼り付けるテクスチャ座標(テクスチャポリゴンの場合)
- 三角ポリゴンの色(カラーポリゴンの場合)
- 三角ポリゴンの属性とデータタイプ
1.4. 四角ポリゴン
三次元座標で示される4点で構成される四角ポリゴンを描画します。三角ポリゴン同様、四角ポリゴンもテクスチャポリゴンとカラーポリゴンがあります。
四角ポリゴンを描画する際には、以下のパラメータが必要です。
- 四角ポリゴンを構成する4点の三次元座標(モデル座標系)
- 四角ポリゴンの法線
- 四角ポリゴンに貼り付けるテクスチャ座標(テクスチャポリゴンの場合)
- 四角ポリゴンの色(カラーポリゴンの場合)
- 四角ポリゴンの属性とデータタイプ
1.5. ポイントスプライト
三次元座標で示される1点を中心とした、視点に対し常に正面を向く四角ポリゴンを描画します。
ポイントスプライトを描画する際には、以下のパラメータが必要です。
- ポイントスプライトの表示位置を示す 1つの三次元座標(モデル座標系)
- ポイントスプライトに貼り付ける テクスチャ座標
- ポイントスプライトのサイズとアングル
- ポイントスプライトの表示フラグ
- ポイントスプライトの属性とデータタイプ
なお、MascotCapsule V3 におけるポイントスプライトは、表示の際、以下のフラグを指定して表示方法を決定します。
| フラグ | 説明 |
|---|---|
| POINT_SPRITE_LOCAL_SIZE | モデル座標系におけるサイズを指定します |
| POINT_SPRITE_PIXEL_SIZE | スクリーン座標系におけるサイズを指定します |
| POINT_SPRITE_PERSPECTIVE | 透視投影においてパースを有効にします |
| POINT_SPRITE_NO_PERS | 透視投影においてパースを無効にします |
これらのフラグを論理和で表示方式として指定します。
ただし、POINT_SPRITE _LOCAL_SIZE と POINT_SPRITE _PIXEL_SIZE 、および POINT_SPRITE _PERSPECTIVE と POINT_SPRITE _NO_PERS はそれぞれ排他的な関係にあります。
2. プリミティブ描画
Graphics3D.renderPrimitives() メソッドを使用することにより、複数のプリミティブを一括して描画登録することが可能です。描画登録後、Graphics3D.flush() メソッドを呼び出すことにより、実際の描画が行われます。なおこのとき、一度に登録できるのは同じ属性を持つ、同じプリミティブのみです。異なるプリミティブ、あるいは同じプリミティブでも異なる属性を持つ場合には別々に描画登録を行う必要があります。
(例).同じプリミティブで異なる属性を持つ場合
法線をプリミティブ単位で持つ三角ポリゴンと頂点単位で持つ三角ポリゴン等
Graphics3D.renderPrimitives() は引数として以下のものを指定する必要があります。
- 描画位置の座標
- プリミティブの種類と属性、データタイプ
- プリミティブの数
- プリミティブを描画する際に使用する頂点配列
- プリミティブを描画する際に使用する法線配列
- プリミティブを描画する際に使用するテクスチャ位置情報配列
- プリミティブを描画する際に使用する色情報配列
また、テクスチャを用いる場合には Texture オブジェクトを指定する必要があります。 以下に各引数の説明を行います。
2.1. プリミティブ描画
これらの引数の指定方法は以下の通りです。
プリミティブの種類 | プリミティブの属性 | プリミティブのデータタイプ
というように各項目の論理和を指定します。
/* 三角ポリゴン */
triangles = Graphics3D.PRIMITIVE_TRIANGLES |
Graphics3D.PDATA_COLOR_PER_FACE |
Graphics3D.PATTR_LIGHTING;
属性、およびデータタイプは必要なものを連記することができます。
プリミティブの種類は以下の宣言から指定します。
| プリミティブ | 宣言 |
|---|---|
| 点 | PRIMITIVE _POINTS |
| ライン | PRIMITIVE _LINES |
| 三角ポリゴン | PRIMITIVE _TRIANGLES |
| 四角ポリゴン | PRIMITIVE _QUADS |
| ポイントスプライト | PRIMITIVE _POINT_SPRITES |
プリミティブの指定は一回の描画登録につき、必ず一種類だけです。
属性に関しては以下の宣言の中から指定します。
| 宣言 | 説明 |
|---|---|
| PATTR_LIGHTING | プリミティブは光源処理の対象となります (点、ライン、ポイントスプライトでは無効です) |
| PATTR _SPHERE_MAP | プリミティブはスフィアマップ処理の対象となります (点、ライン、ポイントスプライトでは無効です) |
| PATTR _COLORKEY | プリミティブはカラーキーによる透過処理の対象となります (点、ラインでは無効です) |
| PATTR _BLEND_NORM | ブレンド処理を行いません |
| PATTR _BLEND_HALF | 半透明処理を行います |
| PATTR _BLEND_ADD | 加算処理を行います |
| PATTR _BLEND_SUB | 減算処理を行います |
属性の設定は必要なものを論理和で追加してください。 ただし、プリミティブによっては受け付けない属性もあります。 また、光源、スフィアマップ、カラーキー、ブレンド処理等については、それぞれ詳細なマニュアルをご参照ください。
データタイプに関しては以下の宣言から指定します。
| 宣言 | 説明 |
|---|---|
| PDATA_NORAML_PER_FACE | プリミティブ単位で法線を持ちます (点、ライン、ポイントスプライトでは無効です) |
| PDATA _NORMAL_PER_VERTEX | 頂点単位で法線を持ちます (点、ライン、ポイントスプライトでは無効です) |
| PDATA_COLOR_PER_COMMAND | コマンド共通の色情報を持ちます (ポイントスプライトでは無効です。点、ラインではこれか PDATA_COLOR_PER_FACE を必ず指定してください) |
| PDATA _COLOR_PER_FACE | プリミティブ単位で色情報を持ちます (ポイントスプライトでは無効です。点、ラインではこれか PDATA_COLOR_PER_COMMAND を必ず指定してください) |
| PDATA _TEXURE_COORD | テクスチャ位置情報を持ちます (点、ラインでは無効です) |
| PDATA_POINT_SPRITE_PARAMS_PER_CMD | ポイントスプライトに共通のテクスチャ位置情報を持ちます ( ポイントスプライトでのみ有効です。 ポイントスプライトではこれか PDATA_POINT_SPRITE_PARAMS_PER_FACE あるいは PDATA_POINT_SPRITE_PARAMS_PER_VERTEX を必ず指定してください) |
| PDATA_POINT_SPRITE_PARAMS_PER_FACE | プリミティブ毎にポイントスプライトのテクスチャ位置情報を持ちます(*) ( ポイントスプライトでのみ有効です。 ポイントスプライトではこれか PDATA_POINT_SPRITE_PARAMS_PER_CMD あるいは PDATA_POINT_SPRITE_PARAMS_PER_VERTEX を必ず指定してください) |
| PDATA_POINT_SPRITE_PARAMS_PER_VERTEX | 頂点ごとにポイントスプライトのテクスチャ位置情報を持ちます(*) ( ポイントスプライトでのみ有効です。 ポイントスプライトではこれか PDATA_POINT_SPRITE_PARAMS_PER_CMD あるいは PDATA_POINT_SPRITE_PARAMS_PER_FACE を必ず指定してください) |
| PDATA _NORMAL_NONE | 法線情報を持ちません |
| PDATA _COLOR_NONE | 色情報を持ちません |
| PDATA _TEXURE_COORD_NONE | テクスチャ位置情報を持ちません |
(*)PDATA_POINT_SPRITE_PARAMS_PER_FACE と PDATA_POINT_SPRITE_PARAMS_PER_VERTEX は
処理としては同じ効果が得られます。両者の違いは、プログラム上の使用方法の
相違になります。
データタイプの設定も属性等同様、必要なものを論理和で追記してください。プリミティブによっては受け付けないデータタイプ、または必須のデータタイプがあります。
ポイントスプライトで PDATA_POINT_SPRITE_PARAMS_PER_CMD を指定した場合、テクスチャ位置情報(=ポイントスプライトのパラメータ)を使いまわすことができます。
同様に、PDATA_COLOR_PER_COMMAND が指定されたときは、色情報を使いまわすことが可能です。
2.2.頂点配列
頂点配列の指定には int 型の配列を使用します。
プリミティブの種類によって必要な頂点数は異なりますので、適切な数の頂点を設定してください。
/* 頂点情報 */
/* 1つ目 */
trVertex[0] = 0;
trVertex[1] = 256;
trVertex[2] = 0;
trVertex[3] = -128;
trVertex[4] = 0;
trVertex[5] = 0;
trVertex[6] = 128;
trVertex[7] = 0;
trVertex[8] = 0;
/* 2つ目 */
trVertex[9] = 0;
trVertex[10] = -256;
trVertex[11] = 0;
trVertex[12] = -128;
trVertex[13] = 0;
trVertex[14] = 0;
trVertex[15] = 128;
trVertex[16] = 0;
trVertex[17] = 0;
| プリミティブ | 必要な頂点数 |
|---|---|
| 点 | プリミティブ数×1 |
| ライン | プリミティブ数×2 |
| 三角ポリゴン | プリミティブ数×3 |
| 四角ポリゴン | プリミティブ数×4 |
| ポイントスプライト | プリミティブ数×1 |
実際には各頂点は ( x, y, z ) の三要素から成り立ちますので、配列そのものの大きさは頂点数×3となります。頂点の三要素の格納順は x, y, z の順です。
2.3. 法線配列
法線配列の指定には int 型の配列を使用します。
プリミティブの種類、および、データタイプによって必要な法線数は異なりますので、適切な数の法線を設定してください。
/* 法線情報 */
/* 1つ目 */
trNormal[0] = 0;
trNormal[1] = 0;
trNormal[2] = 4096;
/* 2つ目 */
trNormal[3] = 0;
trNormal[4] = 0;
trNormal[5] = 4096;
| プリミティブ | データタイプ | 必要な法線数 |
|---|---|---|
| 点 | - - - | 0 |
| ライン | - - - | 0 |
| 三角ポリゴン | PDATA _NORMAL_NONE | 0 |
| PDATA_NORMAL_PER_FACE | プリミティブ数×1 | |
| PDATA_NORMAL_PER_VERTEX | プリミティブ数×3 | |
| 四角ポリゴン | PDATA _NORMAL_NONE | 0 |
| PDATA _NORMAL_PER_FACE | プリミティブ数×1 | |
| PDATA _NORMAL_PER_VERTEX | プリミティブ数×4 | |
| ポイントスプライト | - - - | 0 |
実際には各法線は ( x, y, z ) の三要素から成り立ちますので、配列そのものの大きさは法線数×3となります。法線の三要素の格納順は x, y, z の順です。
また、法線は正規化されている必要があります。MascotCapsule での正規化は長さが 4096 の状態をいいます。
2.4. テクスチャ位置情報配列
テクスチャ位置情報配列の指定には int 型の配列を使用します。プリミティブの種類、および、データタイプによって必要なテクスチャ位置情報の数は異なりますので、適切な数のテクスチャ位置情報を設定してください。
/* テクスチャ位置情報 */
qdTexCoord[0] = 255;
qdTexCoord[1] = 255;
qdTexCoord[2] = 0;
qdTexCoord[3] = 255;
qdTexCoord[4] = 0;
qdTexCoord[5] = 0;
qdTexCoord[6] = 255;
qdTexCoord[7] = 0;
| プリミティブ | データタイプ | 必要なテクスチャ位置情報の数 |
|---|---|---|
| 点 | - - - | 0 |
| ライン | - - - | 0 |
| 三角ポリゴン | PDATA_COLOR_PER_FACE または PDATA_COLOR_PER_COMMAND | 0 |
| PDATA_TEXURE_COORD | プリミティブ数×3 | |
| 四角ポリゴン | PDATA_COLOR_PER_FACE または PDATA_COLOR_PER_COMMAND | 0 |
| PDATA_TEXURE_COORD | プリミティブ数×4 | |
| ポイントスプライト | PDATA_POINT_SPRITE_PARAMS_PER_CMD | 1 |
| PDATA_POINT_SPRITE_PARAMS_PER_FACE | プリミティブ数×1(*) | |
| PDATA_POINT_SPRITE_PARAMS_PER_VERTEX | 頂点数×1(*) |
(*)PDATA_POINT_SPRITE_PARAMS_PER_FACE と PDATA_POINT_SPRITE_PARAMS_PER_VERTEX は
処理としては同じ効果が得られます。両者の違いは、プログラム上の使用方法の
相違になります。
三角ポリゴン、および四角ポリゴンの頂点情報はテクスチャ上の2次元座標 ( x, y ) ですので、配列そのものの大きさはテクスチャ位置情報の数×2となります。また、三角ポリゴン、および四角ポリゴンの頂点情報で設定された座標と、テクスチャ位置情報で設定された座標は設定された順番に応じて対応付けがなされます。
(*)ポイントスプライトの場合、ポイントスプライトの各パラメータもここに含まれます。
ポイントスプライトに必要なパラメータは
- ポイントスプライトの幅
- ポイントスプライトの高さ
- ポイントスプライトのアングル( 360° = 4096 )
- ポイントスプライトの左上に相当するテクスチャ位置情報 ( x, y )
- ポイントスプライトの右下に相当するテクスチャ位置情報 ( x, y )
- ポイントスプライトの表示フラグ
以上のものがあり、配列そのものの大きさはプリミティブ数×8となります。
2.5. 色情報配列
色情報配列の指定には int 型の配列を使用します。プリミティブの種類、および、データタイプによって必要な法線数は異なりますので、適切な数の色情報を設定してください。
/* 色情報 */
/* 1つ目 */
trColor[0] = ( ( 255 << 16 ) | ( 0 << 8 ) | ( 0 ) );
/* 2つ目 */
trColor[1] = ( ( 0 << 16 ) | ( 255 << 8 ) | ( 0 ) );
| プリミティブ | データタイプ | 必要な色情報の数 |
|---|---|---|
| 点 | PDATA_COLOR_PER_COMMAND | 1 |
| PDATA_COLOR_PER_FACE | プリミティブ数×1 | |
| ライン | PDATA_COLOR_PER_COMMAND | 1 |
| PDATA_COLOR_PER_FACE | プリミティブ数×1 | |
| 三角ポリゴン | PDATA_COLOR_NONE | 0 |
| PDATA_COLOR_PER_COMMAND | 1 | |
| PDATA_COLOR_PER_FACE | プリミティブ数×1 | |
| 四角ポリゴン | PDATA_COLOR_NONE | 0 |
| PDATA_COLOR_PER_COMMAND | 1 | |
| PDATA_COLOR_PER_FACE | プリミティブ数×1 | |
| ポイントスプライト | - - - | 0 |
色情報は RGB で各要素が 8bit の 24bit 形式で指定します。これは、実際の環境のピクセル情報に左右されることがありません。
( R 要素 << 16 ) | ( G << 8 ) | ( B )
したがって、配列そのものの大きさは必要な色情報の数×1となります。
3. プリミティブ描画のサンプルコード
ここではサンプルコード内のプリミティブ描画に関する部分について説明します。ここでは1.2.で使用した、三角ポリゴンの描画を例にとって説明します。
private int[] trVertex = new int[18]; // 三角ポリゴン頂点配列
private int[] trNormal = new int[6]; // 三角ポリゴン法線情報配列
private int[] trColor = new int[2]; // 三角ポリゴン色情報配列
/* 三角ポリゴン */
triangles = Graphics3D.PRIMITIVE_TRIANGLES |
Graphics3D.PDATA_COLOR_PER_FACE |
Graphics3D.PATTR_LIGHTING;
/* 頂点情報 */
/* 1つ目 */
trVertex[0] = 0;
trVertex[1] = 256;
trVertex[2] = 0;
trVertex[3] = -128;
trVertex[4] = 0;
trVertex[5] = 0;
trVertex[6] = 128;
trVertex[7] = 0;
trVertex[8] = 0;
/* 2つ目 */
trVertex[9] = 0;
trVertex[10] = -256;
trVertex[11] = 0;
trVertex[12] = -128;
trVertex[13] = 0;
trVertex[14] = 0;
trVertex[15] = 128;
trVertex[16] = 0;
trVertex[17] = 0;
/* 法線情報 */
/* 1つ目 */
trNormal[0] = 0;
trNormal[1] = 0;
trNormal[2] = 409
6; /* 2つ目 */
trNormal[3] = 0;
trNormal[4] = 0;
trNormal[5] = 4096;
/* 色情報 */
/* 1つ目 */
trColor[0] = ( ( 255 << 16 ) | ( 0 << 8 ) | ( 0 ) );
/* 2つ目 */
trColor[1] = ( ( 0 << 16 ) | ( 255 << 8 ) | ( 0 ) );
描画登録のため Graphics クラスへの登録を行い、描画します
trans.multiply( vtrans, ytrans );
/* 座標変換関係設定 */
layout.setAffineTrans( trans );
( (Graphics3D)g ).renderPrimitives( null, 0, 0, layout, effect,
他のプリミティブも同様に設定します。
ライン
private int[] lnVertex = new int[6]; // ライン頂点配列
private int[] lnColor = new int[1]; // ライン用色情報配列
/* ライン */
lines = Graphics3D.PRIMITIVE_LINES |
Graphics3D.PATTR_LIGHTING;
/* 頂点情報 */
lnVertex[0] = 428;
lnVertex[1] = 256;
lnVertex[2] = 0;
lnVertex[3] = 428;
lnVertex[4] = -256;
lnVertex[5] = 0;
/* 色情報 */
lnColor[0] = ( ( 255 << 16 ) | ( 0 << 8 ) | ( 0 ) );
( (Graphics3D)g ).renderPrimitives( null, 0, 0, layout, effect,
ポイントスプライト
private int pointSprites; // ポイントスプライト用情報
private int[] psVertex = new int[3]; // ポイントスプライト頂点配列
private int[] psTexCoord = new int[8]; // ポイントスプライトテクスチャ位置情報配列
texture = new Texture( "texture.bmp", true );
/* ポイントスプライト */
pointSprites = Graphics3D.PRIMITIVE_POINT_SPRITES |
Graphics3D.PDATA_TEXURE_COORD | Graphics3D.PATTR_LIGHTING;
/* 頂点情報 */
psVertex[0] = -428;
psVertex[1] = 128;
psVertex[2] = 0;
/* テクスチャ位置情報 */
psTexCoord[0] = 256;
psTexCoord[1] = 256;
psTexCoord[2] = 0;
psTexCoord[3] = 0;
psTexCoord[4] = 0;
psTexCoord[5] = 255;
psTexCoord[6] = 255;
psTexCoord[7] = Graphics3D.POINT_SPRITE_LOCAL_SIZE |
( (Graphics3D)g ).renderPrimitives( texture, 0, 0, layout, effect,
( (Graphics3D)g ).flush();
四角ポリゴン (*テクスチャデータはポイントスプライトと共有しています。)
private int[] qdVertex = new int[12]; // 四角ポリゴン頂点配列
private int[] qdNormal = new int[3]; // 四角ポリゴン法線情報配列
private int[] qdTexCoord = new int[8]; // 四角ポリゴンテクスチャ位置情報配列
/* 四角ポリゴン */
quads = Graphics3D.PRIMITIVE_QUADS | Graphics3D.PDATA_COLOR_NONE |
Graphics3D.PDATA_TEXURE_COORD |
Graphics3D.PATTR_LIGHTING;
/* 頂点情報 */
qdVertex[0] = -300;
qdVertex[1] = 0;
qdVertex[2] = 0;
qdVertex[3] = -556;
qdVertex[4] = 0;
qdVertex[5] = 0;
qdVertex[6] = -556;
qdVertex[7] = -256;
qdVertex[8] = 0;
qdVertex[9] = -300;
qdVertex[10] = -256;
qdVertex[11] = 0;
/* 法線情報 */
qdNormal[0] = 0;
qdNormal[1] = 0;
qdNormal[2] = 4096;
/* テクスチャ位置情報 */
qdTexCoord[0] = 255;
qdTexCoord[1] = 255;
qdTexCoord[2] = 0;
qdTexCoord[3] = 255;
qdTexCoord[4] = 0;
qdTexCoord[5] = 0;
qdTexCoord[6] = 255;
qdTexCoord[7] = 0;
( (Graphics3D)g ).renderPrimitives( texture, 0, 0, layout, effect,
( (Graphics3D)g ).flush();

