首頁 後端開發 XML/RSS教程 關於J2ME 3D圖形技術的實例詳解

關於J2ME 3D圖形技術的實例詳解

May 11, 2017 am 11:32 AM

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類的對象來設定

【相關推薦】

1. XML免費影片教學

#2. XML技術手冊

3. 李炎恢XHTML影片教學

以上是關於J2ME 3D圖形技術的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

手機XML轉PDF,轉換速度快嗎? 手機XML轉PDF,轉換速度快嗎? Apr 02, 2025 pm 10:09 PM

手機XML轉PDF的速度取決於以下因素:XML結構的複雜性手機硬件配置轉換方法(庫、算法)代碼質量優化手段(選擇高效庫、優化算法、緩存數據、利用多線程)總體而言,沒有絕對的答案,需要根據具體情況進行優化。

怎麼在手機上把XML文件轉換為PDF? 怎麼在手機上把XML文件轉換為PDF? Apr 02, 2025 pm 10:12 PM

不可能直接在手機上用單一應用完成 XML 到 PDF 的轉換。需要使用雲端服務,通過兩步走的方式實現:1. 在雲端轉換 XML 為 PDF,2. 在手機端訪問或下載轉換後的 PDF 文件。

手機上如何將XML轉換成PDF? 手機上如何將XML轉換成PDF? Apr 02, 2025 pm 10:18 PM

直接在手機上將XML轉換為PDF並不容易,但可以藉助雲端服務實現。推薦使用輕量級手機App上傳XML文件並接收生成的PDF,配合雲端API進行轉換。雲端API使用無服務器計算服務,選擇合適的平台至關重要。處理XML解析和PDF生成時需要考慮複雜性、錯誤處理、安全性和優化策略。整個過程需要前端App與後端API協同工作,需要對多種技術有所了解。

xml如何轉化為word xml如何轉化為word Apr 03, 2025 am 08:15 AM

有三種將 XML 轉換為 Word 的方法:使用 Microsoft Word、使用 XML 轉換器或使用編程語言。

xml怎麼轉換成圖片 xml怎麼轉換成圖片 Apr 03, 2025 am 07:39 AM

可以將 XML 轉換為圖像,方法是使用 XSLT 轉換器或圖像庫。 XSLT 轉換器:使用 XSLT 處理器和样式表,將 XML 轉換為圖像。圖像庫:使用 PIL 或 ImageMagick 等庫,從 XML 數據創建圖像,例如繪製形狀和文本。

xml怎麼改格式 xml怎麼改格式 Apr 03, 2025 am 08:42 AM

可以採用多種方法修改 XML 格式:使用文本編輯器(如 Notepad )進行手工編輯;使用在線或桌面 XML 格式化工具(如 XMLbeautifier)進行自動格式化;使用 XML 轉換工具(如 XSLT)定義轉換規則;或者使用編程語言(如 Python)進行解析和操作。修改時需謹慎,並備份原始文件。

如何在沒有網絡的情況下在手機上查看XML 如何在沒有網絡的情況下在手機上查看XML Apr 02, 2025 pm 10:30 PM

有兩種查看 XML 文件的方法:安卓手機:使用文件管理器或第三方應用(XML Viewer、DroidEdit)。 iPhone:通過 iCloud Drive 傳輸文件,然後使用“文件”應用程序或第三方應用(XML Buddy、Textastic)。

xml格式化工具推薦 xml格式化工具推薦 Apr 02, 2025 pm 09:03 PM

XML格式化工具可以將代碼按照規則排版,提高可讀性和理解性。選擇工具時,要注意自定義能力、對特殊情況的處理、性能和易用性。常用的工具類型包括在線工具、IDE插件和命令行工具。

See all articles