全面认识J2ME 3D技术
创始人
2024-07-15 17:00:42
0

本文和大家重点学习一下J2ME 3D技术,3D技术对我们来说已经非常熟悉了,最常用的3DAPI有OpenGL和Microsoft的Direct3D,在桌面游戏中早已广泛应用。

J2ME 3D技术简介

3D技术对我们来说已经非常熟悉了,最常用的3DAPI有OpenGL和Microsoft的Direct3D,在桌面游戏中早已广泛应用。对于J2ME程序而言,Mobile3DGraphicsAPI(JSR184)的出现,使得为手机应用程序添加3D功能成为可能。

◆JSR184标准(M3G:Mobile3DGraphics)为Java移动应用程序定义了一个简洁的3DAPI接口,J2ME程序可以非常方便地使用M3G来实现3D应用比如游戏等等。M3G被设计为非常轻量级的,整个API的完整实现不超过150kb。

M3G是J2ME的一个可选包,以OpenGL为基础的精简版,一共有30个类,运行在CLDC1.1/CLDC2.0上(必须支持浮点运算),可以在MIDP1.0和MIDP2.0中使用。目前,支持M3G的手机有Nokia6230/3650/7650/6600、SiemensS65/CX65/S55/M55、Sony-EricssonK700i/P800/P900、Moto220/T720等。M3G只是一个Java接口,具体的底层3D引擎一般由C代码实现,比如许多手机厂商的3D引擎采用的便是SuperScape公司的Swerve引擎,这是一个专门为移动设备设计的高性能3D引擎。

类似于Microsoft的D3D,M3G支持两种3D模式:立即模式(immediatemode)和保留模式(retainedmode)。在立即模式下,开发者必须手动渲染每一帧,从而获得较快的速度,但代码较繁琐;在保留模式下,开发者只需设置好关键帧,剩下的动画由M3G完成,代码较简单,但速度较慢。M3G也允许混合使用这两种模式。

◆3D模型可以在程序中创建,但是非常繁琐。因此,M3G提供一个Loader类,允许直接从一个单一的.m3g文件中读入全部3D场景。m3g文件可以通过3DStudioMax之类的软件创建。

如果熟悉OpenGL,那么M3G是非常容易理解的。在M3G中,Graphics3D是3D渲染的屏幕接口,World代表整个3D场景,包括Camera(用于设置观察者视角)、Light(灯光)、Background(背景)和树型结构的任意数量的3D物体。3D对象在计算机中用点(Point,Pixel)、线(Line,Polyline,Spline)、面(Mesh)来描述,具体存储和运算(如旋转、投影)都是矩阵运算和变换。

SUN的WTK2.2已经内置了M3G的实现包,如果安装了WTK2.2,就可以在模拟器上运行3DMIDP程序。可以参考WTK2.2的示例demo3d。

◆下面是一个最简单的M3G程序,来自Sony-Ericsson的示例代码,它创建一个旋转的金字塔,可以从此处下载完整代码并在WTK2.2中运行。

首先,我们要获得唯一的Graphics3D实例,用于渲染3D场景。Graphics3D是一个Singleton实现,可以在任何地方获得:

  1. g3d=Graphics3D.getInstance();  
  2.  

然后,在Canvas中渲染:

  1. publicclassMyCanvasextendsCanvas  
  2. {  
  3. publicvoidpaint(Graphicsg){  
  4. try{  
  5. g3d.bindTarget(g);  
  6. ...updatethescene...  
  7. ...renderthescene...  
  8. }finally{  
  9. g3d.releaseTarget();  
  10. }  
  11. }  
  12.  

 接下来创建一个World并设置Camera:

  1. world=newWorld();  
  2. camera=newCamera();  
  3. world.addChild(camera);  
  4. //Thewidthandheightofthecanvas.  
  5. floatw=getWidth();  
  6. floath=getHeight();  
  7. //Constructsaperspectiveprojectionmatri
  8. xandsetsthatasthecurrentprojectionmatrix.  
  9. camera.setPerspective(60.0f,w/h,0.1f,50f);  
  10. world.setActiveCamera(camera);  
  11.  

 接着,在createPyramid()方法中创建一个Mesh,代表金字塔,并添加到World中:

  1. privateMeshpyramidMesh;//thepyramidinthescene  
  2.  
  3. pyramidMesh=createPyramid();//createourpyramid.  
  4. pyramidMesh.setTranslation(0.0f,0.0f,-3.0f);
  5. //movethepyramid3unitsintothescreen.  
  6. world.addChild(pyramidMesh);//addthepyramidtotheworld  
  7.  

 ***,在一个线程中让金字塔绕Y轴旋转起来: 

  1. publicvoidrun(){  
  2. Graphicsg=getGraphics();  
  3. while(true){  
  4. //rotatethepyramid1degreearoundtheY-axis.  
  5. pyramidMesh.postRotate(3.0f,0.0f,1.0f,0.0f);  
  6. draw3D(g);  
  7. flushGraphics();  
  8. }  

【编辑推荐】

  1. J2ME平台中Cookie技术的应用
  2. J2ME Snake脚本引擎使用手册
  3. 解析Javascript对select下拉列表操作
  4. 技术分享 如何识别控制DHTML和JS中的页面元素
  5. 深入学习JavaScript中Function对象语法 

 

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...