▼MIDP2.0メモ▼
プリミティブを表示する


プリミティブを表示するプログラムです。プリミティブを表示する時は「イミディエイトモード」を使います。 イミディエイトモードは、3D グラフィックスコンテンツをアルゴリズムによって生成するアプリケーションに適しています。



テクスチャファイルの準備
・texture.png
128x128


プログラム
ImmediateEx.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;

//プリミティブを表示する(本体)
public class ImmediateEx extends MIDlet
    implements Runnable {
    static ImmediateCanvas c;

    //コンストラクタ
    public ImmediateEx() {
        c=new ImmediateCanvas();
        Display.getDisplay(this).setCurrent(c);
        (new Thread(this)).start();
    }

    //アプリの開始
    public void startApp() {
    }

    //アプリの一時停止
    public void pauseApp() {
    }

    //アプリの終了
    public void destroyApp(boolean unconditional) {
    }

    //実行
    public void run() {
        c.exe();
    }
}


ImmediateCanvas.java
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) {
            }
        }
    }
}



−戻る−