国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android開發(fā)之繪制平面上的多邊形功能分析

2019-12-12 02:05:33
字體:
供稿:網(wǎng)友

本文實例講述了Android開發(fā)之繪制平面上的多邊形功能。分享給大家供大家參考,具體如下:

計算機里的3D圖形其實是由很多個平面組合而成的。所謂“繪制3D”圖形,其實是通過多個平面圖形形成的。調(diào)用GL10圖形繪制2D圖形的步驟如下:

i. 調(diào)用GL10的glEnableClientState(GL10.GL_VERTEX_ARRAY);方法啟用頂點坐標數(shù)組。

ii. 調(diào)用GL10的glEnableClientState(GL10.GL_COLOR_ARRAY);方法啟用頂點顏色數(shù)組。

iii. 調(diào)用GL10的glVertex (int size,int type,int stride,Buffer pointer);方法設(shè)置頂點的位置數(shù)據(jù)。這個方法中pointer參數(shù)用于指定頂點坐標值,但這里并未使用三維數(shù)組來指定每個頂點X、Y、Z坐標的值,pointer依然是一個一維數(shù)組,其格式為(x1,y1,z1,x2,y2,z2,x3,y3,z3…xN,yN,zN);也就是說該數(shù)組里將會包含3N個數(shù)值,每三個值指定一個頂點的X、Y、Z坐標值的類型,如果頂點坐標值為float類型,則指定為GL10.GL_FLOAT;如果頂點坐標值為整數(shù),則指定為GL10.GL_FIXED

iv. 調(diào)用GL10的glColorPointer(int size,int type,int stride,Buffer pointer)方法設(shè)置頂點的顏色數(shù)據(jù)。這個方法中pointer參數(shù)用于指定頂點的顏色值,pointer依然是一個一維數(shù)組,,其格式為(r1,g1,b1,a1,x2,y2,z2,a2,x3,y3,z3,a3…xN,yN,zN,aN);也就是該數(shù)組里將會包含4N個數(shù)值,每4個值指定一個頂點的紅綠藍透明度的顏色值。第一個參數(shù)size指定多少個元素指定一個頂點位置,該size參數(shù)通常總是4,;type參數(shù)指定頂點坐標值的類型,如果頂點坐標值為float類型,則指定為GL10.GL_FLOAT;如果頂點坐標值為整數(shù),則指定為GL10.GL_FIXED

v. 調(diào)用GL10的glDrawArrays(int mode,int first,int count)方法繪制平面。該方法的第一個參數(shù)用于指定繪制圖形類型,第二個參數(shù)指定從哪個頂點開始繪制,第三個參數(shù)指定總共繪制的定點數(shù)量。

vi. 繪制完成后,調(diào)用GL10的glFinish()方法結(jié)束繪制;并調(diào)用glDisableClientState(int)方法來停用頂點坐標數(shù)據(jù),頂點顏色數(shù)據(jù)。

掌握上面的步驟之后,接下來通過示例程序來繪制幾個簡單的圖形。

public class MyRenderer implements Renderer{ float[] triangleData = new float []{   0.1f,0.6f,0.0f,//上頂點   -0.3f,0.0f,0.0f,//左頂點   0.3f,0.1f,0.0f//右頂點 }; int[] triangleColor = new int []{   65535,0,0,0,//上頂點紅色   0,65535,0,0,//左頂點綠色   0,0,65535,0//右頂點藍色 }; float[] rectData = new float[]{   0.4f,0.4f,0.0f,//右上頂點   0.4f,-0.4f,0.0f,//右下頂點   -0.4f,0.4f,0.0f,//左上頂點   -0.4f,-0.4f,0.0f//左下頂點 }; int[] rectColor = new int []{   0,65535,0,0,//右上頂點綠色   0,0,65535,0,//右下頂點藍色   65535,0,0,0,//左上頂點紅色   65535,65535,0,0//左下頂點黃色 }; float[] rectData2 = new float[]{   -0.4f,0.4f,0.0f,//左上頂點   0.4f,0.4f,0.0f,   0.4f,-0.4f,0.0f,   -0.4f,-0.4f,0.0frectColorBuffer }; float[] pentacle = new float[]{   0.4f,0.4f,0.0f,   -0.2f,0.3f,0.0f,   0.5f,0.0f,0f,   -0.4f,0.0f,0f   -0.1f,-0.3f,0f }; FloatBuffer triangleDataBuffer; IntBuffer triangleColorBuffer; FloatBuffer rectDataBuffer; FloatBuffer rectDataBuffer2; FloatBuffer pentacleBuffer; IntBuffer rectDataBuffer; public MyRenderer() {  //將頂點位置數(shù)據(jù)數(shù)組包裝成FloatBuffer;  triangleDataBuffer = FloatBuffer.wrap(triangleData);  rectDataBuffer =FloatBuffer.wrap(rectData);  rectDataBuffer2 =FloatBuffer.wrap(rectData2);  pentacleBuffer = FloatBuffer.wrap(pentacle);  //將頂點顏色數(shù)據(jù)數(shù)組包裝成IntBuffer;  triangleColorBuffer=IntBuffer.wrap(triangleColor);  rectColorBuffer= IntBuffer.wrap(rectColor); }; //關(guān)閉抗抖動  gl.glDisable(GL10.GL_DITHER);  //設(shè)置系對透視進行修正  gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);  gl.glClearColor(0, 0, 0, 0);  //設(shè)置陰影平滑模式  gl.glShadeModel(GL10.GL_SMOOTH);  //啟用深度測試  gl.glEnable(GL10.GL_DEPTH_TEST);  //設(shè)置深度測試的類型  gl.glDepthFunc(GL10.GL_LEQUAL); } public void onSurfaceChanged(GL10 gl,int width,int height) {  //設(shè)置3D視窗的大小和位置  gl.glViewport(0,0,width,height);  //將當前矩陣模式設(shè)為投影矩陣  gl.glMatrixMode(GL10.GL_PROJECTION);  //初始化單位矩陣  gl.glLoadIdentity();  //計算透視視窗的寬度、高度比  float ratio = (float)width/height;  //調(diào)用此方法設(shè)置透視視窗的空間大小  gl.glFrustumf(-ratio,ratio,-1,1,1,10); } public void onDrawFrame(GL10 gl) {  //清除屏幕緩存和深度緩存  gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);  //啟用頂點坐標數(shù)據(jù)  gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);  //啟用頂點顏色數(shù)據(jù)  gl.glEnableClientState(GL10.GL_COLOR_ARRAY);  //設(shè)置當前矩陣堆棧為模型堆棧  gl.glMatrixMode(GL10.GL_MODELVIEW);  //繪制第一個圖形,重置當前的模型視圖矩陣  gl.glLoadIdentity();  gl.glTranslatef(-0.32f, 0.35f, -1f);  //設(shè)置頂點的位置數(shù)據(jù)  gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangleDataBuffer);  //設(shè)置頂點的顏色數(shù)據(jù)  gl.glColorPointer(4, GL10.GL_FIXED, 0, triangleColorBuffer);  //根據(jù)頂點數(shù)據(jù)繪制平面圖形  gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);  //繪制第二個圖形  gl.glLoadIdentity();  gl.glTranslatef(0.6f, 0.8f, -1.5f);  gl.glVertexPointer(3, GL10.GL_FLOAT, 0, rectDataBuffer);  gl.glColorPointer(4, GL10.GL_FIXED, 0, rectColorBuffer);  gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,4);  //繪制第三個圖形  gl.glLoadIdentity();  gl.glTranslatef(-0.4f, -0.5f, -1.5f);  gl.glVertexPointer(3,GL10.GL_FLOAT, 0, rectDataBuffer2);  gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,4);  //  gl.glLoadIdentity();  gl.glTranslatef(0.4f, -0.5f, -1.5f);  //設(shè)置使用純色填充  gl.glColor4f(1.0f,0.2f,0.2f,0.0f);  gl.glDisableClientState(GL10.GL_COLOR_ARRAY);  gl.glVertexPointer(3, GL10.GL_FLOAT, 0,penTacleBuffer);  gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,5);  //繪制結(jié)束  gl.glFinish();  gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); }}

上面的程序使用GL10繪制圖形的關(guān)鍵代碼:加載頂點位置數(shù)據(jù);加載頂點顏色數(shù)據(jù);調(diào)用GL10的glDrawArrays繪制。

在Activity中定義一個GLSurfaceView,并使用上面的Renderer進行繪制,程序如下:

public void Polygon extends Activity{ public void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  //創(chuàng)建一個GLSurfaceView,用于顯示OpenGL繪制的圖形  GLSurfaceView glView = new GLSurfaceView(this);  //創(chuàng)建GLSurfaceView的內(nèi)容繪制器  MyRenderer myRender = new MyRenderer();  //為GLSurfaceView設(shè)置繪制器  glView.setRenderer(myRender);  setContentView(glView); }}

可能大家會覺得奇怪,為什么第二個和第三個圖形只是定義4個坐標點的順序略有不同,為什么圖形的差異這么大呢?應(yīng)為glDrawArrays方法第一個參數(shù)指定繪制的模式,GL10.GL_TRIANGLES是繪制三角形, GL10.GL_TRIANGLE_STRIP是用多個三角形來繪制多邊形。

對于第2個圖形,當調(diào)用glDrawArrays(int mode,int first,int count )方法時,若指定第一個參數(shù)是GL10.GL_TRIANGLE_STRIP時,系統(tǒng)總會從first個頂點開始,每3個頂點繪制一個三角形。

更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android圖形與圖像處理技巧總結(jié)》、《Android開發(fā)入門與進階教程》、《Android調(diào)試技巧與常見問題解決方法匯總》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)

希望本文所述對大家Android程序設(shè)計有所幫助。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 理塘县| 舞阳县| 习水县| 聊城市| 三台县| 桐乡市| 凌海市| 中方县| 商南县| 股票| 莱州市| 松滋市| 闸北区| 阳原县| 正镶白旗| 清丰县| 大埔区| 黎平县| 永州市| 安宁市| 安仁县| 临西县| 城步| 东辽县| 盐山县| 西藏| 阿克陶县| 桐庐县| 武乡县| 驻马店市| 绿春县| 余干县| 临海市| 蒙阴县| 项城市| 舞钢市| 香港 | 龙山县| 黑水县| 平乐县| 西乌珠穆沁旗|