MIDP 1.0 時代,遊戲開發者需自建 3D 引擎,且無浮點數支持(CLDC 1.0),開發難度極大。MIDP 2.0 引入 JSR 184 (Mobile 3D Graphics API),提供立即模式與保留模式雙軌制,首次在 Java ME 標準層面解決移動端 3D 繪製。
| 類別 | 核心功能 |
|---|---|
| Graphics3D | 唯一 3D 渲染上下文,所有著色操作在 render() 中完成 |
| VertexBuffer / IndexBuffer | 存儲頂點屬性(位置、法線、紋理座標)與三角帶索引 |
| Appearance / Material / Texture2D | 定義表面著色屬性:材質、紋理、混合模式 |
| Camera / Light / Background | 視點投影、光源屬性、背景清除方式 |
| Transform | 4x4 浮點矩陣,實現平移、旋轉、縮放 |
| TriangleStripArray | 高效定義三角帶幾何體 |
立即模式特點:應用程序直接調用 Graphics3D.render() 提交幾何體、外觀、變換,逐幀手動控制渲染管線,靈活度最高但代碼量較大。
public class MIDletMain extends MIDlet {
MyCanvas canvas = new MyCanvas();
Timer timer = new Timer();
public void startApp() {
Display.getDisplay(this).setCurrent(canvas);
timer.schedule(new TimerTask() {
public void run() { canvas.repaint(); }
}, 0, 40); // ~25 FPS
}
// pauseApp、destroyApp、quitApp 省略
}
public class MyCanvas extends Canvas {
private Graphics3D g3d = Graphics3D.getInstance();
private Camera camera;
private Light light;
private float angle = 0;
private VertexBuffer vbuf;
private IndexBuffer ibuf;
private Appearance app;
private Image2D img2d;
public MyCanvas() {
setCommandListener(c -> { if (c.getCommandType()==Command.EXIT) MIDletMain.quitApp(); });
try { init(); } catch (Exception e) { e.printStackTrace(); }
}
private void init() throws Exception {
addCommand(new Command("Exit", Command.EXIT, 1));
// 相機:透視投影
camera = new Camera();
camera.setPerspective(60, (float)getWidth()/getHeight(), 1, 1000);
// 光源
light = new Light(); light.setColor(0xFFFFFF); light.setIntensity(1.25f);
// 立方體頂點、法線、紋理座標(數組省略,見原文)
// 構建 VertexBuffer
vbuf = new VertexBuffer();
vbuf.setPositions(vertArray, 1.0f, null);
vbuf.setNormals(normArray);
vbuf.setTexCoords(0, texArray, 1.0f, null);
// 索引:6 個面,每面 4 頂點三角帶
ibuf = new TriangleStripArray(0, new int[]{4,4,4,4,4,4});
// 紋理加載與設置
Image img = Image.createImage("/pic1.png");
img2d = new Image2D(Image2D.RGB, img);
Texture2D tex = new Texture2D(img2d);
tex.setFiltering(Texture2D.FILTER_NEAREST, Texture2D.FILTER_NEAREST);
tex.setWrapping(Texture2D.WRAP_CLAMP, Texture2D.WRAP_CLAMP);
tex.setBlending(Texture2D.FUNC_MODULATE);
// 外觀組裝
app = new Appearance();
app.setTexture(0, tex);
app.setMaterial(new Material()); // 材質屬性省略
// 背景色
new Background().setColor(0xFFFFCC);
}
protected void paint(Graphics g) {
g3d.bindTarget(g, true, Graphics3D.DITHER | Graphics3D.TRUE_COLOR);
g3d.clear(new Background());
// 相機變換:向後平移 30 單位
Transform t = new Transform(); t.postTranslate(0, 0, 30);
g3d.setCamera(camera, t);
// 光源綁定
g3d.resetLights(); g3d.addLight(light, t);
// 立方體旋轉
angle += 1.0f;
t.setIdentity(); t.postRotate(angle, 1, 1, 1);
// 核心渲染調用
g3d.render(vbuf, ibuf, app, t);
g3d.releaseTarget();
}
}
VertexBuffer 聚合管理,TriangleStripArray 以索引方式複用頂點,極大減少數據傳輸。Image → Image2D → Texture2D → Appearance 四層封裝,支持過濾、包裝、混合模式配置。Transform 串聯平移/旋轉,相機與模型共用實例但語義不同,注意 setIdentity() 重置。bindTarget → clear → setCamera → setupLights → render → releaseTarget,缺一不可。short/byte 而非 float,配合縮放因子,節省頻寬與內存。立即模式賦予開發者對渲染管線的完全控制權,是理解 3D 圖形學原理的最佳切入點。掌握 Graphics3D、VertexBuffer、Transform 三大核心類協作模式,即可在資源受限的手機上構建流暢 3D 體驗。