`
izuoyan
  • 浏览: 9220713 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

第一个JSR-184 MIDlet

阅读更多

作者:mydeman 文章来源:http://www.j2medev.com/Article/ShowArticle.asp?ArticleID=644

这篇文章主要描述如何利用移动3D图形API(Mobile 3D graphics API,m3g,又称为JSR-184)来建立一个3D的场景。

在这个3D场景的例子中,我们有一个活动的照相机(译者注:照相机就相当于观察者的位置),它聚焦在我们唯一的一个3D对象——一个旋转的棱锥上。源程序可以在本文的最后下载。

所有在场景中用到的对象都在M3GCanvas的构造函数中进行初始化。

我们首先建立一个Graphis3D对象,并且利用它来渲染屏幕。World对象包含了所有在 场景中用到的对象和照相机的信息。

照相机利用setPerspective方法设置在它前端的坐标系统中的0.1到50单位范围内的对象,都应该是可见的。

因为照相机和棱锥都定位在xyz(0.0f, 0.0f, 0.0f)的位置上,所以为了看到棱锥,我们必须把它移动到屏幕内。这个操作由Mesh类里的setTranslation方法完成。

//得到一个Graphics3D的实例

g3d = Graphics3D.getInstance();

world = new World();

//向world中增加camera

camera = new Camera();

world.addChild(camera);

// canvas的宽和高

float w = getWidth();

float h = getHeight();

//构造一个透视射影矩阵,并且设为当前的射影矩阵

camera.setPerspective(60.0f, w / h, 0.1f, 50f);

//创建棱锥

pyramidMesh = createPyramid();

//将棱锥移动3个单位使其到屏幕内

pyramidMesh.setTranslation(0.0f, 0.0f, -3.0f);

//将pyramid添加到world中

world.addChild(pyramidMesh);

world.setActiveCamera(camera);

在这个例子中,最主要的3D对象就是在createPyramid方法中创建的棱锥(pyramid)。createPyramid方法中的代码相当的简单。

为了创建棱锥,我们首先指定需要用到的顶点。因为在这个例子中,我们必须为每一个顶点声明一种颜色。其中INDICES数组保存了POINTS和COLORS的顺序。点1到点5的颜色依次是红色、绿色、蓝色、紫罗兰色和青色。

我们使用setShading(PolygonMode.SHADE_SMOOTH)方法实现很好的颜色渐变效果,如果每个侧面只有一种颜色,那么就指定SHADE_FLAT。

这个棱锥有6个三角形组成,其中每个侧面包含一个,底面包含两个。如果我们仅仅需要创建一个三角形,那么我们只需指定这个三角形所用到的三个顶点,下面的代码正展示了这一点。

// 一个三角形用到的顶点。 x, y, z

short []POINTS = new short[] {-1, -1, 0, // 点1

1, -1, 0, // 点2

0, 1, 0}; // 点3

// 点和颜色的序列。

int [] INDICES = new int[] {0, 1, 2};

byte [] COLORS = new byte [] {127, 0, 0, //R

0, 127, 0, //G

0, 0, 127}; //B

// indices数组中每一个序列的长度。

int [] LENGTH = new int[] {3};

下面我们指定创建整个棱锥所需要的五个点。

// 棱锥用到的顶点. x, y, z

short []POINTS = new short[] {-1, -1, 1, // 点1

1, -1, 1, // 点2

1, -1, -1, // 点3

-1, -1, -1, // 点4

0, 1, 0}; // 点5, 顶点

// 点序列

int []INDICES = new int[] {0, 1, 4, 1, 2, 4, 2, 3, 4, 3, 0, 4, 2, 1, 0, 2, 0, 3};

byte []COLORS = new byte[] {127, 0, 0, //R

0, 127, 0, //G

0, 0, 127, //B

127, 0, 127, //B

0, 127, 127}; //B

//indices数组中每一个序列的长度。

int []LENGTH = new int[] {3, 3, 3, 3, 3, 3}; // 棱锥由6个三角形组成

无论是创建一个三角形还是一个棱锥,下面的代码都是一样。

VertexArray POSITION_ARRAY, COLOR_ARRAY;

IndexBuffer INDEX_BUFFER;

// 创建一个被VertexBuffer用到的VertexArray

POSITION_ARRAY = new VertexArray (POINTS.length / 3, 3, 2);

POSITION_ARRAY.set (0, POINTS.length / 3, POINTS);

COLOR_ARRAY = new VertexArray (COLORS.length / 3, 3, 1);

COLOR_ARRAY.set (0, COLORS.length / 3, COLORS);

INDEX_BUFFER = new TriangleStripArray (INDICES, LENGTH);

// VertexBuffer保存了对VertexArray对象的引用,而这些VertexArray对象可能包// 含了一系列顶点的位置、法线、颜色和纹理信息。

VertexBuffer vertexBuffer = new VertexBuffer ();

vertexBuffer.setPositions (POSITION_ARRAY, 1.0f, null);

vertexBuffer.setColors (COLOR_ARRAY);

// 创建一个3D对象,定义为一个多边形的平面

Mesh mesh = new Mesh (vertexBuffer, INDEX_BUFFER, null);

// 一个包含了定义Mesh渲染特征的组件对象的集合。

Appearance appearance = new Appearance (); // A set of component objects that define the rendering attributes of a Mesh

// 一个Appearance组件,它封装了多边形级别的特征

PolygonMode polygonMode = new PolygonMode ();

polygonMode.setPerspectiveCorrectionEnable (true);

// 通过使用CULL_NONE棱锥的所有面都会显示

polygonMode.setCulling (PolygonMode.CULL_NONE);

// 棱锥使用平滑的颜色渐变

polygonMode.setShading (PolygonMode.SHADE_SMOOTH);

appearance.setPolygonMode (polygonMode);

// 为3D对象设置外观(appearance)

mesh.setAppearance (0, appearance);

下面我们重点看一下本篇文章中建立3D对象(棱锥)的过程。

1.这一步比较简单,指定棱锥用到的五个点。

2.建立一个点序列的INDICES 数组,这个数组中包含了顶点的信息,其中0到4依次和第一步中建立的点1到点5对应,对应关系如右图。

3.分别指定五个点对应的颜色信息,每个顶点都是按照RGB的顺序。在以上的步骤中请大家注意一点,就是每一步中的数组的类型。

4.指定一个LENGTH数组,它其中的元素是表示将对应的INDICES数组中元素划分为序列时,每个序列的长度。例子中的值是3,就表示INDICES中每三个元素作为一个序列。我们会发现,将INDICES中按照三个一组进行划分,所得到的每组序列刚好是组成一个三角形所需要的三个顶点。

5.使用VertexArray对象来保存顶点位置和颜色信息。VertexArray中三个参数的意义分别为:第一个是创建的对象中元素的个数,第二个是每个元素所包含的子元素数,第三个用来指定每个子元素所占的字节数。

6.使用TriangleStripArray对象创建组成棱锥的三角面。TriangleStripArray是IndexBuffer类的子类,它是根据第二个参数将第一个参数也就是INDICES数组中的元素划为序列,组成三角面。在例子中是将INDICES中元素每三个划分为一个序列,刚好组成一个三角面。但是有时可能不是三个划分的,例如对于正方体我们可以定义LENGTH={4,4,4,4,4,4},这时INDICES中元素就会按照四个一组划分,于是这四个元素中的前三个先组成一个三角面,然后后面的两个元素交换位置和第四个元素再组成一个三角面,例如S=(2,0,1,4)就定义了两个三角面:(2,0,1)和(1,0,4)。另外TriangleStripArray中的INDICES数组也可以隐式声明,即TriangleStripArray(int, int[]),此时第一个参数指定了数组中起始元素,后面的元素依次加1递增。例如LENGTH={3,4},那么TriangleStripArray(0, LENGTH)就相当于指定了INDICES={0,1,2,3,4,5,6}。

7.利用VertexBuffer保存位置和颜色信息,有时也可能会保存法线信息(setNormals)。

8.这是最后一步,使用Mesh建立3D对象。这里Mesh的构造函数有三个参数,第一个是顶点的相关信息,例如位置、颜色和法线等,第二个是组成3D对象的三角面或子Mesh对象(并不是指Mesh的子类或Mesh对象)的信息,第三个是外观,Appearance对象,如果在这里指定为null,那么在建立Mesh对象以后,还可以通过setAppearance设定。

下载源码第一个Jsr 184 MIDlet

分享到:
评论

相关推荐

    Mobile Information Device Profile for Java 2 Micro Edition Version 2.0(MIDP 2.0).PDF

    9. **JSR-184:M3G (Mobile 3D Graphics)**:提供了3D图形支持,为移动游戏和图形密集型应用提供了强大的功能。 通过MIDP 2.0,开发者可以利用这些增强的功能来开发更强大、更吸引人的移动应用。然而,需要注意的是...

    j2me小程序

    **欢迎界面**是任何应用程序的第一印象,它通常包括品牌标识、启动动画或简单的用户引导。在J2ME中,创建欢迎界面通常涉及使用MIDP(Mobile Information Device Profile)的Canvas类或者LWUIT( Lightweight UI ...

    J2ME从入门到精通源代码

    - **编写MIDlet**:实践编写第一个简单的MIDlet。 - **UI设计**:学习如何创建和操作Displayables。 - **网络编程**:利用MIDP的Connection API进行数据交换。 - **数据存储**:掌握Record Store的使用。 - **事件...

    J2ME入门最基础的资料,一看即会噢...

    Java Micro Edition(J2ME)是Java平台的一个子集,主要设计用于嵌入式设备和移动设备的操作系统,如手机、智能电视、游戏...通过详细阅读和实践提供的资料,你将能够快速入门J2ME,开发出自己的第一个MIDlet应用程序。

    J2me开发精解 PDF格式[part4]

    "J2ME开发精解"这个资源很可能是一个全面介绍J2ME开发技术的教程或书籍,分为四个部分,此处我们主要关注的是第四部分——"part4"。 J2ME的架构由配置(Configurations)、配置规范(Configuration Specifications...

    MIDP2.0讲座(8)

    MIDP(Mobile Information Device Profile)2.0是Java ME(Micro Edition)的一个子集,专门针对移动设备和嵌入式系统的应用程序开发。这个讲座系列的第八部分将深入探讨MIDP2.0的关键特性和技术,帮助开发者更有效...

    J2ME-gaming.zip_game_j2me_zip

    一些常见的J2ME游戏库包括LWUIT( Lightweight User Interface Toolkit)和MIDlet-Suite-Wrapper。 4. **图形和用户界面**:在J2ME中,游戏界面通常使用Canvas类构建,这是一个可以进行低级绘图操作的类。开发者...

    J2ME源代码

    Java 2 Micro Edition(J2ME)是Java平台的一个子集,主要用于嵌入式设备和移动设备,如手机、智能手表等。它为开发小型应用程序,即移动应用,提供了丰富的功能和接口。J2ME源代码是开发者学习和实践移动开发的重要...

    快速转化J2ME程序为Android程序

    接下来,编写你的第一个Android J2ME应用。创建一个名为HelloAndroidJ2me.java的文件,导入必要的J2ME和Android类。这个类需要扩展MIDlet,并实现CommandListener接口。在代码中,可以创建Command对象,Form对象,...

    j2me开发大全

    Java 2 Micro Edition(J2ME)是Java平台的一个子集,主要用于嵌入式系统和移动设备,如手机、PDA和智能家电等。J2ME为开发这些设备上的应用程序提供了丰富的框架和工具。在"J2ME开发大全"中,我们可以深入探讨以下...

    开发基于Java语言的手机游戏

    开发Java手机游戏的第一步是设置开发环境。你需要安装JDK(Java Development Kit)和一个J2ME IDE,如NetBeans或Eclipse,它们都提供了对J2ME项目的良好支持。安装完成后,创建一个新的MIDlet项目,这是J2ME中的核心...

    手机浏览本地文件(word版)

    本代码段展示了一个简单的MIDlet(Java ME应用程序)实现,用于在手机上浏览本地文件系统,尤其是针对文件夹导航和文件选择。虽然具体实现了浏览功能,但并未包含实际的文件内容查看(如图片浏览或文本阅读)。主要...

    J2ME音频播放

    然而,J2ME的标准库并不直接支持非MIDI音频格式,通常需要第三方库如JSR-135(Java Mobile Media API)或者M3G(Mobile 3D Graphics API)来处理。 **3. 源码解析** 博文链接提到的是:...

    第02章J2ME简介和编程环境.ppt

    一个简单的MIDlet示例是通过`javax.microedition.midlet.MIDlet`基类创建的,如`MyMIDlet`。 **J2ME开发环境** 搭建J2ME开发环境需要两个关键组件:一是Java Development Kit (JDK),二是Wireless Toolkit (WTK)...

    J2ME 中文教程

    第一章 “J2ME技术概述”让你在学习J2ME以前知道什么是J2ME。本章介绍了J2ME平台的体系结构和MIDlet生命周期的概念。为以后的内容打下良好的基础。 第二章“CLDC简介”介绍了MIDP的基础Java Community Process...

    J2ME 中文版教程

    第一章 “J2ME 技术概述”让你在学习J2ME 以前知道什么是J2ME。本章介绍了J2ME 平 台的体系结构和MIDlet 生命周期的概念。为以后的内容打下良好的基础。 第二章“CLDC 简介”介绍了MIDP 的基础Java Community ...

    j2me 中文教程 开发环境 J2ME语言

    第一章 “J2ME 技术概述”让你在学习J2ME 以前知道什么是J2ME。本章介绍了J2ME 平 台的体系结构和MIDlet 生命周期的概念。为以后的内容打下良好的基础。 第二章“CLDC 简介”介绍了MIDP 的基础Java Community ...

    清华教材-J2ME移动设备程序设计-2

    J2ME是Java平台的一个子集,主要用于嵌入式设备和移动设备的开发,如手机、智能家电等。这本书的第二部分包含了第6章至第10章的内容,以及完整的目录,提供了丰富的编程实践指导和理论知识。 第6章主要讲解了J2ME的...

    J2ME 中文教程1.01a

    第一章 “J2ME技术概述”让你在学习J2ME以前知道什么是J2ME。本章介绍了J2ME平台的体系结构和MIDlet生命周期的概念。为以后的内容打下良好的基础。 第二章“CLDC简介”介绍了MIDP的基础Java Community Process...

Global site tag (gtag.js) - Google Analytics