第一个JSR-184 MIDlet

来源:互联网 发布:关于乒乓球赛事的软件 编辑:程序博客网 时间:2024/05/01 23:53

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

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

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

sflj www.it55.com kg^&fgd
我们首先建立一个Graphis3D对象,并且利用它来渲染屏幕。World对象包含了所有在 场景中用到的对象和照相机的信息。 45398 www.it55.com it55学习IT知识,享受IT生活 4dfkjn
 照相机利用setPerspective方法设置在它前端的坐标系统中的0.1到50单位范围内的对象,都应该是可见的。 45398 www.it55.com it55学习IT知识,享受IT生活 4dfkjn

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

www.it55.com在线教程
//得到一个Graphics3D的实例 IT资讯之家 www.it55.com
g3d = Graphics3D.getInstance(); IT资讯之家 www.it55.com
world = new World(); it55.com
  it55.com

//向world中增加camera

www.it55.com在线教程

camera = new Camera();

45398 www.it55.com it55学习IT知识,享受IT生活 4dfkjn

world.addChild(camera);

www.it55.com在线教程

 

45398 www.it55.com it55学习IT知识,享受IT生活 4dfkjn
// canvas的宽和高 www.it55.com在线教程

float w = getWidth();

www.it55.com在线教程

float h = getHeight();

www.it55.com在线教程

 

http://www.it55.com/
//构造一个透视射影矩阵,并且设为当前的射影矩阵 sflj www.it55.com kg^&fgd
camera.setPerspective(60.0f, w / h, 0.1f, 50f); www.it55.com在线教程
//创建棱锥 IT资讯之家 www.it55.com

pyramidMesh = createPyramid();

it55.com

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

45398 www.it55.com it55学习IT知识,享受IT生活 4dfkjn
pyramidMesh.setTranslation(0.0f, 0.0f, -3.0f); vd;k;l www.it55.com rdfg
//将pyramid添加到world中 45398 www.it55.com it55学习IT知识,享受IT生活 4dfkjn
world.addChild(pyramidMesh);  

(camera); 

vd;k;l www.it55.com rdfg
在这个例子中,最主要的3D对象就是在createPyramid方法中创建的棱锥(pyramid)。createPyramid方法中的代码相当的简单。 sflj www.it55.com kg^&fgd
为了创建棱锥,我们首先指定需要用到的顶点。因为在这个例子中,我们必须为每一个顶点声明一种颜色。其中INDICES数组保存了POINTS和COLORS的顺序。点1到点5的颜色依次是红色、绿色、蓝色、紫罗兰色和青色。 it55.com

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

http://www.it55.com/

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

it55.com

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

www.it55.com
short []POINTS = new short[] {-1, -1, 0, // 点1 IT资讯之家 www.it55.com
                               1, -1, 0, // 点2 it55.com

                               0, 1, 0}; // 点3

sflj www.it55.com kg^&fgd

                                                           

45398 www.it55.com it55学习IT知识,享受IT生活 4dfkjn

// 点和颜色的序列。

www.it55.com

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

vd;k;l www.it55.com rdfg

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

sflj www.it55.com kg^&fgd
                              0, 127,    0, //G it55.com
                              0,    0, 127}; //B IT资讯之家 www.it55.com
  sflj www.it55.com kg^&fgd
// indices数组中每一个序列的长度。 sflj www.it55.com kg^&fgd
int [] LENGTH = new int[] {3}; www.it55.com
   下面我们指定创建整个棱锥所需要的五个点。 www.it55.com在线教程

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

vd;k;l www.it55.com rdfg
short []POINTS = new short[] {-1, -1, 1, // 点1
免费资源www.it55.com

                               1, -1, 1, // 点2

www.it55.com在线教程

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

vd;k;l www.it55.com rdfg

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

vd;k;l www.it55.com rdfg

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

sflj www.it55.com kg^&fgd

                                                       

IT资讯之家 www.it55.com
                                                            www.it55.com
// 点序列 http://www.it55.com/
int []INDICES = new int[] {0, 1, 4, 1, 2, 4, 2, 3, 4, 3, 0, 4, 2, 1, 0, 2, 0, 3}; http://www.it55.com/

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

http://www.it55.com/

                            0, 127, 0, //G

http://www.it55.com/

                            0, 0, 127, //B

it55.com

                            127, 0, 127, //B

http://www.it55.com/

                             0, 127, 127}; //B

免费资源www.it55.com
                                                       www.it55.com
  it55.com

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

www.it55.com在线教程
int []LENGTH = new int[] {3, 3, 3, 3, 3, 3}; // 棱锥由6个三角形组成
是一个棱锥,下面的代码都是一样。 45398 www.it55.com it55学习IT知识,享受IT生活 4dfkjn

VertexArray POSITION_ARRAY, COLOR_ARRAY;

45398 www.it55.com it55学习IT知识,享受IT生活 4dfkjn
IndexBuffer INDEX_BUFFER; www.it55.com在线教程

 

www.it55.com

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

免费资源www.it55.com

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

IT资讯之家 www.it55.com
POSITION_ARRAY.set (0, POINTS.length / 3, POINTS); 免费资源www.it55.com

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

sflj www.it55.com kg^&fgd

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

sflj www.it55.com kg^&fgd
INDEX_BUFFER = new TriangleStripArray (INDICES, LENGTH); 免费资源www.it55.com

       

www.it55.com

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

http://www.it55.com/

VertexBuffer vertexBuffer = new VertexBuffer ();

45398 www.it55.com it55学习IT知识,享受IT生活 4dfkjn

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

http://www.it55.com/

vertexBuffer.setColors (COLOR_ARRAY);

免费资源www.it55.com
        sflj www.it55.com kg^&fgd

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

vd;k;l www.it55.com rdfg

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

www.it55.com在线教程
        www.it55.com
// 一个包含了定义Mesh渲染特征的组件对象的集合。 vd;k;l www.it55.com rdfg

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

vd;k;l www.it55.com rdfg
// 一个Appearance组件,它封装了多边形级别的特征 IT资讯之家 www.it55.com

PolygonMode polygonMode = new PolygonMode ();

vd;k;l www.it55.com rdfg

polygonMode.setPerspectiveCorrectionEnable (true);

IT资讯之家 www.it55.com
// 通过使用CULL_NONE棱锥的所有面都会显示 www.it55.com在线教程

polygonMode.setCulling (PolygonMode.CULL_NONE);

http://www.it55.com/
// 棱锥使用平滑的颜色渐变 www
(PolygonMode.SHADE_SMOOTH); vd;k;l www.it55.com rdfg

appearance.setPolygonMode (polygonMode);

45398 www.it55.com it55学习IT知识,享受IT生活 4dfkjn

 

vd;k;l www.it55.com rdfg
// 为3D对象设置外观(appearance) www.it55.com在线教程

mesh.setAppearance (0, appearance);

www.it55.com

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

IT资讯之家 www.it55.com

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

免费资源www.it55.com

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

it55.com
3.分别指定五个点对应的颜色信息,每个顶点都是按照RGB的顺序。在以上的步骤中请大家注意一点,就是每一步中的数组的类型。 免费资源www.it55.com
4.指定一个LENGTH数组,它其中的元素是表示将对应的INDICES数组中元素划分为序列时,每个序列的长度。例子中的值是3,就表示INDICES中每三个元素作为一个序列。我们会发现,将INDICES中按照三个一组进行划分,所得到的每组序列刚好是组成一个三角形所需要的三个顶点。 免费资源www.it55.com
5.使用VertexArray对象来保存顶点位置和颜色信息。VertexArray中三个参数的意义分别为:第一个是创建的对象中元素的个数,第二个是每个元素所包含的子元素数,第三个用来指定每个子元素所占的字节数。 IT资讯之家 www.it55.com
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}。 http://www.it55.com/

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

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