J2ME3D编程

参考WTK2.2提供的demo,完成了第一个3D程序,虽然很简单,而且有些问题还不是很清楚,还是把代码共享出来和愿意学习J2ME 3D编程的朋友一起学习。

关于3D编程的资料,可以查阅我的blog。

关于代码的编译和运行说明如下:

1、以下代码在J2ME WTK2.2下面编译通过。

2、代码分为两个文件:First3DCanvas.java和First3DMIDlet.java。

3、使用J2ME WTK2.2建立新的工程,主MIDlet类为:first3d. First3DMIDlet

4、将代码保存在你的工程目录下的first3d目录下。

5、将J2ME WTK安装目录下的

apps/Demo3D/res/com/superscape/m3g/wtksamples/retainedmode/content目录中的swerve.m3g文件复制到你的工程目录下的res目录下。

6、你的工程建立后,设置工程,通过WTK界面中的“设置”按钮打开设置窗口,在“API选择”中,设置“目标平台”为:自定义;“简档”为“MIDP2.0”;“配置”为“CLDC1.1”;选中“Mobile 3D Graphics for J2ME(JSR184)”。

7、这样你就可以编译和运行以下代码了。

源代码如下:

// First3DMIDlet.javapackage 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.javapackage first3d;import javax.microedition.lcdui.*;import javax.microedition.m3g.*;import java.util.*;/*** 第一个3D程序*/public class First3DCanvasextends Canvasimplements Runnable {/**World对象*/private World myWorld = null;/**Graphics3D对象*/private Graphics3D g3d = Graphics3D.getInstance();/**Camera对象*/private Camera cam = null;private int viewport_x;private int viewport_y;private int viewport_width;private int viewport_height;private long worldStartTime = 0;//重绘时间private int validity = 0;public First3DCanvas() {//启动重绘界面的线程Thread thread = new Thread(this);thread.start();try {//导入3D图片myWorld = (World) Loader.load("/swerve.m3g")[0];viewport_x = 0;viewport_y = 0;viewport_width = getWidth();viewport_height = getHeight();cam = myWorld.getActiveCamera();//设置cam对象float[] params = new float[4];int type = cam.getProjection(params);if (type != Camera.GENERIC) {//calculate window aspect ratiofloat waspect = 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(0x00);g.fillRect(0, 0, getWidth(), getHeight());//和3D对象绑定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){}}}

的这一半更多地赢取上帝掌握的那一半。

J2ME3D编程

相关文章:

你感兴趣的文章:

标签云: