正巧前一段时间我简朴的进修了一下3D图形学,所以近来最先对Mobile 3D的进修,在这里把进修到的东西拿出来与人人同享,愿望能对人人有所协助,也同时愿望人人能够一起来进修JSR184。
下面言规正传,起首我们来设想一下在现实生活中,我们是怎样视察这个天下的。我们是经由过程眼睛来视察,我们生活在一个3维坐标系组成的天下。在Mobile3D中一样的有World类让你为所欲为的组织你想要的天下,固然在这里专业些,在3D制图中我们叫它“场景”;别的另有Camera类来作为你的眼睛,你能够来设置它的位置角度等参数,来显现出差别的图象。
在Mobile 3D中是怎样完成3D图象的显现呢?起首你要竖立或许载入3D模子,然后根据须要设置场景中的环境、衬着体式格局等一系列的参数,再后生成并设置一架摄影机而且调整好你想要的光芒,调整好你所须要的位置和角度。OK还须要什么呢?按下快门,这一步就是被叫做“衬着”统统就搞定了,这听起来好像很简朴实在也并不难,实在这也不难。
下面我们分步骤的来解说这些步骤:
起首说模子的竖立,在Mobile 3D中和大多数的3D编程API是一样的有两种体式格局:1 实时运算生成;2 外部建模导入。由于外部建模导入会将环境信息同时导入,所以稍候给人人做详细的引见,这里偏主要给人人引见“实时运算生成”的部份,如许一来有助于人人相识Mobile 3D的事情道理。在Mobile 3D中为我们供应了VertexArray和VertexBuffer俩个类,这两个类用来保留3维模子的极点信息。
个中VertexArray 类用途比较多,也比较天真,这个类最经常运用的用法有3个,1 保留极点坐标信息; 2 保留法线信息;3保留帖图信息。有人或许要问这一个类怎样治理3种差别的东西呢?那下面我们来剖析一下该类,起首该类的组织器有3个参数:1 该实例要包含的元素的数目; 2 每一个元素要包含的元素数目; 3每一个子元素所占的字节数。如许一来好像清晰许多为何这个类能被运用到3种东西上。
别的该类另有一个比较经常运用的要领set(int index,int length,short[] array0)这个要领是用来向该类的实例对象种寄存数据的,第一个参数是指从第几个元素最先;第二个参数是指要设置多少个;第三个参数就是现实设置的置了。
下面简朴引见VertexBuffer类,该类才是真正保留多边形的框架信息的类。改类经由过程设置极点位置、发明、帖图信息,来竖立图形。个中
setPositions(VertexBuffer v,float s,float[]b)
是用来设置极点位置的,在这个要领中你会发明有3个参数,第一个不必说了,是极点的坐标信息,后两个是用来做坐标偏移等操纵的,操纵是如许的数学公式:
v'=v*s+b
另有一个
setNormals(vertexBuffer norm)
要领来设置法线。另有一个非常主要的要领
setTexCoords(int, VertexArray, float, float[])
这个要领中参数除第一个之外,后三个和
setPositions(VertexBuffer v,float s,float[]b)
是一样的,第一个参数是最先的元素编号。如许说是不是有些笼统呢?给人人一个例子吧,好让人人明白。
short x = 20;
short y = 20;
short z = 20;
short fx = (short) -x;
short fy = (short) -y;
short fz = (short) -z;
//定点坐标
short[] vert = {x,y,z, fx,y,z, x,fy,z, fx,fy,z, //D
fx,y,fz, x,y,fz, fx,fy,fz, x,fy,fz, //C
fx,y,z, fx,y,fz, fx,fy,z, fx,fy,fz, //B
x,y,fz, x,y,z, x,fy,fz, x,fy,z, //F
x,y,fz, fx,y,fz, x,y,z, fx,y,z, //A
x,fy,z, fx,fy,z, x,fy,fz, fx,fy,fz}; //E
try{vertArray=new VertexArray(vert.length/3,3,2);
vertArray.set(0,vert.length/3,vert);
}catch(Exception e){System.out.PRintln("vert");}
//发线
byte[] norm = { 0,0,127, 0,0,127, 0,0,127, 0,0,127,
0,0,-127, 0,0,-127, 0,0,-127, 0,0,-127,
-127,0,0, -127,0,0, -127,0,0, -127,0,0,
127,0,0, 127,0,0, 127,0,0, 127,0,0,
0,127,0, 0,127,0, 0,127,0, 0,127,0,
0,-127,0, 0,-127,0, 0,-127,0, 0,-127,0};
try{normArray=new VertexArray(norm.length/3,3,1);
normArray.set(0,norm.length/3,norm);
}catch(Exception e){System.out.println("norm");e.printStackTrace();}
//给出极点们对应图片上的点(vert和tex数组是一一对应的)
short[] tex = { 1, 0, 0, 0, 1, 1, 0, 1,
1, 0, 0, 0, 1, 1, 0, 1,
1, 0, 0, 0, 1, 1, 0, 1,
1, 0, 0, 0, 1, 1, 0, 1,
1, 0, 0, 0, 1, 1, 0, 1,
1, 0, 0, 0, 1, 1, 0, 1 };
try{
texArray=new VertexArray(tex.length/2,2,2);
texArray.set(0,tex.length/2,tex);
}catch(Exception e){System.out.println("tex");}
//竖立正方体
vb=new VertexBuffer();
vb.setPositions(vertArray,1.0f,null);
vb.setNormals(normArray);
vb.setTexCoords(0,texArray,1.0f,null);
在上述代码中我竖立一个正方体所须要悉数极点和面的信息,但人人要注意这里并没有生成对应的模子。缘由就是我们还没有设置生成模子所以的其他信息,下面我们来看看TriangleStripArray类,该类是组成面所须要的三角面的信息类,熟习3D制图的人都清晰组织3D图形是经由过程多个面组织一个3D实体的,而三角面是比较经常运用的一个要领。详细内容我这里不详细说清楚明了。
下面我们还须要设置一些环境和材质信息,这里要用到的类比较多Appearance、Texture2D、Material。先来看个例子:
appearnce=new Appearance();
//建立帖图
Texture2D texture=new Texture2D(image2d);
texture.setBlendColor(Texture2D.FUNC_DECAL);
texture.setWrapping(Texture2D.WRAP_REPEAT,Texture2D.WRAP_REPEAT);
texture.setFiltering(Texture2D.FILTER_NEAREST,Texture2D.FILTER_NEAREST);
material=new Material();
material.setColor(Material.DIFFUSE, 0xFFFFFFFF);
material.setColor(Material.SPECULAR, 0xFFFFFFFF);
material.setShininess(100.0f);
appearnce.setTexture(0,texture);
appearnce.setMaterial(material);
mesh=new Mesh(vb,tsa,appearnce);
mesh.setAppearance(0,appearnce);
我个人感觉Appearance类有些相似VertexBuffer类,一样是多种属性的持有者;在这里要强调一点,就是Appearance类的设置远远不止上述给出的东西,另有许多的设置(比方FOG也就是雾的设置)。Texture2D是帖图类,用它来设置帖图的信息,比方帖图的体式格局是平铺等体式格局。Material物名斯意就是指材质,这里你但是设置“反光度”、“色彩”等等信息。别的这里我还要引见一种设置衬着参数的要领
//设置poly形式设置
PolygonMode polygonMode=new PolygonMode();
polygonMode.setShading(PolygonMode.SHADE_SMOOTH);
polygonMode.setCulling(PolygonMode.CULL_NONE);
//生成表面
appearnce=new Appearance();
appearnce.setPolygonMode(polygonMode);
看方才给出的代码,好像比上面的更简朴是吧?实在在PolygonMode中已替我们做了许多事情。该的设置很相似3D MAX中的Poly的运用。
适才的代码中还给出了一个Mesh类,该类材质末了我们要的模子。竖立模子后,我们要竖立Camera。在Camera中我在这里只简朴引见两个要领setParallel(float, float, float, float)和setPerspective(float, float, float, float)。我们起首来看setParallel(float, float, float, float)该要领是设置Camera的视图要领为平视图;第一个参数是设置视角的高度,注意是高度,不是角度,由于这里是平视图;第二个参数是Camera的宽高比例,比方我们的电视是4:3、宽银幕电影是16:9;第三、四参数分别是近来和最远衬着的局限。一样的setPerspective是设置Camera为透视图,这类视图比较靠近我们一样平常生活中的视察的角度,而该要领的后三个参数和setParallel的后三个参数是一样的,而第一个参数是但是角度,这里你可不要无视这个角度题目,这个角度是在透视图中盘算投影的一个主要参数。
好像统统都设置好了,实在不然,到目前为止我们仅仅是把我们所须要的素材都准备好了。下面我们来看看Mobile 3D的治理机制,熟习3D制图的人都清晰大部份3D软件,3D API都是经由过程树状构造来治理素材的,如许的优点是每一个模子、模子组、摄像机等元素作为节点都能够设置本身的旋转轴等等属性,并能够根据本身所设定好的动画信息举行活动。在Mobile 3D中为我们划定了该树状构造的根节点必需是World类的实例对象,个中摄影机和光芒比较特殊,能够不被安排在这个树中,而是经由过程Graphics3D类的对象来设置(只是能够不
以上就是J2ME Mobile 3D入门教程系列文章之一的内容,更多相关内容请关注ki4网(www.ki4.cn)!