基於 WTK 2.2 Demo 改寫的首個 3D 程式,展示 JSR 184 (Mobile 3D Graphics API) 基本用法。
first3d.First3DMIDletsrc/first3d/swerve.m3g 複製至 res/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) {}
}
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() 驅動動畫迴圈。