3D圖形技術在各個領域已經越來越多的被應用了,當然這也包括了J2ME領域。在J2ME中為我們提供了JSR184這樣一個可選包,該套API實現手機上3D圖形的編程。同時也伴隨著行動裝置硬體的發展,現在也出現了越來越的支援該選購包的手機了,例如Sony EriCSSon的 K系列、S系列等等。
正巧前一段時間我簡單的學習了一下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個參數,第一個不用有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. PRint ln("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.setBl end Color(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.D IF FUSE, 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類的對象來設定
【相關推薦】
#2.XML技術手冊
以上是關於J2ME 3D圖形技術的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!