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

M3G教程:入门篇

    博客分类:
  • J2ME
阅读更多

      3D技术对我们来说已经非常熟悉了,最常用的3D API有OpenGL和Microsoft的Direct 3D,在桌面游戏中早已广泛应用。对于J2ME程序而言,Mobile 3D Graphics API(JSR184)的出现,使得为手机应用程序添加3D功能成为可能。
      JSR184标准(M3G:Mobile 3D Graphics)为Java移动应用程序定义了一个简洁的3D API接口,J2ME程序可以非常方便地使用M3G来实现3D应用比如游

戏等等。M3G被设计为非常轻量级的,整个API的完整实现不超过150kb。
      如果熟悉OpenGL技术,那么M3G是非常容易理解的。在JSR-184中,Graphics3D是3D渲染的屏幕接口,World代表整个虚拟3D场景,包括Camera(用于设置观察者视角)、Light(灯光)、Background(背景)和树型结构的任意数量的3D物体。Camera默认是朝向Z轴的负方向。3D对象在计算机中用点(Point,Pixel)、线(Line,Polyline,Spline)、面(Mesh)来描述,各个物体都是由Mesh类创建的。不同的Mesh属性对应不同的物体。构造物体时

,先要构造物体的骨架(即形状),然后用一种材料蒙到骨架上。物体的形状,是由一组点和每个点的法向量决定的。材料则可以选择为图片。物体的具体存储和运算(如旋转、投影、特技处理)等动作都是矩阵运算和变换。
      M3G是J2ME的一个可选包,以OpenGL为基础的精简版,总共约有250个方法及30个类,运行在CLDC1.1/CLDC2.0上(必须支持浮点运算),可以在MIDP1.0和MIDP2.0中使用。目前,支持M3G的手机有Nokia 6230/3650/7650/6600、Siemens S65/CX65/S55/M55、Sony-Ericsson K700i/P800/P900、Moto 220/T720等。M3G只是一个Java接口,具体的底层3D引擎一般由C代码实现,比如许多手机厂商的3D引擎采用的便是SuperScape公司的Swerve引擎,这是一个专门为移动设备设计的高性能3D引擎。
      类似于Microsoft的D3D,M3G支持两种3D模式:立即模式(immediate mode)和保留模式(retained mode)。在立即模式下,开发者必须手动渲染每一帧,从而获得较快的速度,但代码较繁琐;在保留模式下,开发者只需设置好关键帧,剩下的动画由M3G完成,代码较简单,但速度较慢。M3G也允许混合使用这两种模式。
      3D模型可以在程序中创建,但是非常繁琐。因此,M3G提供一个Loader类,允许直接从一个单一的.m3g文件中读入全部3D场景。m3g文件可以通过3D Studio Max之类的软件创建。

 

      M3G基于的需求如下:
      1)支持保留的场景图形模式;
      2)支持直接访问模式;
      3)支持两种模式的混合;
      4)支持建模,结构,材质以及场景,灯光的三维要素;
      5)支持虚拟的浮点运算,不需要硬件支持的浮点运算;
      6)保证大小在实际终端小于150K
      7)高效的垃圾收集机制(我个人觉得这点非常的重要)
      8)能很好的和MIDP相关的应用接口衉作(当然指的就是Canvas)

 

      Mobile 3D Graphics API中有几个比较重要的类:

  1. Object3D:几乎包中所有类都继承自此类,并且所有可以渲染的类及从m3g文件中载入的类都是它的子类;
  2. World:整个场景图形结构的基础,所有3D对象都应加入到World对象中。当载入一个m3g文件时,其根对象一般就是一个World对象。当我们渲染场景时,只要将World对象作为一个渲染对象传递给Graphics3D对象即可。
  3. Graphics3D:3D图形上下文,是一个单例类,提供对象绑定接口,所有渲染都是通过它来实现的。
  4. Loader:针对所有场景图形、单独的分支以及属性对象的异步载入器(解析器)。可以用于载入m3g文件,即其中所以3D对象。

 基本的程序框架:

 

M3GCanvas.java

import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.m3g.Graphics3D;
import javax.microedition.m3g.World;

public class M3GCanvas extends GameCanvas implements Runnable {
	
	public static final int FPS = 20;	//每秒绘制的帧数

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

	protected M3GCanvas() {
		// 不抑制按钮事件
		super(false);
		setFullScreenMode(true);
		g3d = Graphics3D.getInstance();
		world = new World();
	}

	public void run() {
		Graphics g = getGraphics();
		while (runnable) {
			long startTime = System.currentTimeMillis();
			
			// 处理游戏逻辑
			try {
				// Binds the given Graphics or mutable Image2D
				// as the rendering target of this Graphics3D
				g3d.bindTarget(g);
				g3d.render(world); // Render the 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();
		}
	}

}

 

M3GDemo.java

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;


public class M3GDemo extends MIDlet implements CommandListener {
	
	private M3GCanvas canvas;

	public M3GDemo() {
		this.canvas=new M3GCanvas();
	}

	protected void destroyApp(boolean unconditional) throws MIDletStateChangeException {
		this.canvas.stop();
	}

	protected void pauseApp() {

	}

	protected void startApp() throws MIDletStateChangeException {
		Display.getDisplay(this).setCurrent(this.canvas);
		this.canvas.start();

	}

	public void commandAction(Command c, Displayable d) {
		notifyDestroyed();
	}

}

 

分享到:
评论

相关推荐

    M3G API Docs

    **M3G API Docs**,全称为Mobile 3D Graphics API文档,是针对移动设备上3D图形编程的一套接口规范。这套API旨在为手持设备如智能手机和平板电脑提供高效、低功耗的3D图形处理能力,使开发者能够创建出具有丰富视觉...

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

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

    M3G 的快速模式编程

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

    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...

    tk_m3gtk_v4_5.zip_m3g_tk_m3g_tk_m3gtk_v4_5

    《M3G文件查看器tk_m3gtk_v4_5:深入解析与应用》 M3G(Mobile 3D Graphics)是Java ME(Micro Edition)平台上的一个三维图形标准,用于在移动设备上实现高质量的3D图形渲染。tk_m3gtk_v4_5.zip是一款专为M3G文件...

    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工具 :...

    jsr_184_midlet.rar_DEMO_jsr184_jsr184-m3g.jar_m3g

    在提供的压缩包"jsr_184_midlet.rar_DEMO_jsr184_jsr184-m3g.jar_m3g"中,我们可以看到与JSR 184相关的几个关键元素: 1. **DEMO**:这是一个演示程序,用于展示JSR 184技术的实际应用。通过这个DEMO,开发者或用户...

    m3u8在线下载工具-m3u8视频在线提取工具

    m3u8在线下载工具_m3u8视频在线提取工具 在数字化的时代,网络视频已经成为我们娱乐和学习的重要来源。其中,M3U8是一种广泛用于流媒体传输的文件格式,尤其在高清视频领域。然而,直接下载M3U8格式的视频并不像下载...

    宝箧印塔模型设计m3g

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

    M3G2FBX_neko_

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

    Java M3G相关类.rar

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

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

    LoaderM3G.rar是一个关于J2ME(Java 2 Micro Edition)平台的资源包,主要涉及的是3D手机游戏开发中的M3G文件加载技术。M3G(Mobile 3D Graphics)是J2ME中用于实现移动设备上的3D图形渲染的规范,它为在功能受限的...

    M3u Parser:m3u和m3u8解析器-开源

    《深入理解M3U与M3U8:解析与Java实现》 M3U和M3U8是两种广泛应用于多媒体播放的索引文件格式,主要用于组织和播放音频、视频资源。它们在流媒体服务中扮演着至关重要的角色,允许用户连续地、无需等待下载完成即可...

    联想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

    M3U8Loader:M3U8装载机

    M3U8Loader是一个专为处理M3U8格式文件的工具,主要功能是加载M3U8清单并将其内容组合成一个可播放的MP4文件。M3U8是一种基于HTTP的流媒体协议,广泛应用于在线视频传输,特别是在 HLS(HTTP Live Streaming)系统中...

    联想家悦E356Z出厂BIOS L-IG41M3 V:1.1 支持WIN7 64位

    主板型号:L-IG41M3 V:1.1 内存支持:DDR3 1600MHz双面2GB,自动降频到1333MHz使用,最大支持4GB内存 PCI-E支持:1.0X16 南桥芯片:ICH7 SATA接口:3个,2.0速率,不支持AHCI,SSD限制太大,不建议使用 集成声卡:...

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

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

Global site tag (gtag.js) - Google Analytics