J2ME 3D編程——第一個3D程式

來源:互聯網
上載者:User
編程|程式 J2ME 3D編程——第一個3D程式(附原始碼)

更多文章請訪問:http://blog.csdn.net/mailbomb



參考WTK2.2提供的demo,完成了第一個3D程式,雖然很簡單,而且有些問題還不是很清楚,還是把代碼共用出來和願意學習J2ME 3D編程的朋友一起學習。

關於3D編程的資料,可以查閱我的blog。



關於代碼的編譯和運行說明如下:

1、 以下代碼在J2ME WTK2.2下面編譯通過。

2、 代碼分為兩個檔案:First3DCanvas.java和First3DMIDlet.java。

3、 使用J2ME WTK2.2建立新的工程,主MIDlet類為:first3d. First3DMIDlet

4、 將代碼儲存在你的工程目錄下的first3d目錄下。

5、 將J2ME WTK安裝目錄下的

apps\Demo3D\res\com\superscape\m3g\wtksamples\retainedmode\content目錄中的swerve.m3g檔案複製到你的工程目錄下的res目錄下。

6、 你的工程建立後,設定工程,通過WTK介面中的“設定”按鈕開啟設定視窗,在“API選擇”中,設定“目標平台”為:自訂;“簡檔”為“MIDP2.0”;“配置”為“CLDC1.1”;選中“Mobile 3D Graphics for J2ME(JSR184)”。

7、 這樣你就可以編譯和運行以下代碼了。



原始碼如下:

// First3DMIDlet.java

package first3d;



import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;



public class First3DMIDlet extends MIDlet {

private First3DCanvas displayable = new First3DCanvas();



public void startApp() {

Display.getDisplay(this).setCurrent(displayable);

}



public void pauseApp() {}



public void destroyApp(boolean unconditional) {}

}







// First3Dcanvas.java

package first3d;



import javax.microedition.lcdui.*;

import javax.microedition.m3g.*;

import java.util.*;



/**

* 第一個3D程式

*/

public class First3DCanvas

extends Canvas

implements Runnable {

/**World對象*/

private World myWorld = null;

/**Graphics3D對象*/

private Graphics3D g3d = Graphics3D.getInstance();

/**Camera對象*/

private Camera cam = null;

private int viewport_x;

private int viewport_y;

private int viewport_width;

private int viewport_height;

private long worldStartTime = 0;

//重繪時間

private int validity = 0;





public First3DCanvas() {

//啟動重繪介面的線程

Thread thread = new Thread(this);

thread.start();

try {

//匯入3D圖片

myWorld = (World) Loader.load("/swerve.m3g")[0];

viewport_x = 0;

viewport_y = 0;

viewport_width = getWidth();

viewport_height = getHeight();

cam = myWorld.getActiveCamera();

//設定cam對象

float[] params = new float[4];

int type = cam.getProjection(params);

if (type != Camera.GENERIC) {

//calculate window aspect ratio

float waspect = viewport_width / viewport_height;



if (waspect < params[1]) {

float height = viewport_width / params[1];

viewport_height = (int) height;

viewport_y = (getHeight() - viewport_height) / 2;

}

else {

float width = viewport_height * params[1];

viewport_width = (int) width;

viewport_x = (getWidth() - viewport_width) / 2;

}

}

worldStartTime = System.currentTimeMillis();

}

catch (Exception e) {}

}



protected void paint(Graphics g) {

//清除背景

g.setColor(0x00);

g.fillRect(0, 0, getWidth(), getHeight());

//和3D對象綁定

g3d.bindTarget(g);

g3d.setViewport(viewport_x, viewport_y, viewport_width, viewport_height);

long startTime = System.currentTimeMillis() - worldStartTime;

validity = myWorld.animate((int)startTime);

try {

g3d.render(myWorld);

}

finally {

g3d.releaseTarget();

}

}



public void run() {

try{

while(true){

//重繪圖形

repaint(viewport_x, viewport_y, viewport_width, viewport_height);

}

}catch(Exception e){}

}

}



相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

11.11 Big Sale for Cloud

Get Unbeatable Offers with up to 90% Off,Oct.24-Nov.13 (UTC+8)

Get It Now >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。