本文和大家重點討論一下J2ME 3D編程——第一個3D程序,參考WTK2.2提供的demo,完成了第一個3D程序,雖然很簡單,而且有些問題還不是很清楚,還是把代碼共享出來和願意學習J2ME 3D編程的朋友一起學習。
J2ME 3D編程——第一個3D程序
參考WTK2.2提供的demo,完成了第一個3D程序,雖然很簡單,而且有些問題還不是很清楚,還是把代碼共享出來和願意學習J2ME 3D編程的朋友一起學習。
關於代碼的編譯和運行說明如下:
1、以下代碼在J2MEWTK2.2下面編譯通過。
2、代碼分為兩個文件:First3DCanvas.java和First3DMIDlet.Java。
3、使用J2MEWTK2.2建立新的工程,主MIDlet類為:first3d.First3DMIDlet
4、將代碼保存在你的工程目錄下的first3d目錄下。
5、將J2MEWTK安裝目錄下的
aPPS\Demo3D\res\com\superscape\m3g\wtksamples\retainedmode\content目錄中的swerve.m3g文件復制到你的工程目錄下的res目錄下。
6、你的工程建立後,設置工程,通過WTK界面中的“設置”按鈕打開設置窗口,在“API選擇”中,設置“目標平台”為:自定義;“簡檔”為“MIDP2.0”;“配置”為“CLDC1.1”;選中“Mobile3DGraphicsforJ2ME(JSR184)”。
7、這樣你就可以編譯和運行以下代碼了。
J2ME 3D編程的第一個3D程序源代碼如下:
- //First3DMIDlet.Java
- packagefirst3d;
- importJavax.microedition.midlet.*;
- importJavax.microedition.lcdui.*;
- publicclassFirst3DMIDletextendsMIDlet{
- privateFirst3DCanvasdisplayable=newFirst3DCanvas();
- publicvoidstartApp(){
- Display.getDisplay(this).setCurrent(displayable);
- }
- publicvoidpauseApp(){}
- publicvoiddestroyApp(booleanunconditional){}
- }
- //First3Dcanvas.Java
- packagefirst3d;
- importJavax.microedition.lcdui.*;
- importJavax.microedition.m3g.*;
- importJava.util.*;
- /**
- *第一個3D程序
- */
- publicclassFirst3DCanvas
- extendsCanvas
- implementsRunnable{
- /**World對象*/
- privateWorldmyWorld=null;
- /**Graphics3D對象*/
- privateGraphics3Dg3d=Graphics3D.getInstance();
- /**Camera對象*/
- privateCameracam=null;
- privateintvIEwport_x;
- privateintvIEwport_y;
- privateintvIEwport_width;
- privateintvIEwport_height;
- privatelongworldStartTime=0;
- //重繪時間
- privateintvalidity=0;
- publicFirst3DCanvas(){
- //啟動重繪界面的線程
- Threadthread=newThread(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=newfloat[4];
- inttype=cam.getProjection(params);
- if(type!=Camera.GENERIC){
- //calculatewindowASPectratio
- floatwASPect=vIEwport_width/vIEwport_height;
- if(wASPect<params[1]){
- floatheight=vIEwport_width/params[1];
- vIEwport_height=(int)height;
- vIEwport_y=(getHeight()-vIEwport_height)/2;
- }
- else{
- floatwidth=vIEwport_height*params[1];
- vIEwport_width=(int)width;
- vIEwport_x=(getWidth()-vIEwport_width)/2;
- }
- }
- worldStartTime=System.currentTimeMillis();
- }
- catch(Exceptione){}
- }
- protectedvoidpaint(Graphicsg){
- //清除背景
- g.setColor(0x00);
- g.fillRect(0,0,getWidth(),getHeight());
- //和3D對象綁定
- g3d.bindTarget(g);
- g3d.setViewport(viewport_x,vIEwport_y,
- viewport_width,vIEwport_height);
- longstartTime=System.currentTimeMillis()-worldStartTime;
- validity=myWorld.animate((int)startTime);
- try{
- g3d.render(myWorld);
- }
- finally{
- g3d.releaseTarget();
- }
- }
- publicvoidrun(){
- try{
- while(true){
- //重繪圖形
- repaint(viewport_x,vIEwport_y,
- viewport_width,vIEwport_height);
- }
- }catch(Exceptione){}
- }
- }