选择显示字体大小

为j2me开发移动3d游戏之保留模式

  既然现在你已对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();
}

  五、从3d世界中取得对象

  3d世界已经被加载,现在你必须从中取得各个对象(见列表2)。这里,3d世界中有四个对象,其中之一是有关动画(袋鼠在单脚跳)的信息。你可以使用world的find()方法来取得这些对象。

  列表2. 从3d world中取得对象

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();
}

  六、设置窗口宽高比例

  你必须设置窗口的宽高比例以使对象能够正确着色。列表3中的代码是未改动的-基本上同sun的例子一样。首先,检查画布的宽度和高度,然后根据相机的类型来计算宽高比例。

  列表3. 设置宽高比例

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]) &#123;
   float height = viewport_width/params[1];
   viewport_height=(int)height;
   viewport_y=(mycanvas.getheight()-viewport_height)/2;
  &#125;
  else &#123;
   float width = viewport_height*params[1];
   viewport_width=(int)width;
   viewport_x=(mycanvas.getwidth()-viewport_width)/2;
  &#125;
 &#125;
&#125;

  七、刷新视图

  为了刷新视图,你可以用timertask来调用画布的repaint()方法。另一种方法是直接使用线程,然后创建examplecanvas(画布类的名字)来实现runnable接口。

  列表4. 刷新视图

private class refreshtask extends timertask
&#123;
 public void run()&#123;
  if(mycanvas != null && mygraphics3d != null && myworld != null) &#123;
   int starttime = (int)system.currenttimemillis();
   int validity = myworld.animate(starttime);
   mycanvas.repaint(viewport_x, viewport_y, viewport_width,
   viewport_height);
  &#125;
 &#125;
&#125;

  八、完整的例程代码分析

  在列表5中,你会看到应用程序的完整代码。虽然长些,但是比sun的例子要简单许多。你可以通过给应用程序添加上一些动作和逻辑来练习你的midp技能。

[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   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons