首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

J2ME 3D 程式設計入門:第一個 JSR 184 應用完整原始碼

     編輯:J2ME

基於 WTK 2.2 Demo 改寫的首個 3D 程式,展示 JSR 184 (Mobile 3D Graphics API) 基本用法。

專案設定

  1. WTK 2.2 建立新專案,主類別:first3d.First3DMIDlet
  2. 原始碼置於 src/first3d/
  3. 將 WTK 範例資源 swerve.m3g 複製至 res/
  4. 專案屬性 → API 選擇:目標平台=自訂、設定檔=MIDP 2.0、配置=CLDC 1.1、勾選 Mobile 3D Graphics for J2ME (JSR 184)

完整原始碼

First3DMIDlet.java

package first3d;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class First3DMIDlet extends MIDlet {
    private First3DCanvas displayable = new First3DCanvas();
    public void startApp() { Display.getDisplay(this).setCurrent(displayable); }
    public void pauseApp() {}
    public void destroyApp(boolean unconditional) {}
}

First3DCanvas.java

package first3d;
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
import java.util.*;

public class First3DCanvas extends Canvas implements Runnable {
    private World myWorld = null;
    private Graphics3D g3d = Graphics3D.getInstance();
    private Camera cam = null;
    private int viewport_x, viewport_y, viewport_width, viewport_height;
    private long worldStartTime = 0;
    private int validity = 0;

    public First3DCanvas() {
        new Thread(this).start();
        try {
            myWorld = (World) Loader.load("/swerve.m3g")[0];
            viewport_x = 0; viewport_y = 0;
            viewport_width = getWidth(); viewport_height = getHeight();
            cam = myWorld.getActiveCamera();
            
            float[] params = new float[4];
            int type = cam.getProjection(params);
            if (type != Camera.GENERIC) {
                float waspect = (float)viewport_width / viewport_height;
                if (waspect < params[1]) {
                    float height = viewport_width / params[1];
                    viewport_height = (int) height;
                    viewport_y = (getHeight() - viewport_height) / 2;
                } else {
                    float width = viewport_height * params[1];
                    viewport_width = (int) width;
                    viewport_x = (getWidth() - viewport_width) / 2;
                }
            }
            worldStartTime = System.currentTimeMillis();
        } catch (Exception e) {}
    }

    protected void paint(Graphics g) {
        g.setColor(0x000000);
        g.fillRect(0, 0, getWidth(), getHeight());
        g3d.bindTarget(g);
        g3d.setViewport(viewport_x, viewport_y, viewport_width, viewport_height);
        long startTime = System.currentTimeMillis() - worldStartTime;
        validity = myWorld.animate((int)startTime);
        try { g3d.render(myWorld); }
        finally { g3d.releaseTarget(); }
    }

    public void run() {
        try {
            while (true) {
                repaint(viewport_x, viewport_y, viewport_width, viewport_height);
            }
        } catch (Exception e) {}
    }
}

關鍵點:Loader.load() 載入 M3G 模型、World.animate() 依時間更新動畫、Graphics3D.render() 繪製 3D 場景、獨立執行緒持續呼叫 repaint() 驅動動畫迴圈。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved