Android編程之OpenGL繪圖技巧總結(jié)
本文實例講述了Android編程之OpenGL繪圖技巧。分享給大家供大家參考,具體如下:
很久不用OpenGL ES繪圖,怕自己忘記了,于是重新復(fù)習(xí)一遍,順便原理性的東西總結(jié)如下:
1. Android 3D坐標(biāo)系統(tǒng)
如圖:
Android的三維坐標(biāo)系統(tǒng)中:
坐標(biāo)原點位于中央,
X軸從左向右延伸,原點左邊的值為負(fù)數(shù),右邊為正數(shù);
Y軸從下向上延伸,原點下邊的值為負(fù)數(shù),上邊為正數(shù);
Z軸屏幕里面向外面延伸,屏幕里面為負(fù)數(shù),外面為正數(shù)。
2. 開發(fā)工具(OpenGL和OpenGL ES)介紹
OpenGL:Open Graphics Library,開放的圖形庫接口,跨編程語言,跨平臺的編程接口的規(guī)范。適用于圖新工作站,個人PC上。
OpenGL ES:OpenGL for Embedded System,OpenGL的一個子集,在OpenGL的基礎(chǔ)上,剔除了glBegin/glEnd,四邊形,多邊形等許多非絕對必要的特性。適用于小型設(shè)備多種嵌入式系統(tǒng)。
3. 使用OpenGL ES繪制圖形原理
(1),OpenGL Es的畫筆gl10在繪制圖形的時候有兩種模式:
① GL10.GL_TRIANGLES: 繪制三角形
② GL10.GL_TRIANGLE_STRIP: 用多個三角形來繪制多邊形
也就是說,OpenGL Es只能繪制三角形組成的3D圖形。
(2),繪制2D圖形時,gl10繪制圖形的方法glDrawArrays(int mode,int first,int count);
當(dāng)?shù)谝粋€參數(shù)為上面的第二個模式的時候,代表系統(tǒng)會用多個三角形來繪制多邊形,從第first個頂點開始,每三個頂點繪制一個三角形。例如我們一開始給出的點數(shù)據(jù)源中包含點(0,1,2,3)四個點,我們的繪制方法為glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,4),代表我們將繪制兩個三角形,分別由0,1,2三個頂點組成的三角形,和1,2,3三個頂點組成的三角形。所繪制的圖形如下圖:
所以,如果當(dāng)我們給出的源數(shù)據(jù)的位置變了,則圖形也相應(yīng)的發(fā)生了變化,例如我們一開是給出的點數(shù)據(jù)源包含點(0,1,2,3)四個點,其他的我們跟上面的一樣,只是將點的位置發(fā)生了變化,所繪制的圖形如下:
(3),繪制3D圖形,繪制3D圖形跟繪制2D圖形的步驟基本相似,區(qū)別只是繪制3D圖形不僅需要定義各頂點位置的坐標(biāo),還需要定義3D圖形的各個三角形由哪些頂點組成。
跟2D一樣,gl繪制3D的方法:glDrawElements(int mode,int count,int type,Buffer indices)。試想想,當(dāng)我們把繪制2D圖形的點不設(shè)在同一個平面上,這樣圖形不就是成了3D圖形了,3D圖形的繪制,還必須需要我們自己給出繪制面的點的組合的數(shù)據(jù)源,也就是必須給出有幾個面,每個面是由那幾個點組成。
4. Android中使用OpenGL ES步驟
(1),創(chuàng)建GLSurfaceView組件,使用Activity來顯示GLSurfaceView組件
(2),為GLSurfaceView組件創(chuàng)建GLSurfaceView.Renderer實例,實現(xiàn)GLSurfaceView.Renderer類時需要實現(xiàn)該接口里德三個方法。
a、abstract void onDrawFrame(GL10 gl);
b、abstract void onSurfaceChanged(GL10 gl,int width,int height);
c、abstract void OnSurfaceCreated(GL10 gl,EGLConfig config);
(3),調(diào)用GLSurfaceView組件的setRenderer()方法制定Renderer對象,該Renderer對象將會完成GLSurfaceView里3D圖形的繪制。
5. 三維坐標(biāo)系統(tǒng)與二維坐標(biāo)系統(tǒng)的不同
二維坐標(biāo)系統(tǒng)上的坐標(biāo)值通常就直接使用系統(tǒng)的像素數(shù)量
三位坐標(biāo)系統(tǒng)的坐標(biāo)值則取決于glFrustumf()方法的設(shè)置.
此方法glFrustumf(float left,float right,float bottom,float top,float zNear,float zFar)
該方法用于設(shè)置透視投影的空間大小,前兩個參數(shù)用于設(shè)置X軸上的最小坐標(biāo)值和最大坐標(biāo)值,中間兩個參數(shù)用于設(shè)置Y軸上的最小坐標(biāo)值和最大坐標(biāo)值,后面兩個參數(shù)用于設(shè)置Z軸上最小坐標(biāo)值和最大坐標(biāo)值。
希望本文所述對大家Android程序設(shè)計有所幫助。
相關(guān)文章
Android9.0 SystemUI 網(wǎng)絡(luò)信號欄定制修改的流程解析
這篇文章主要介紹了Android9.0 SystemUI 網(wǎng)絡(luò)信號欄定制修改的流程,本文通過圖文實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-11-11Android onMeasure與onDraw及自定義屬性使用示例
這篇文章主要介紹了Android onMeasure與onDraw及自定義屬性使用示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-02-02Android 通過SQLite數(shù)據(jù)庫實現(xiàn)數(shù)據(jù)存儲管理
SQLiteOpenHelper 是Android 提供的一個抽象工具類,負(fù)責(zé)管理數(shù)據(jù)庫的創(chuàng)建、升級工作。本文主要介紹了如何使用SQLite數(shù)據(jù)庫實現(xiàn)對數(shù)據(jù)進(jìn)行存儲管理,感興趣的可以了解一下2021-11-11Android WebView 不支持 H5 input type="file" 解決方法
這篇文章主要介紹了Android WebView 不支持 H5 input type="file" 解決方法,需要的朋友可以參考下2017-06-06基于Android實現(xiàn)桌面懸浮清內(nèi)存app概述
最近沒有項目做,于是寫了個小程序練練手,android桌面懸浮清內(nèi)存app概述,感興趣的朋友一起學(xué)習(xí)吧2015-12-12Android MVP BaseFragment 通用式封裝的實現(xiàn)
這篇文章主要介紹了Android MVP BaseFragment 通用式封裝的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Android基于OpenGL在GLSurfaceView上繪制三角形及使用投影和相機(jī)視圖方法示例
這篇文章主要介紹了Android基于OpenGL在GLSurfaceView上繪制三角形及使用投影和相機(jī)視圖方法,結(jié)合實例形式分析了Android基于OpenGL的圖形繪制技巧,需要的朋友可以參考下2016-10-10