專案結構:Test3DMIDlet (MIDlet) + M3GCanvas (Canvas)
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class Test3DMIDlet extends MIDlet {
M3GCanvas m3g = new M3GCanvas();
public void startApp() {
Display.getDisplay(this).setCurrent(m3g);
}
public void pauseApp() {}
public void destroyApp(boolean b) {}
}
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
public class M3GCanvas extends Canvas {
private World world;
private Graphics3D g3d;
private Camera camera;
public M3GCanvas() {
try {
// 1. 從 .m3g 檔載入場景
Object3D[] obj = Loader.load("/res/pogoroo.m3g");
// 2. 取得 World 物件
for (int i = 0; i < obj.length; i++) {
if (obj[i] instanceof World) {
world = (World) obj[i];
break;
}
}
// 3. 取得 Graphics3D 單例
g3d = Graphics3D.getInstance();
// 4. 取得場景中的主動攝影機
camera = world.getActiveCamera();
} catch (Exception e) {
System.out.println(e);
}
}
public void paint(Graphics g) {
try {
// 綁定渲染目標
g3d.bindTarget(g);
// 代理渲染整個世界
g3d.render(world);
} catch (Exception e) {
// 忽略渲染錯誤
} finally {
// 釋放渲染目標 (必要)
g3d.releaseTarget();
}
}
public void keyPressed(int keyCode) {
int action = getGameAction(keyCode);
if (action == Canvas.UP) {
// 移動攝影機 (Z 軸前進 0.2 單位)
camera.setTranslation(0, 0, 0.2f);
}
repaint(); // 觸發重繪
}
}
Loader.load() 回傳 Object3D[],需遍歷找出 World 實例Graphics3D.bindTarget(g) / releaseTarget() 必須成對呼叫,否則記憶體洩漏g3d.render(world) 一行完成整個場景渲染 (保留模式)Camera.setTranslation() 直接修改攝影機位置,配合 repaint() 即時更新pogoroo.m3g 可從 WTK2.2\apps\Demo3D 取得

此範例展示 M3G 最核心用法:載入場景 → 綁定畫布 → 渲染 → 互動更新攝影機,適合作為 3D 專案起始樣板。