国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

J2ME Mobile 3D入門教程系列文章之一

2019-11-18 15:54:17
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  3D圖形技術(shù)在各個(gè)領(lǐng)域已經(jīng)越來(lái)越多的被應(yīng)用了,當(dāng)然這也包括了J2ME領(lǐng)域。在J2ME中為我們提供了JSR184這樣一個(gè)可選包,該套API實(shí)現(xiàn)手機(jī)上3D圖形的編程。同時(shí)也伴隨著移動(dòng)設(shè)備硬件的發(fā)展,現(xiàn)在也出現(xiàn)了越來(lái)越的支持該可選包的手機(jī)了,例如Sony EriCSSon的 K系列、S系列等等。
  
  正巧前一段時(shí)間我簡(jiǎn)單的學(xué)習(xí)了一下3D圖形學(xué),所以最近開始對(duì)Mobile 3D的學(xué)習(xí),在這里把學(xué)習(xí)到的東西拿出來(lái)與大家共享,希望能對(duì)大家有所幫助,也同時(shí)希望大家能夠一起來(lái)學(xué)習(xí)JSR184。
  
  下面言規(guī)正傳,首先我們來(lái)想象一下在現(xiàn)實(shí)生活中,我們是如何觀察這個(gè)世界的。我們是通過(guò)眼睛來(lái)觀察,我們生活在一個(gè)3維坐標(biāo)系構(gòu)成的世界。在Mobile3D中同樣的有World類讓你隨心所欲的構(gòu)造你想要的世界,當(dāng)然在這里專業(yè)些,在3D制圖中我們叫它“場(chǎng)景”;另外還有Camera類來(lái)作為你的眼睛,你可以來(lái)設(shè)置它的位置角度等參數(shù),來(lái)顯示出不同的圖像。
  
  在Mobile 3D中是如何實(shí)現(xiàn)3D圖像的顯示呢?首先你要建立或者載入3D模型,然后根據(jù)需要設(shè)置場(chǎng)景中的環(huán)境、渲染方式等一系列的參數(shù),再后生成并設(shè)置一架攝影機(jī)并且調(diào)整好你想要的光線,調(diào)整好你所需要的位置和角度。OK還需要什么呢?按下快門,這一步就是被叫做“渲染”一切就搞定了,這聽起來(lái)似乎很簡(jiǎn)單其實(shí)也并不難,其實(shí)這也不難。
  
  下面我們分步驟的來(lái)講解這些步驟:
  
  首先說(shuō)模型的建立,在Mobile 3D中和大多數(shù)的3D編程API是一樣的有兩種方式:1 及時(shí)運(yùn)算生成;2 外部建模導(dǎo)入。由于外部建模導(dǎo)入會(huì)將環(huán)境信息同時(shí)導(dǎo)入,所以稍候給大家做具體的介紹,這里著重要給大家介紹“及時(shí)運(yùn)算生成”的部分,這樣一來(lái)有助于大家了解Mobile 3D的工作原理。在Mobile 3D中為我們提供了VertexArray和VertexBuffer倆個(gè)類,這兩個(gè)類用來(lái)保存3維模型的頂點(diǎn)信息。
  
  其中VertexArray 類用處比較多,也比較靈活,這個(gè)類最常用的用法有3個(gè),1 保存頂點(diǎn)坐標(biāo)信息; 2 保存法線信息;3保存帖圖信息。有人也許要問(wèn)這一個(gè)類怎么治理3種不同的東西呢?那下面我們來(lái)分析一下該類,首先該類的構(gòu)造器有3個(gè)參數(shù):1 該實(shí)例要包括的元素的數(shù)量; 2 每個(gè)元素要包括的元素?cái)?shù)量; 3每個(gè)子元素所占的字節(jié)數(shù)。這樣一來(lái)似乎清楚很多為什么這個(gè)類能被使用到3種東西上。
  
  另外該類還有一個(gè)比較常用的方法set(int index,int length,short[] array0)這個(gè)方法是用來(lái)向該類的實(shí)例對(duì)象種存放數(shù)據(jù)的,第一個(gè)參數(shù)是指從第幾個(gè)元素開始;第二個(gè)參數(shù)是指要設(shè)置多少個(gè);第三個(gè)參數(shù)就是實(shí)際設(shè)置的置了。
  
  下面簡(jiǎn)單介紹VertexBuffer類,該類才是真正保存多邊形的框架信息的類。改類通過(guò)設(shè)置頂點(diǎn)位置、發(fā)現(xiàn)、帖圖信息,來(lái)建立圖形。其中
  
  setPositions(VertexBuffer v,float s,float[]b)
  
  是用來(lái)設(shè)置頂點(diǎn)位置的,在這個(gè)方法中你會(huì)發(fā)現(xiàn)有3個(gè)參數(shù),第一個(gè)不用說(shuō)了,是頂點(diǎn)的坐標(biāo)信息,后兩個(gè)是用來(lái)做坐標(biāo)偏移等操作的,操作是這樣的數(shù)學(xué)公式:
  
  v'=v*s+b
  
  還有一個(gè)
  
  setNormals(vertexBuffer norm)
  
  方法來(lái)設(shè)置法線。還有一個(gè)非常重要的方法
  
  setTexCoords(int, VertexArray, float, float[])
  
  這個(gè)方法中參數(shù)除第一個(gè)以外,后三個(gè)和
  
  setPositions(VertexBuffer v,float s,float[]b)
  
  是一樣的,第一個(gè)參數(shù)是開始的元素編號(hào)。這樣說(shuō)是不是有些抽象呢?給大家一個(gè)例子吧,好讓大家理解。
  
  short x = 20;
  
  short y = 20;
  
  short z = 20;
  
  short fx = (short) -x;
  
  short fy = (short) -y;
  
  short fz = (short) -z;
  
  //定點(diǎn)坐標(biāo)
  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.  
  //發(fā)線
  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();}
  
  //給出頂點(diǎn)們對(duì)應(yīng)圖片上的點(diǎn)(vert和tex數(shù)組是一一對(duì)應(yīng)的)
  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);
  
  在上述代碼中我建立一個(gè)正方體所需要全部頂點(diǎn)和面的信息,但大家要注重這里并沒(méi)有生成對(duì)應(yīng)的模型。原因就是我們還沒(méi)有設(shè)置生成模型所以的其他信息,下面我們來(lái)看看TriangleStr
ipArray類,該類是構(gòu)成面所需要的三角面的信息類,熟悉3D制圖的人都清楚構(gòu)造3D圖形是通過(guò)多個(gè)面構(gòu)造一個(gè)3D實(shí)體的,而三角面是比較常用的一個(gè)方法。具體內(nèi)容我這里不具體說(shuō)明了。
  
  下面我們還需要設(shè)置一些環(huán)境和材質(zhì)信息,這里要用到的類比較多Appearance、Texture2D、Material。先來(lái)看個(gè)例子:
  
  appearnce=new Appearance();
  
  //創(chuàng)建帖圖
  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);
  
  我個(gè)人感覺Appearance類有些類似VertexBuffer類,同樣是多種屬性的持有者;在這里要強(qiáng)調(diào)一點(diǎn),就是Appearance類的設(shè)置遠(yuǎn)遠(yuǎn)不止上述給出的東西,還有很多的設(shè)置(例如FOG也就是霧的設(shè)置)。Texture2D是帖圖類,用它來(lái)設(shè)置帖圖的信息,例如帖圖的方式是平鋪等方式。Material物名斯意就是指材質(zhì),這里你可是設(shè)置“反光度”、“顏色”等等信息。另外這里我還要介紹一種設(shè)置渲染參數(shù)的方法
  
  //設(shè)置poly模式設(shè)置
  PolygonMode polygonMode=new PolygonMode();
  polygonMode.setShading(PolygonMode.SHADE_SMOOTH);
  polygonMode.setCulling(PolygonMode.CULL_NONE);
  
  //生成外貌
  appearnce=new Appearance();
  appearnce.setPolygonMode(polygonMode);
  
  看剛剛給出的代碼,似乎比上面的更簡(jiǎn)單是吧?其實(shí)在PolygonMode中已經(jīng)替我們做了很多工作。該的設(shè)置很類似3D MAX中的Poly的使用。
  
  剛才的代碼中還給出了一個(gè)Mesh類,該類材質(zhì)最后我們要的模型。建立模型后,我們要建立Camera。在Camera中我在這里只簡(jiǎn)單介紹兩個(gè)方法setParallel(float, float, float, float)和setPerspective(float, float, float, float)。我們首先來(lái)看setParallel(float, float, float, float)該方法是設(shè)置Camera的視圖方法為平視圖;第一個(gè)參數(shù)是設(shè)置視角的高度,注重是高度,不是角度,因?yàn)檫@里是平視圖;第二個(gè)參數(shù)是Camera的寬高比例,例如我們的電視是4:3、寬銀幕電影是16:9;第三、四參數(shù)分別是最近和最遠(yuǎn)渲染的范圍。同樣的setPerspective是設(shè)置Camera為透視圖,這種視圖比較接近我們?nèi)粘I钪械挠^察的角度,而該方法的后三個(gè)參數(shù)和setParallel的后三個(gè)參數(shù)是一樣的,而第一個(gè)參數(shù)是可是角度,這里你可不要忽視這個(gè)角度問(wèn)題,這個(gè)角度是在透視圖中計(jì)算投影的一個(gè)重要參數(shù)。
  
  似乎一切都設(shè)置好了,其實(shí)不然,到目前為止我們僅僅是把我們所需要的素材都預(yù)備好了。下面我們來(lái)看看Mobile 3D的治理機(jī)制,熟悉3D制圖的人都清楚大部分3D軟件,3D API都是通過(guò)樹狀結(jié)構(gòu)來(lái)治理素材的,這樣的好處是每個(gè)模型、模型組、攝像機(jī)等元素作為節(jié)點(diǎn)都可以設(shè)置自己的旋轉(zhuǎn)軸等等屬性,并可以按照自己所設(shè)定好的動(dòng)畫信息進(jìn)行運(yùn)動(dòng)。在Mobile 3D中為我們規(guī)定了該樹狀結(jié)構(gòu)的根節(jié)點(diǎn)必須是World類的實(shí)例對(duì)象,其中攝影機(jī)和光線比較非凡,可以不被放置在這個(gè)樹中,而是通過(guò)Graphics3D類的對(duì)象來(lái)設(shè)置(只是可以不

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 郧西县| 绥宁县| 阜新| 察隅县| 安化县| 雅江县| 开封市| 浮山县| 军事| 垣曲县| 江源县| 沈阳市| 高阳县| 五峰| 五莲县| 宣化县| 镶黄旗| 景宁| 搜索| 瓮安县| 太和县| 新竹市| 灌云县| 沛县| 栾川县| 龙岩市| 霍邱县| 综艺| 揭阳市| 锡林郭勒盟| 邯郸市| 安顺市| 隆回县| 房产| 随州市| 明水县| 梅州市| 宣汉县| 宾川县| 高唐县| 崇礼县|