import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
//プリミティブを表示する(キャンバス)
class ImmediateCanvas extends GameCanvas {
//コンストラクタ
ImmediateCanvas() {
super(false);
}
//実行
void exe() {
//グラフィックス3Dの生成
Graphics g =getGraphics();
Graphics3D g3=Graphics3D.getInstance();
//カメラの生成
Camera camera=new Camera();
camera.setPerspective(60.0f, //ビューのフィールド
(float)getWidth()/(float)getHeight(),//アスペクト比
1.0f, //ニアクリップ面
1000.0f); //ファークリップ面
float angle=0.0f;//角度
//ライトの生成
Light light=new Light();
light.setColor(0xffffff); //白
light.setIntensity(1.25f);//光の強さ
//各頂点の位置
// 1 * * * * * 0
// * * *
// * * *
// * * *
// 3 * * * * * 2
short[] vert={
10, 10, 10, -10, 10, 10, 10,-10, 10, -10,-10, 10, //前
-10, 10,-10, 10, 10,-10, -10,-10,-10, 10,-10,-10, //後
-10, 10, 10, -10, 10,-10, -10,-10, 10, -10,-10,-10, //左
10, 10,-10, 10, 10, 10, 10,-10,-10, 10,-10, 10, //右
10, 10,-10, -10, 10,-10, 10, 10, 10, -10, 10, 10, //上
10,-10, 10, -10,-10, 10, 10,-10,-10, -10,-10,-10 };//下
//各頂点の位置のバーテックスアレイを生成
VertexArray vertArray=new VertexArray(vert.length/3,3,2);
vertArray.set(0,vert.length/3,vert);
//各頂点の法線
byte[] norm = {
0, 0, 127, 0, 0, 127, 0, 0, 127, 0, 0, 127,
0, 0,-127, 0, 0,-127, 0, 0,-127, 0, 0,-127,
-127, 0, 0, -127, 0, 0, -127, 0, 0, -127, 0, 0,
127, 0, 0, 127, 0, 0, 127, 0, 0, 127, 0, 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};
//各頂点の法線のバーテックスアレイを生成
VertexArray normArray = new VertexArray(norm.length/3,3,1);
normArray.set(0,norm.length/3,norm);
//各頂点のテクスチャコーディネイト
short[] tex={
1,0, 0,0, 1,1, 0,1,
1,0, 0,0, 1,1, 0,1,
1,0, 0,0, 1,1, 0,1,
1,0, 0,0, 1,1, 0,1,
1,0, 0,0, 1,1, 0,1,
1,0, 0,0, 1,1, 0,1 };
//各頂点のテクスチャコーディネイトのバーテックスアレイを生成
VertexArray texArray=new VertexArray(tex.length/2,2,2);
texArray.set(0,tex.length/2,tex);
//三角片の長さ
int[] stripLen={4,4,4,4,4,4};
//バーテックスバッファの生成
VertexBuffer vb=new VertexBuffer();
vb.setPositions(vertArray,1.0f,null);
vb.setNormals(normArray);
vb.setTexCoords(0,texArray,1.0f,null);
//インデックスバッファの生成
IndexBuffer ib=new TriangleStripArray(0,stripLen);
//テクスチャの読み込み
Image image=null;
try {
image=Image.createImage("/texture.png"); //イメージ
} catch (Exception e) {
}
Image2D image2D=new Image2D(Image2D.RGB,image);//イメージ2D
Texture2D texture=new Texture2D(image2D); //テクスチャ2D
texture.setFiltering(Texture2D.FILTER_NEAREST,
Texture2D.FILTER_NEAREST);
texture.setWrapping(Texture2D.WRAP_CLAMP,
Texture2D.WRAP_CLAMP);
texture.setBlending(Texture2D.FUNC_MODULATE);
//マテリアルの生成
Material material=new Material();
material.setColor(Material.DIFFUSE,0xFFFFFFFF); //ディフューズ白
material.setColor(Material.SPECULAR,0xFFFFFFFF);//スペキュラー白
material.setShininess(100.0f); //輝度
//アピアランスの生成
Appearance appearance=new Appearance();
appearance.setTexture(0,texture);//テクスチャ
appearance.setMaterial(material);//マテリアル
//バックグラウンドの生成
Background background=new Background();
background.setColor(0xf54588);//色
while (true) {
//ターゲットのバインド
g3.bindTarget(g,true,
Graphics3D.DITHER|Graphics3D.TRUE_COLOR);
//カラーバッファ・デブスバッファのクリア
g3.clear(background);
//カメラの指定
Transform transform=new Transform();
transform.postTranslate(0.0f,0.0f,30.0f);
g3.setCamera(camera,transform);
//ライトの指定
g3.resetLights();
g3.addLight(light,transform);
//キューブの回転
angle+=1.0f;
transform.setIdentity();
transform.postRotate(angle,1.0f,1.0f,1.0f);
//キューブのレンダリング
g3.render(vb,ib,appearance,transform);
//ターゲットのリリース
g3.releaseTarget();
//描画の反映
flushGraphics();
//スリープ
try {
Thread.sleep(50);
} catch (Exception e) {
}
}
}
}
|