既然现在你已对3d api比较熟悉并了解了3d图形是如何加入到移动java应用程序中的。下面将继续告诉你怎样使用3d造型软件以使编码和设计更为简单。
如今,3d图形几乎是任何一部游戏的关键部分,甚至一些应用程序也通过用3d形式来描述信息而获得了成功。如前文中所述,以立即模式和手工编码建立所有的3d对象的方式进行开发速度很慢且很复杂。应用程序中多边形的所有角点必须在数组中独立编码。在jsr 184中,这称为立即模式。
另外一种更高级的模式称为保留模式,它允许设计者使用诸如3d max studio等3d建模软件来设计场景图,然后把它们应用在程序中。
二、3d编辑器
现在,最流行的商业动画制作软件应是3d studio max,它支持输出模型或场景图到m3g格式(jsr 184中指定的文件格式)。该文件格式是专门制订的,以适用于移动设备的特有需要。然而,3d studio max非常昂贵,即使它是一个很好的工具,也可能并不适合于任何一个人。
superscape公司有他自己的swerve产品家族(swerve studio,swerve client,swerve content),以帮助软件开发者来开发3d java和本机应用程序。遗憾的是,swerve studio仅适于有限数目的对superscape非常熟悉的开发者。
还有一个自由工具可以选择使用:blender。blender是一个开源的3d造型工具,其实它的功能相当强大。你可以用blender来进行任何3d设计-从简单的造型到完整的动画制作。尽管现在还没有输出工具来输出blender模型到m3g文件中,但是可能很快就出现一些可用的工具(因为blender是开源的)。
三、建模
如何在midp应用程序中使用m3g 文件呢?首先,你需要一个已有某种3d模型的m3g文件。你可以用google引擎快速查找一下,也可以使用和wirelesstoolkit 2.2(在demo3d 文件夹下)开发包一起发布的现成文件。在本文中,我们将对sun的pogoroo例程作深度修改(简化)。我们不让它动起来或者做任何奇特的事情,而仅仅在屏幕上展示各个对象。
四、加载world(世界)
首先,要从m3d文件中加载world。在pogoroo.m3g文件中,你会看到一只袋鼠在一根弹簧单高跷杆上跳跃,其身边是一片绿茵。下面的列表1调用了加载器类的方法load()。
列表1. 加载世界
| try { //从m3d文件中加载world myworld = (world)loader.load("/pogoroo.m3g")[0]; getobjects(); setupaspectratio(); } catch(exception e) { e.printstacktrace(); } |
| try { troo = (group) myworld.find(pogoroo); tcams = (group) myworld.find(camera); acroo = (group) myworld.find(transform); animroo = (animationcontroller) myworld.find(roo); //取得动画的长度 animationtrack track = acroo.getanimationtrack(0); animlength = 1000; // 缺省长度为1秒 if (track != null) { keyframesequence ks = track.getkeyframesequence(); if (ks != null) animlength = ks.getduration(); } } catch(exception e) { e.printstacktrace(); } |
| void setupaspectratio() { viewport_x = 0; viewport_y = 0; viewport_width = mycanvas.getwidth(); viewport_height = mycanvas.getheight(); camera cam = myworld.getactivecamera(); float[] params = new float[4]; int type = cam.getprojection(params); if(type != camera.generic) { //计算窗口的宽高比 float waspect=viewport_width/viewport_height; if (waspect<params[1]) { float height = viewport_width/params[1]; viewport_height=(int)height; viewport_y=(mycanvas.getheight()-viewport_height)/2; } else { float width = viewport_height*params[1]; viewport_width=(int)width; viewport_x=(mycanvas.getwidth()-viewport_width)/2; } } } |
| private class refreshtask extends timertask { public void run(){ if(mycanvas != null && mygraphics3d != null && myworld != null) { int starttime = (int)system.currenttimemillis(); int validity = myworld.animate(starttime); mycanvas.repaint(viewport_x, viewport_y, viewport_width, viewport_height); } } } |
[1] [2] 下一页
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器