J2ME 3D编程——第一个3D程序(附源代码) 
                                          更多文章请访问:http://blog.csdn.net/mailbomb 
  
       参考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.java 
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) {} 
} 
  
  
  
// First3Dcanvas.java 
package first3d; 
  
import javax.microedition.lcdui.*; 
import javax.microedition.m3g.*; 
import java.util.*; 
  
/** 
 * 第一个3D程序 
 */ 
public class First3DCanvas 
    extends Canvas 
    implements 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 ratio 
        float 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){} 
  } 
}  
 
  |