Mobile 3D Graphics API (JSR 184, M3G) 是 J2ME 的可選包,基於 OpenGL ES 精簡,完整實現 < 150KB,運行於 CLDC 1.1/2.0(需浮點支援),兼容 MIDP 1.0/2.0。主流機型(Nokia 6230/6600、Siemens S65、Sony Ericsson K700、Moto T720)內建支援。底層多採用 Superscape Swerve 引擎(C 實現)。
| 模式 | 特點 | 適用場景 |
|---|---|---|
| 立即模式 | 逐幀手動提交頂點/三角形,控制力最強,速度最快 | 高性能遊戲、粒子系統、自定義著色器邏輯 |
| 保留模式 | 構建場景圖,設定關鍵幀,動畫由引擎插值播放 | 過場動畫、UI 3D 效果、快速原型 |
| 混合模式 | 場景圖中嵌入立即模式節點 | 大多數實戰專案 |
Graphics3D // 單例,渲染入口,bindTarget/releaseTarget
└─ World // 場景根節點
├─ Camera // 視角、投影矩陣
├─ Light // 環境/平行/點/聚光燈
├─ Background// 純色/圖片/天空盒
└─ Group/Transform/Mesh/Sprite3D // 任意層級 3D 物體
private Graphics3D g3d = Graphics3D.getInstance();
public void paint(Graphics g) {
try {
g3d.bindTarget(g);
renderFrame();
} finally {
g3d.releaseTarget(); // 必須成對調用
}
}
private World world;
private Camera camera;
private Mesh pyramid;
private void initScene() {
world = new World();
camera = new Camera();
world.addChild(camera);
float w = getWidth(), h = getHeight();
camera.setPerspective(60f, w/h, 0.1f, 50f); // FOV, aspect, near, far
world.setActiveCamera(camera);
pyramid = createPyramid(); // 見下文
pyramid.translate(0, 0, -3); // 移入屏幕內
world.addChild(pyramid);
}
private Mesh createPyramid() {
// 5 頂點:底面 4 角 + 頂點
short[] coords = {
-1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1, // 底面
0, 0, 1 // 頂點
};
byte[] indices = {
0, 1, 2, 0, 2, 3, // 底面兩三角形
0, 4, 1, 1, 4, 2, 2, 4, 3, 3, 4, 0 // 四側面
};
VertexArray va = new VertexArray(5, 3, 2); // 5頂點, 3分量, 2字節short
va.set(0, 5, coords);
TriangleStripArray tsa = new TriangleStripArray(18, new int[]{4, 4, 4, 4, 4});
// 簡化:實際用 IndexBuffer 更高效
Mesh mesh = new Mesh(va, tsa, null);
mesh.setAppearance(new Appearance(new Material(), new PolygonMode()));
return mesh;
}
public void run() {
Graphics g = getGraphics();
while (running) {
pyramid.postRotate(3f, 0, 1, 0); // 繞 Y 軸旋轉 3°
g3d.bindTarget(g);
g3d.render(world);
g3d.releaseTarget();
flushGraphics();
try { Thread.sleep(30); } catch (InterruptedException e) {}
}
}
使用 3ds Max / Blender 導出 .m3g,一鍵加載完整場景:
Loader loader = Loader.load("/scene.m3g");
World world = (World) loader.getRootNode();
// 直接使用,含相機、燈光、動畫、骨骼
WTK 2.2+ 內建 M3G 實現與 demo3d 範例,可直接在模擬器運行驗證。
render() 調用| 現象 | 可能原因 | 對策 |
|---|---|---|
| 真機白屏/崩潰 | 未調用 releaseTarget() / 顶點格式不支援 | 檢查 bind/release 配對、用 VertexArray 查詢設備能力 |
| 動畫卡頓 | 每幀 new 物件 / 過多 draw call | 對象池、合併 Mesh、預計算矩陣 |
| 模擬器正常真機花屏 | 驅動 Bug / 紋理尺寸非 2 次方 | 紋理強制 2^n、降級關閉多重紋理 |
| 載入 .m3g 失敗 | 導出版本不兼容 / 缺少紋理文件 | 用 WTK 附帶 M3G 驗證工具檢查 |
M3G 以極小體積帶來真 3D 能力,掌握「立即/保留模式靈活切換、程序化建模與 .m3g 加載互補、定點數優化」三大核心技能,即可在功能機上打造媲美早期智能機的 3D 遊戲體驗。