J2ME Mobile 3D學習如何入門?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設、高性價比細河網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式細河網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設找我們,業(yè)務覆蓋細河地區(qū)。費用合理售后完善,十載實體公司更值得信賴。 3D圖形技術在各個領域已經(jīng)越來越多的被應用了,當然這也包括了J2ME領域。在J2ME中為我們提供了JSR184這樣一個可選包,該套API實現(xiàn)手機上3D圖形的編程。同時也伴隨著移動設備硬件的發(fā)展,現(xiàn)在也出現(xiàn)了越來越的支持該可選包的手機了,例如Sony
EriCSSon的 K系列、S系列等等。
正巧前一段時間我簡單的學習了一下3D圖形學,所以最近開始對Mobile 3D的學習,在這里把學習到的東西拿出來與大家共享,希望能對大家有所幫助,也同時希望大家能夠一起來學習JSR184。
下面言規(guī)正傳,首先我們來想象一下在現(xiàn)實生活中,我們是如何觀察這個世界的。我們是通過眼睛來觀察,我們生活在一個3維坐標系構成的世界。在Mobile3D中同樣的有World類讓你隨心所欲的構造你想要的世界,當然在這里專業(yè)些,在3D制圖中我們叫它“場景”;另外還有Camera類來作為你的眼睛,你可以來設置它的位置角度等參數(shù),來顯示出不同的圖像。
在Mobile
3D中是如何實現(xiàn)3D圖像的顯示呢?首先你要建立或者載入3D模型,然后根據(jù)需要設置場景中的環(huán)境、渲染方式等一系列的參數(shù),再后生成并設置一架攝影機并且調(diào)整好你想要的光線,調(diào)整好你所需要的位置和角度。OK還需要什么呢?按下快門,這一步就是被叫做“渲染”一切就搞定了,這聽起來似乎很簡單其實也并不難,其實這也不難。
下面我們分步驟的來講解這些步驟:
首先說模型的建立,在Mobile
3D中和大多數(shù)的3D編程API是一樣的有兩種方式:1 及時運算生成;2
外部建模導入。由于外部建模導入會將環(huán)境信息同時導入,所以稍候給大家做具體的介紹,這里著重要給大家介紹“及時運算生成”的部分,這樣一來有助于大家了解Mobile
3D的工作原理。在Mobile 3D中為我們提供了VertexArray和VertexBuffer倆個類,這兩個類用來保存3維模型的頂點信息。
其中VertexArray
類用處比較多,也比較靈活,這個類最常用的用法有3個,1 保存頂點坐標信息; 2
保存法線信息;3保存帖圖信息。有人也許要問這一個類怎么治理3種不同的東西呢?那下面我們來分析一下該類,首先該類的構造器有3個參數(shù):1
該實例要包括的元素的數(shù)量; 2 每個元素要包括的元素數(shù)量; 3每個子元素所占的字節(jié)數(shù)。這樣一來似乎清楚很多為什么這個類能被使用到3種東西上。
另外該類還有一個比較常用的方法set(int index,int length,short[] array0)這個方法是用來向該類的實例對象種存放數(shù)據(jù)的,第一個參數(shù)是指從第幾個元素開始;第二個參數(shù)是指要設置多少個;第三個參數(shù)就是實際設置的置了。
下面簡單介紹VertexBuffer類,該類才是真正保存多邊形的框架信息的類。改類通過設置頂點位置、發(fā)現(xiàn)、帖圖信息,來建立圖形。其中
setPositions(VertexBuffer v,float s,float[]b)
是用來設置頂點位置的,在這個方法中你會發(fā)現(xiàn)有3個參數(shù),第一個不用說了,是頂點的坐標信息,后兩個是用來做坐標偏移等操作的,操作是這樣的數(shù)學公式:
v'=v*s+b
還有一個
setNormals(vertexBuffer norm)
方法來設置法線。還有一個非常重要的方法
setTexCoords(int, VertexArray, float, float[])
這個方法中參數(shù)除第一個以外,后三個和
setPositions(VertexBuffer v,float s,float[]b)
是一樣的,第一個參數(shù)是開始的元素編號。這樣說是不是有些抽象呢?給大家一個例子吧,好讓大家理解。
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");}
//發(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();}
//給出頂點們對應圖片上的點(vert和tex數(shù)組是一一對應的)
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實體的,而三角面是比較常用的一個方法。具體內(nèi)容我這里不具體說明了。
下面我們還需要設置一些環(huán)境和材質(zhì)信息,這里要用到的類比較多Appearance、Texture2D、Material。先來看個例子:
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);
我個人感覺Appearance類有些類似VertexBuffer類,同樣是多種屬性的持有者;在這里要強調(diào)一點,就是Appearance類的設置遠遠不止上述給出的東西,還有很多的設置(例如FOG也就是霧的設置)。Texture2D是帖圖類,用它來設置帖圖的信息,例如帖圖的方式是平鋪等方式。Material物名斯意就是指材質(zhì),這里你可是設置“反光度”、“顏色”等等信息。另外這里我還要介紹一種設置渲染參數(shù)的方法
//設置poly模式設置
PolygonMode polygonMode=new PolygonMode();
polygonMode.setShading(PolygonMode.SHADE_SMOOTH);
polygonMode.setCulling(PolygonMode.CULL_NONE);
//生成外貌
appearnce=new Appearance();
appearnce.setPolygonMode(polygonMode);
看剛剛給出的代碼,似乎比上面的更簡單是吧?其實在PolygonMode中已經(jīng)替我們做了很多工作。該的設置很類似3D MAX中的Poly的使用。
剛才的代碼中還給出了一個Mesh類,該類材質(zhì)最后我們要的模型。建立模型后,我們要建立Camera。在Camera中我在這里只簡單介紹兩個方法setParallel(float,
float, float, float)和setPerspective(float, float, float,
float)。我們首先來看setParallel(float, float, float,
float)該方法是設置Camera的視圖方法為平視圖;第一個參數(shù)是設置視角的高度,注重是高度,不是角度,因為這里是平視圖;第二個參數(shù)是Camera的寬高比例,例如我們的電視是4:3、寬銀幕電影是16:9;第三、四參數(shù)分別是最近和最遠渲染的范圍。同樣的setPerspective是設置Camera為透視圖,這種視圖比較接近我們?nèi)粘I钪械挠^察的角度,而該方法的后三個參數(shù)和setParallel的后三個參數(shù)是一樣的,而第一個參數(shù)是可是角度,這里你可不要忽視這個角度問題,這個角度是在透視圖中計算投影的一個重要參數(shù)。
似乎一切都設置好了,其實不然,到目前為止我們僅僅是把我們所需要的素材都預備好了。下面我們來看看Mobile
3D的治理機制,熟悉3D制圖的人都清楚大部分3D軟件,3D
API都是通過樹狀結構來治理素材的,這樣的好處是每個模型、模型組、攝像機等元素作為節(jié)點都可以設置自己的旋轉(zhuǎn)軸等等屬性,并可以按照自己所設定好的動畫信息進行運動。在Mobile
3D中為我們規(guī)定了該樹狀結構的根節(jié)點必須是World類的實例對象,其中攝影機和光線比較非凡,可以不被放置在這個樹中,而是通過Graphics3D類的對象來設置(只是可以不
看完上述內(nèi)容,你們掌握J2ME Mobile 3D學習如何入門的方法了嗎?如果還想學到更多技能或想了解更多相關內(nèi)容,歡迎關注創(chuàng)新互聯(lián)成都網(wǎng)站設計公司行業(yè)資訊頻道,感謝各位的閱讀!
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
當前文章:J2MEMobile3D學習如何入門-創(chuàng)新互聯(lián)
當前鏈接:http://m.newbst.com/article38/coeepp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、自適應網(wǎng)站、靜態(tài)網(wǎng)站、外貿(mào)建站、App設計、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)