剖析J2ME 3D编程的第一个3D程序

本文和大家重点讨论一下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、这样你就可以编译和运行以下代码了。#p#

J2ME 3D编程的***个3D程序源代码如下: 

 
 
 
  1. //First3DMIDlet.java  
  2.  
  3. packagefirst3d;  
  4.  
  5. importjavax.microedition.midlet.*;  
  6.  
  7. importjavax.microedition.lcdui.*;  
  8.  
  9. publicclassFirst3DMIDletextendsMIDlet{  
  10.  
  11. privateFirst3DCanvasdisplayable=newFirst3DCanvas();  
  12.  
  13.  
  14. publicvoidstartApp(){  
  15.  
  16. Display.getDisplay(this).setCurrent(displayable);  
  17.  
  18. }  
  19.  
  20. publicvoidpauseApp(){}  
  21.  
  22. publicvoiddestroyApp(booleanunconditional){}  
  23.  
  24. }  
  25.  
  26. //First3Dcanvas.java  
  27.  
  28. packagefirst3d;  
  29.  
  30. importjavax.microedition.lcdui.*;  
  31.  
  32. importjavax.microedition.m3g.*;  
  33.  
  34. importjava.util.*;  
  35.  
  36. /**  
  37.  
  38. ****个3D程序  
  39.  
  40. */  
  41.  
  42. publicclassFirst3DCanvas  
  43.  
  44. extendsCanvas  
  45.  
  46. implementsRunnable{  
  47.  
  48. /**World对象*/  
  49.  
  50. privateWorldmyWorld=null;  
  51.  
  52. /**Graphics3D对象*/  
  53.  
  54. privateGraphics3Dg3d=Graphics3D.getInstance();  
  55.  
  56. /**Camera对象*/  
  57.  
  58. privateCameracam=null;  
  59.  
  60. privateintviewport_x;  
  61.  
  62. privateintviewport_y;  
  63.  
  64. privateintviewport_width;  
  65.  
  66. privateintviewport_height;  
  67.  
  68. privatelongworldStartTime=0;  
  69.  
  70. //重绘时间  
  71.  
  72. privateintvalidity=0;  
  73.  
  74. publicFirst3DCanvas(){  
  75.  
  76. //启动重绘界面的线程  
  77.  
  78. Threadthread=newThread(this);  
  79.  
  80. thread.start();  
  81.  
  82. try{  
  83.  
  84. //导入3D图片  
  85.  
  86. myWorld=(World)Loader.load("/swerve.m3g")[0];  
  87.  
  88. viewport_x=0;  
  89.  
  90. viewport_y=0;  
  91.  
  92. viewport_width=getWidth();  
  93.  
  94. viewport_height=getHeight();  
  95.  
  96. cam=myWorld.getActiveCamera();  
  97.  
  98. //设置cam对象  
  99.  
  100. float[]params=newfloat[4];  
  101.  
  102. inttype=cam.getProjection(params);  
  103.  
  104. if(type!=Camera.GENERIC){  
  105.  
  106. //calculatewindowaspectratio  
  107.  
  108. floatwaspect=viewport_width/viewport_height;  
  109.  
  110. if(waspect<params[1]){  
  111.  
  112. floatheight=viewport_width/params[1];  
  113.  
  114. viewport_height=(int)height;  
  115.  
  116. viewport_y=(getHeight()-viewport_height)/2;  
  117.  
  118. }  
  119.  
  120. else{  
  121.  
  122. floatwidth=viewport_height*params[1];  
  123.  
  124. viewport_width=(int)width;  
  125.  
  126. viewport_x=(getWidth()-viewport_width)/2;  
  127.  
  128. }  
  129.  
  130. }  
  131.  
  132. worldStartTime=System.currentTimeMillis();  
  133.  
  134. }  
  135.  
  136. catch(Exceptione){}  
  137.  
  138. }  
  139.  
  140. protectedvoidpaint(Graphicsg){  
  141.  
  142. //清除背景  
  143.  
  144. g.setColor(0x00);  
  145.  
  146. g.fillRect(0,0,getWidth(),getHeight());  
  147.  
  148. //和3D对象绑定  
  149.  
  150. g3d.bindTarget(g);  
  151.  
  152. g3d.setViewport(viewport_x,viewport_y,
  153. viewport_width,viewport_height);  
  154.  
  155. longstartTime=System.currentTimeMillis()-worldStartTime;  
  156.  
  157. validity=myWorld.animate((int)startTime);  
  158.  
  159. try{  
  160.  
  161. g3d.render(myWorld);  
  162.  
  163. }  
  164.  
  165. finally{  
  166.  
  167. g3d.releaseTarget();  
  168.  
  169. }  
  170. }  
  171.  
  172. publicvoidrun(){  
  173.  
  174. try{  
  175.  
  176. while(true){  
  177.  
  178. //重绘图形  
  179.  
  180. repaint(viewport_x,viewport_y,
  181. viewport_width,viewport_height);  
  182. }  
  183.  
  184. }catch(Exceptione){}  
  185. }  
  186. }  

【编辑推荐】

  1. 术语汇编 J2ME 3D技术简介
  2. 深入了解J2ME Polish+Eclipse配置过程
  3. 探究J2ME中cookie库的管理
  4. Eclipse中进行JVM内存设置
  5. 解析Linux下如何用eclipse搭建J2ME开发环境

 

THE END