国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

為基于J2ME的手機開發移動3D游戲

2019-11-18 15:37:12
字體:
來源:轉載
供稿:網友
一、簡述

  既然現在你已對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例程(編者注:Sun開發工具包自帶例程)作深度修改(簡化)。我們不讓它動起來或者做任何奇異的事情,而僅僅在屏幕上展示各個對象。

  四、加載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   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;
  }
 }
}

  七、刷新視圖

  為了刷新視圖,你可以用TimerTask來調用畫布的repaint()方法。另一種方法是直接使用線程,然后創建ExampleCanvas(畫布類的名字)來實現Runnable接口。

  列表4. 刷新視圖

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);
  }
 }
}
八、完整的例程代碼分析

  在列表5中,你會看到應用程序的完整代碼。雖然長些,但是比Sun的例子要簡單許多。你可以通過給應用程序添加上一些動作和邏輯來練習你的MIDP技能。

  列表5. 完整的例程代碼

package com.kontio;



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 随州市| 固始县| 邵武市| 安庆市| 焉耆| 易门县| 贵州省| 贵德县| 孟连| 长岭县| 黔东| 台前县| 阿克陶县| 桦川县| 黑水县| 岫岩| 专栏| 邹城市| 广水市| 图们市| 潮安县| 兴隆县| 泰和县| 高雄县| 祁东县| 岳阳县| 黄陵县| 炎陵县| 德化县| 临西县| 亚东县| 永福县| 醴陵市| 淮南市| 梅河口市| 永安市| 秭归县| 巨鹿县| 广州市| 林口县| 黔南|