`
micheal19840929
  • 浏览: 163183 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

M3G教程:进阶篇(四)模型

    博客分类:
  • J2ME
阅读更多

 

import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.m3g.Camera;
import javax.microedition.m3g.Graphics3D;
import javax.microedition.m3g.Light;
import javax.microedition.m3g.Loader;
import javax.microedition.m3g.Object3D;
import javax.microedition.m3g.Transform;
import javax.microedition.m3g.World;


public class M3GCanvas extends GameCanvas implements Runnable {
	
	public static final int FPS = 50;	//每秒绘制的帧数
	
//	 Thread-control
	boolean running = false;

	boolean done = true;

	// If the game should end
	public static boolean gameOver = false;

	// Rendering hints
	public static final int STRONG_RENDERING_HINTS = Graphics3D.ANTIALIAS
			| Graphics3D.TRUE_COLOR | Graphics3D.DITHER;

	public static final int WEAK_RENDERING_HINTS = 0;

	public static int RENDERING_HINTS = STRONG_RENDERING_HINTS;

	// Key array
	boolean[] key = new boolean[5];

	// Key constants
	public static final int FIRE = 0;
	public static final int UP = 1;
	public static final int DOWN = 2;
	public static final int LEFT = 3;
	public static final int RIGHT = 4;

	// Global identity matrix
	Transform identity = new Transform();

	// Camera rotation
	float camRot = 0.0f;

	double camSine = 0.0f;

	double camCosine = 0.0f;

	// Head bobbing
	float headDeg = 0.0f;

	private Graphics3D g3d;
	private World world;
	private boolean runnable=true;
	private Thread thread;
	private Camera camera;

	protected M3GCanvas() {
		super(false);
		setFullScreenMode(true);
		g3d = Graphics3D.getInstance();
		
		//Load our world
		loadWorld();

		// Load our camera
		loadCamera();
	}
	
	/** Loads our camera */
	private void loadCamera() {
		// BAD!
		if (world == null)
			return;

		// Get the active camera from the world
		camera = world.getActiveCamera();

		// Create a light
		Light l = new Light();

		// Make sure it's AMBIENT
		l.setMode(Light.AMBIENT);

		// We want a little higher intensity
		l.setIntensity(3.0f);

		// Add it to our world
		world.addChild(l);
	}

	/** Loads our world */
	private void loadWorld() {
		try {
			// Loading the world is very simple. Note that I like to use a
			// res-folder that I keep all files in. If you normally just put
			// your
			// resources in the project root, then load it from the root.
			Object3D[] buffer = Loader.load("/map.m3g");

			// Find the world node, best to do it the "safe" way
			for (int i = 0; i < buffer.length; i++) {
				if (buffer[i] instanceof World) {
					world = (World) buffer[i];
					break;
				}
			}

			// Clean objects
			buffer = null;
		} catch (Exception e) {
			// ERROR!
			System.out.println("Loading error!");
			reportException(e);
		}
	}
	
	private void moveCamera() {
		// Check controls
		if (key[LEFT]) {
			camRot += 5.0f;
		} else if (key[RIGHT]) {
			camRot -= 5.0f;
		}

		// Set the orientation
		camera.setOrientation(camRot, 0.0f, 1.0f, 0.0f);

		// Calculate trigonometry for camera movement
		double rads = Math.toRadians(camRot);
		camSine = Math.sin(rads);
		camCosine = Math.cos(rads);

		if (key[UP]) {
			// Move forward
			camera.translate(-2.0f * (float) camSine, 0.0f, -2.0f
					* (float) camCosine);

			// Bob head
			headDeg += 0.5f;

			// A simple way to "bob" the camera as the user moves
			camera.translate(0.0f, (float) Math.sin(headDeg) / 3.0f, 0.0f);
		} else if (key[DOWN]) {
			// Move backward
			camera.translate(2.0f * (float) camSine, 0.0f,
					2.0f * (float) camCosine);

			// Bob head
			headDeg -= 0.5f;

			// A simple way to "bob" the camera as the user moves
			camera.translate(0.0f, (float) Math.sin(headDeg) / 3.0f, 0.0f);
		}

		// If the user presses the FIRE key, let's quit
		if (key[FIRE])
			System.out.println("Fire");
	}
	
	private void reportException(Exception e) {
		System.out.println(e.getMessage());
		System.out.println(e);
		e.printStackTrace();
	}
	
	protected void process() {
		int keys = getKeyStates();

		if ((keys & GameCanvas.FIRE_PRESSED) != 0)
			key[FIRE] = true;
		else
			key[FIRE] = false;

		if ((keys & GameCanvas.UP_PRESSED) != 0)
			key[UP] = true;
		else
			key[UP] = false;

		if ((keys & GameCanvas.DOWN_PRESSED) != 0)
			key[DOWN] = true;
		else
			key[DOWN] = false;

		if ((keys & GameCanvas.LEFT_PRESSED) != 0)
			key[LEFT] = true;
		else
			key[LEFT] = false;

		if ((keys & GameCanvas.RIGHT_PRESSED) != 0)
			key[RIGHT] = true;
		else
			key[RIGHT] = false;
	}

	public void run() {
		Graphics g = getGraphics();
		while (runnable) {
			long startTime = System.currentTimeMillis();
			
			//Call the process method (computes keys)
			process();

			//Move the camera around
			moveCamera();
			
			try {
				//First bind the graphics object. We use our pre-defined rendering
				// hints.
				g3d.bindTarget(g, true, RENDERING_HINTS);
				//Now, just render the world. Simple as pie!
				g3d.render(world);
			} finally {
				g3d.releaseTarget();
			}
			flushGraphics();
			
			long endTime = System.currentTimeMillis();
            long costTime = endTime - startTime;
            if(costTime<1000/FPS)
            {
                try{
                  Thread.sleep(1000/FPS-costTime);
                }
                catch(Exception e){
                   e.printStackTrace();
                }
            }
		}
		System.out.println("Canvas stopped");

	}
	
	public void start()
	{
		thread=new Thread(this);
		thread.start();
	}
	
	public void stop()
	{
		this.runnable=false;
		try {
			thread.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

}

 效果如下:

分享到:
评论

相关推荐

    宝箧印塔模型设计m3g

    《宝箧印塔模型设计与实现——基于Java M3G技术》 在移动设备领域,尤其是在支持Java 2 Micro Edition(J2ME)的手机上,实现三维图形渲染是一项技术挑战。本文将深入探讨如何利用Java M3G(Mobile 3D Graphics)...

    M3G API Docs

    2. **对象模型**:M3G API提供了一系列的对象,如World、Transform、Appearance、Image等,它们代表了3D图形的不同方面,如世界坐标系、物体变换、表面外观和图像纹理。 3. **3D几何**:掌握如何使用M3G API创建和...

    M3G Viewer:查看M3G文件内容-开源

    M3G查看器是一个独立的应用程序,用于查看3D图形文件格式的内容,该格式是对移动3D图形API(M3G)的补充。

    tk_m3gtk_v4_5.zip_m3g_tk_m3g_tk_m3gtk_v4_5

    1. **M3G解析器**:这是程序的核心部分,负责读取M3G文件的二进制数据,解析出模型的几何信息、材质属性、光照设置、动画序列等,并将其转化为可以显示的结构。 2. **3D渲染引擎**:利用Java J2ME的图形库,将解析...

    jsr_184_midlet.rar_DEMO_jsr184_jsr184-m3g.jar_m3g

    4. **m3g**:这是M3G文件格式的提及,它是JSR 184中定义的一种专为移动设备优化的3D模型格式。这种格式旨在减少存储空间和内存需求,同时保持足够的图形质量,以适应资源有限的移动设备。 在DEMO程序中,`jsr_184_...

    J2ME_M3G_API.rar_M3G API_j2me 3d_j2me m_jsr 184 api c_m3g a

    **J2ME_M3G_API** 是一个与Java 2 Micro Edition(J2ME)相关的压缩包,专注于M3G(Mobile 3D Graphics)API的文档。M3G API是J2ME平台上的一个标准,它允许开发者创建在移动设备上运行的3D图形应用程序。JSR 184...

    M3G 的快速模式编程

    【M3G 快速模式编程】:M3G,全称Mobile 3D Graphics API,是基于JSR 184规范定义的一种为移动设备提供标准3D图形功能的API。它分为快速模式和保留模式。快速模式专注于单个3D对象的渲染,适合进行低级别的3D操作,...

    Mobile 3D Graphics with OpenGL ES and M3G

    《Mobile 3D Graphics with OpenGL ES and M3G》是一本深入探讨移动设备上3D图形编程的专业书籍,主要关注于OpenGL ES和M3G这两个技术。OpenGL ES(OpenGL for Embedded Systems)是OpenGL的轻量级版本,专为嵌入式...

    M3M0:M3m0工具:crossed_swords:网站漏洞扫描程序和自动利用程序

    M3M0渗透测试工具 M3m0工具 :crossed_swords: 网站漏洞扫描程序和自动浏览器您可以使用此工具通过在网站中找到漏洞来检查安全性,也可以使用此工具来获取Shell | 污损| cPanels | 资料库 M3M0 :laptop:M3m0工具 :...

    M3G2FBX_neko_

    "M3G2FBX_neko_" 提供了解决这一问题的解决方案,它是一款专为游戏设计的模型转换工具,主要功能是将M3G格式的模型转换为FBX格式。M3G是一种由Java 3D API支持的3D模型格式,而FBX则是Autodesk的通用3D模型交换格式...

    m3_export_3dsmax m3模型导出

    M3 Import Script,3ds Max 的M3模型导出

    M3_ARIMA:在 M3 比赛数据上快速训练 arima 模型

    **M3_ARIMA:在M3比赛数据上快速训练ARIMA模型** ARIMA(自回归整合滑动平均模型)是时间序列分析中的一个重要工具,常用于预测未来趋势。M3比赛是一个著名的时间序列预测竞赛,提供了大量真实世界的时间序列数据,...

    LoaderM3G.rar_j2me loaderm_m3g_手机加载_手机游戏加载

    3. **加载模型**:根据解析出的数据,创建M3G模型实例,并将它们添加到场景中。 4. **应用纹理和动画**:将M3G文件中包含的纹理映射到模型表面,并根据需要启动动画。 5. **渲染帧**:使用M3G API的渲染函数,每帧...

    Java M3G相关类.rar

    Java M3G是Java Micro Edition (JME) 平台上用于移动设备3D图形开发的API,它基于OpenGL ES标准,使得开发者能够在手机等嵌入式设备上创建复杂的3D游戏和应用程序。这个"Java M3G相关类.rar"压缩包包含了一些关键的...

    M3GToolkit-0.5.0

    《M3GToolkit-0.5.0:深入解析M3G文件检查工具》 M3GToolkit-0.5.0是一款专为J2ME(Java 2 Micro Edition)开发者设计的实用工具,用于检查和分析M3G(Mobile 3D Graphics)文件。在移动设备上的3D图形开发中,M3G...

    jsr184+M3G+API.rar

    M3G与JSR 184的关系是,JSR 184是Java对M3G标准的实现,使得开发者可以通过Java语言来操作M3G模型。 **API接口** API接口是开发者与这些技术交互的桥梁。JSR 184 API提供了一系列的类和接口,如`javax.microedition...

    M3Gtools 3D开发必备

    1. **M3G标准**:理解M3G的核心特性,包括顶点数组、纹理映射、光照模型、动画系统等,是使用M3GTools的基础。M3G标准强调了低内存占用和高效渲染,适合移动平台。 2. **3D模型转换**:M3GConverter的工作原理和...

    [JSR-184][3D编程指南]Part V: Heightmap terrain rendering using M3G

    这篇【3D编程指南】的第五部分主要探讨的是使用M3G来实现地形渲染,特别是基于高度图(Heightmap)的地形渲染技术。 首先,理解高度图的概念至关重要。高度图是一种2D图像,其中每个像素的灰度值代表一个3D网格中的...

    一款纯静态的M3U8播放器页面

    源码说明:一个纯静态的M3U8播放器页面,可以直接把M3U8的网址填进去进行播放,超级方便。 部署方法: 可以使用宝塔面板来部署 1,打开宝塔面板,添加一个网站 2,把压缩包上传到站点跟目录,然后解压 3,解压以后...

    联想BIOS_L-IG41M3 V1.1 版本:DMKT05AUS 新圆梦F208

    联想BIOS_L-IG41M3 V1.1 版本:DMKT05AUS 新圆梦F208 原机备份 支持Q9400 支持8G内存 需两条4G双面内存 两个BIOS文件 AFUWIN备份的BIOS BIOS_Backup_TooKit_V2.0备份的BIOS

Global site tag (gtag.js) - Google Analytics