楊乾
摘要:介紹了android平臺對OpenGL的支持,流行的obj三維文件格式。并論述了如何在android平臺中對obj格式進(jìn)行載人和渲染。重點(diǎn)是介紹了如何用程序?qū)崿F(xiàn)obj模型的載人和渲染。
關(guān)鍵詞:三維模型; opengl; obj; android; 3d
中圖分類號:TP18文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2012)16-3951-03
Load and Render Three-dimensional Model of Obj in the Android
YANG Qian
(Department of Automation, Xiamen University, Xiamen 361005, China)
Abstract:Introduce the support for OpenGL of the Android platform and popular obj 3D file format.discusses how to load and render the obj model in the android .the focus is how to load and render the obj model with the program.
Key words:three-dimensional model; opengl; obj; android; 3d
OpenGL是個(gè)專業(yè)的3D程序接口,是一個(gè)功能強(qiáng)大,調(diào)用方便的底層3D圖形庫。OpenGL的前身是SGI公司為其圖形工作站開的IRIS GL。IRIS GL是一個(gè)工業(yè)標(biāo)準(zhǔn)的3D圖形軟件接口,功能雖然強(qiáng)大但是移植性不好,于是SGI公司便在IRIS GL的基礎(chǔ)上開發(fā)OpenGL。Android 3D引擎采用的是OpenGL ES。OpenGL ES是一套為手持和嵌入式系統(tǒng)設(shè)計(jì)的3D引擎API,由Khronos公司維護(hù)。在PC領(lǐng)域,一直有兩種標(biāo)準(zhǔn)的3D API進(jìn)行競爭,OpenGL和DirectX。一般主流的游戲和顯卡都支持這兩種渲染方式,Direc? tX在Windows平臺上有很大的優(yōu)勢,但是OpenGL具有更好的跨平臺性。由于嵌入式系統(tǒng)和PC相比,一般說來,CPU、內(nèi)存等都比PC差很多,而且對能耗有著特殊的要求,許多嵌入式設(shè)備并沒有浮點(diǎn)運(yùn)算協(xié)處理器,針對嵌入式系統(tǒng)的以上特點(diǎn),Khronos對標(biāo)準(zhǔn)的OpenGL系統(tǒng)進(jìn)行了維護(hù)和改動,以期望滿足嵌入式設(shè)備對3D繪圖的要求。
Android系統(tǒng)使用OpenGL的標(biāo)準(zhǔn)接口來支持3D圖形功能,android 3D圖形系統(tǒng)也分為java框架和本地代碼兩部分。本地代碼主要實(shí)現(xiàn)的OpenGL接口的庫,在Java框架層,javax.microedition.khronos.opengles是java標(biāo)準(zhǔn)的OpenGL包,android.opengl包提供了OpenGL系統(tǒng)和Android GUI系統(tǒng)之間的聯(lián)系。
在真正的游戲中,我們要繪制的3D物體往往十分復(fù)雜,我們通常的做法都是在專門的建模工具中創(chuàng)建模型,再將模型導(dǎo)出為特定的格式,然后在我們的程序載入這個(gè)模型并進(jìn)行渲染。在計(jì)算機(jī)平臺上,常用的3D模型有3DS、OBJ、MD2、MD3、MDL等多種格式。這里只介紹OBJ模型。
public int illum;//光照模型illum
public String textureFileKa;//環(huán)境反射指定紋理文件map_Ka
public String textureFileKd;//漫反射指定紋理文件map_Kd
public String textureFileKs;//鏡面反射指定紋理文件map_Ks
}
大模型TDModel類
public class TDModel {
Vector
public float left = 0;//模型最左邊
public float right = 0;//模型最右邊
public float front = 0;//模型最前邊
public float back = 0;//模型最后邊
public float bottom = 0;//模型最上邊
public float top = 0;//模型最下邊
public void draw(GL10 gl) {}//定義模型渲染的方法
}
同時(shí)定義了兩個(gè)輔助類對obj和mtl文件進(jìn)行加載。Obj文件加載類
public class OBJParser {
//返回讀取的模型,模型坐標(biāo)為opengl左手坐標(biāo),yz軸根據(jù)3dmax翻轉(zhuǎn)public TDModel parseOBJ(String fileName) {}}
mtl文件加載類
public class MTLParser {
//返回材質(zhì)庫
public static Vector
}
這些加載和渲染方法定義好之后就剩下android平臺的實(shí)現(xiàn)了。Android的界面顯示需要定義Activity,界面中需要View來顯示3d模型。Android專門定義了GLSurfaceView建立了與opengl之間的聯(lián)系。
所以定義類OBJToDATASurfaceView繼承GLSurfaceView實(shí)現(xiàn)Renderer接口。就可以繪制出obj模型了。一下是一個(gè)obj模型在android上各個(gè)側(cè)面的渲染截圖。
Obj模型文件的載人和渲染已經(jīng)完成,程序渲染效果比較理想,材質(zhì)也渲染出來了,程序還實(shí)現(xiàn)了模型貼圖的渲染。如果要實(shí)現(xiàn)android游戲的開發(fā),除了模型外,還要有動畫實(shí)現(xiàn),物理引擎等很多復(fù)雜的東西,但是模型載人是這些游戲的基礎(chǔ)。
[1]劉甫迎.Android移動編程實(shí)用教程[M].北京:電子工業(yè)出版社,2012.
[2]吳亞峰,蘇亞光. Android游戲開發(fā)大全[M].北京:人民郵電出版社,2012.
[3]郝玉龍.Android程序設(shè)計(jì)基礎(chǔ)[M].北京:清華大學(xué)出版社,2012.
[4]安吉爾.交互式計(jì)算機(jī)圖形學(xué)[M].5版.北京:電子工業(yè)出版社,2009.
[5]呂???周小平.實(shí)戰(zhàn)OpenGL三維可視化系統(tǒng)開發(fā)與源碼精解[M].北京:電子工業(yè)出版社,2009.
[6]希爾.計(jì)算機(jī)圖形學(xué)[M].3版.北京:清華大學(xué)出版社,2007.
[7]徐明亮,盧紅星,王琬.OpenGL游戲編程[M].北京:機(jī)械工業(yè)出版社,2008.