您好,登錄后才能下訂單哦!
本文實例講述了Android開發之繪制平面上的多邊形功能。分享給大家供大家參考,具體如下:
計算機里的3D圖形其實是由很多個平面組合而成的。所謂“繪制3D”圖形,其實是通過多個平面圖形形成的。調用GL10圖形繪制2D圖形的步驟如下:
i. 調用GL10的glEnableClientState(GL10.GL_VERTEX_ARRAY);
方法啟用頂點坐標數組。
ii. 調用GL10的glEnableClientState(GL10.GL_COLOR_ARRAY);
方法啟用頂點顏色數組。
iii. 調用GL10的glVertex (int size,int type,int stride,Buffer pointer);
方法設置頂點的位置數據。這個方法中pointer參數用于指定頂點坐標值,但這里并未使用三維數組來指定每個頂點X、Y、Z坐標的值,pointer依然是一個一維數組,其格式為(x1,y1,z1,x2,y2,z2,x3,y3,z3…xN,yN,zN);也就是說該數組里將會包含3N個數值,每三個值指定一個頂點的X、Y、Z坐標值的類型,如果頂點坐標值為float類型,則指定為GL10.GL_FLOAT;如果頂點坐標值為整數,則指定為GL10.GL_FIXED。
iv. 調用GL10的glColorPointer(int size,int type,int stride,Buffer pointer)
方法設置頂點的顏色數據。這個方法中pointer參數用于指定頂點的顏色值,pointer依然是一個一維數組,,其格式為(r1,g1,b1,a1,x2,y2,z2,a2,x3,y3,z3,a3…xN,yN,zN,aN);也就是該數組里將會包含4N個數值,每4個值指定一個頂點的紅綠藍透明度的顏色值。第一個參數size指定多少個元素指定一個頂點位置,該size參數通常總是4,;type參數指定頂點坐標值的類型,如果頂點坐標值為float類型,則指定為GL10.GL_FLOAT;如果頂點坐標值為整數,則指定為GL10.GL_FIXED。
v. 調用GL10的glDrawArrays(int mode,int first,int count)
方法繪制平面。該方法的第一個參數用于指定繪制圖形類型,第二個參數指定從哪個頂點開始繪制,第三個參數指定總共繪制的定點數量。
vi. 繪制完成后,調用GL10的glFinish()
方法結束繪制;并調用glDisableClientState(int)
方法來停用頂點坐標數據,頂點顏色數據。
掌握上面的步驟之后,接下來通過示例程序來繪制幾個簡單的圖形。
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.0f rectColorBuffer }; 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() { //將頂點位置數據數組包裝成FloatBuffer; triangleDataBuffer = FloatBuffer.wrap(triangleData); rectDataBuffer =FloatBuffer.wrap(rectData); rectDataBuffer2 =FloatBuffer.wrap(rectData2); pentacleBuffer = FloatBuffer.wrap(pentacle); //將頂點顏色數據數組包裝成IntBuffer; triangleColorBuffer=IntBuffer.wrap(triangleColor); rectColorBuffer= IntBuffer.wrap(rectColor); }; //關閉抗抖動 gl.glDisable(GL10.GL_DITHER); //設置系對透視進行修正 gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); gl.glClearColor(0, 0, 0, 0); //設置陰影平滑模式 gl.glShadeModel(GL10.GL_SMOOTH); //啟用深度測試 gl.glEnable(GL10.GL_DEPTH_TEST); //設置深度測試的類型 gl.glDepthFunc(GL10.GL_LEQUAL); } public void onSurfaceChanged(GL10 gl,int width,int height) { //設置3D視窗的大小和位置 gl.glViewport(0,0,width,height); //將當前矩陣模式設為投影矩陣 gl.glMatrixMode(GL10.GL_PROJECTION); //初始化單位矩陣 gl.glLoadIdentity(); //計算透視視窗的寬度、高度比 float ratio = (float)width/height; //調用此方法設置透視視窗的空間大小 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); //啟用頂點坐標數據 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); //啟用頂點顏色數據 gl.glEnableClientState(GL10.GL_COLOR_ARRAY); //設置當前矩陣堆棧為模型堆棧 gl.glMatrixMode(GL10.GL_MODELVIEW); //繪制第一個圖形,重置當前的模型視圖矩陣 gl.glLoadIdentity(); gl.glTranslatef(-0.32f, 0.35f, -1f); //設置頂點的位置數據 gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangleDataBuffer); //設置頂點的顏色數據 gl.glColorPointer(4, GL10.GL_FIXED, 0, triangleColorBuffer); //根據頂點數據繪制平面圖形 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); //設置使用純色填充 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); //繪制結束 gl.glFinish(); gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); } }
上面的程序使用GL10繪制圖形的關鍵代碼:加載頂點位置數據;加載頂點顏色數據;調用GL10的glDrawArrays繪制。
在Activity中定義一個GLSurfaceView,并使用上面的Renderer進行繪制,程序如下:
public void Polygon extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //創建一個GLSurfaceView,用于顯示OpenGL繪制的圖形 GLSurfaceView glView = new GLSurfaceView(this); //創建GLSurfaceView的內容繪制器 MyRenderer myRender = new MyRenderer(); //為GLSurfaceView設置繪制器 glView.setRenderer(myRender); setContentView(glView); } }
可能大家會覺得奇怪,為什么第二個和第三個圖形只是定義4個坐標點的順序略有不同,為什么圖形的差異這么大呢?應為glDrawArrays
方法第一個參數指定繪制的模式,GL10.GL_TRIANGLES是繪制三角形, GL10.GL_TRIANGLE_STRIP是用多個三角形來繪制多邊形。
對于第2個圖形,當調用glDrawArrays(int mode,int first,int count )
方法時,若指定第一個參數是GL10.GL_TRIANGLE_STRIP時,系統總會從first個頂點開始,每3個頂點繪制一個三角形。
更多關于Android相關內容感興趣的讀者可查看本站專題:《Android圖形與圖像處理技巧總結》、《Android開發入門與進階教程》、《Android調試技巧與常見問題解決方法匯總》、《Android基本組件用法總結》、《Android視圖View技巧總結》、《Android布局layout技巧總結》及《Android控件用法總結》
希望本文所述對大家Android程序設計有所幫助。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。