プリミティブの描画

ここでは単純な Primitive オブジェクトの描画について解説します。
Primitive オブジェクトは1つ以上のプリミティブデータから構成されるオブジェクトです。Figure オブジェクトとは異なりボーンを持たず ActionTable との関連付けも行うことができません。 また、1つの Primitive オブジェクトは1種類のプリミティブしか扱えませんが、同一のプリミティブであれば最大 255 個の図形を持つことができます。

目次



1.プリミティブの種類

Primitive オブジェクトで扱うことのできるプリミティブには、以下の5種類があります。



2.プリミティブの描画

ここではサンプルとして、線、三角形、ポイントスプライトを取り上げます。

2.1.Primitive オブジェクトの取得

まずPrimitive オブジェクトを生成し、それぞれに対しプリミティブの種別等の情報を設定します。

[Primitive オブジェクトの生成]

// Primitive オブジェクトの生成
Primitive line;
Primitive triangle;
Primitive pointsprite;

・・・

// Sample06Canvas.java 60行
// 直線の設定
line = new Primitive( Primitive.PRIMITIVE_LINES,
Primitive.COLOR_PER_PRIMITIVE,
1 );

・・・

// Sample06Canvas.java 74行
// 三角形の設定
triangle = new Primitive( Primitive.PRIMITIVE_TRIANGLES,
Primitive.COLOR_PER_PRIMITIVE |
Primitive.NORMAL_PER_FACE,
1 );

・・・

// Sample06Canvas.java 96行
// ポイントスプライトの設定
pointSprite = new Primitive( Primitive.PRIMITIVE_POINT_SPRITES,
Primitive.SPRITE_PER_PRIMITIVE,
1 );

Primitive.PRIMITIVE_LINES, Primitive.PRIMITIVE_TRIANGLES, Primitive.PRIMITIVE_POINT_SPRITESはプリミティブの型を表し、それぞれ線、三角形、ポイントスプライトであることを表しています。この宣言によって Primitive オブジェクトがそれぞれのプリミティブとして指定されます。

次に、Primitive.COLOR_PER_PRIMITIVEは色情報を各プリミティブごとに持たせるのではなく、オブジェクト全体で1つの色情報を持つことを表しています。Primitive.NORMAL_PER_FACE はプリミティブごとに1つの法線情報を持つことを表します。
Primitive.SPRITE_PER_PRIMITIVE は各プリミティブごとにポイントスプライト情報を持つのではなく、オブジェクト全体で1つのプリミティブ情報を持つことを表します。

法線情報、色情報、テクスチャ情報、およびポイントスプライト情報はプリミティブ情報と呼ばれ、論理和により組み合わせて指定します。なお、色情報とテクスチャ情報を同時に指定することはできません。

プリミティブの数は最初に述べたように、同一のプリミティブであれば最大で 255 個まで指定することが可能です。 また頂点情報、およびプリミティブ情報は Primitive オブジェクトが生成されたときに、自動的に情報を格納するための配列が用意されます。配列のサイズは、プリミティブの個数や種別によって異なります。

2.2.各プリミティブ情報の設定


2.3.テクスチャに関する設定

Primitive オブジェクトのうちポイントスプライト、または三角形や四角形に対しテクスチャを貼り付ける場合 Texture オブジェクトが必要になります。
ここでは Primitive オブジェクトと Texture オブジェクトの関連付けについてポイントスプライトを例として解説します。

[Texture オブジェクトの設定]

// テクスチャ
Texture texture;

・・・

// Sample06Canvas.java 114行
// テクスチャの読み込み
try {
texture = ( Texture ) Object3D.createInstance(
Connector.openInputStream( “resource:///texture.bmp” ) );
}

・・・

// Sample06Canvas.java 123行
// テクスチャ貼り付け
pointSprite.setTexture( texture );

・・・


Primitive オブジェクトに Texture オブジェクトを関連付ける際には setTexture() メソッドを使用します。これにより、各プリミティブに対しテクスチャを貼り付けることが可能になります。
ただし Figure オブジェクトとは異なり、単一の Primitive オブジェクトに対し複数の Texture オブジェクトを関連付けることはできません。


2.4.各プリミティブの描画

ここでは実際に Primitive オブジェクトを描画してみます。

[Primitive オブジェクトの描画]


・・・

// Sample06Canvas.java 183行
// Primitive オブジェクトの描画
g3.renderObject3D( line, trans );
g3.renderObject3D( triangle, trans );
g3.renderObject3D( pointSprite, trans );

・・・

Primitive オブジェクトの描画にも他の 3D オブジェクト同様 renderObject3D() メソッドを使用します。

 

プリミティブの描画(左画像 : 表面、右画像 : 裏面)



3.プリミティブ独自の特徴

プリミティブは大きくカテゴリ分けすると以下の2つに分類されます。

このうち特殊プリミティブは光源の影響を受けません。常に設定した色またはテクスチャで描画が行われます。また、ポリゴンについても法線情報が設定されていないものについては同様に光源の影響を受けません。

特殊プリミティブを Figure オブジェクト等のその他オブジェクトと同時にレンダリングした場合、Z位置は考慮されず特殊プリミティブでないオブジェクトが正しく描画された後に特殊プリミティブがその上に描画されます。また透視投影を行う場合、特殊プリミティブを極端な位置に配置したり、ニア面の距離の値を非常に小さく(特に1.0以下)設定する、あるいはニア面とファー面の距離の差を非常に大きく(特に1000.0以上)設定する場合、演算時のオーバーフローが起こりやすくなります。
いずれの場合も結果として予期したとおりの描画が行われない可能性があります。



このページの先頭へ戻る