Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 初級開發 >> Android下用OpenGL畫的一個旋轉的圓形

Android下用OpenGL畫的一個旋轉的圓形

編輯:初級開發

這是我在android下用OGL ES畫的第一個圖形,Render的override部分引用了其它同學的一些代碼
怎麼上截圖?

Java代碼
  1. public class GLRender implements Renderer{   
  2.   
  3.        
  4.     float rotateAngle;   
  5.        
  6.     //頂點數組,GL ES只能用這個辦法畫圓嗎?   
  7.     private float[] vertices = new float[720];   
  8.   
  9.     //度到弧度的轉換   
  10.     public float DegToRad(float deg)   
  11.     {   
  12.         return (float) (3.14159265358979323846 * deg / 180.0);   
  13.     }   
  14.   
  15.        
  16.     @Override  
  17.     public void onDrawFrame(GL10 gl) {   
  18.         // TODO Auto-generated method stub   
  19.            
  20.         // 進入這個函數第一件要做的事就是清除屏幕和深度緩存   
  21.         gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);   
  22.   
  23.         //畫圓形   
  24.         drawCircle(gl);   
  25.     }   
  26.        
  27.     public void drawCircle(GL10 gl)   
  28.     {   
  29.         //重置投影矩陣   
  30.         gl.glLoadIdentity();   
  31.         // 移動操作,移入屏幕(Z軸)5個像素, x, y , z   
  32.         gl.glTranslatef(0.0f, 0.0f, -5.0f);   
  33.            
  34.         //旋轉, angle, x, y , z   
  35.         gl.glRotatef(rotateAngle, 1.0f, 0.0f, 0.0f);   
  36.   
  37.         // 設置當前色為紅色, R, G, B, Alpha   
  38.         gl.glColor4f(1.0f, 0.1f, 0.1f, 1.0f);   
  39.            
  40.         //設置圓形頂點數據,這個是在創建時生成   
  41.         FloatBuffer verBuffer = FloatBuffer.wrap(vertices);   
  42.   
  43.         //設置頂點類型為浮點坐標(GL_FLOAT),不設置或者設置錯誤類型將導致圖形不能顯示或者顯示錯誤   
  44.         gl.glVertexPointer(2, GL10.GL_FLOAT, 0, verBuffer);   
  45.   
  46.         //打開頂點數組   
  47.         gl.glEnableClIEntState(GL10.GL_VERTEX_ARRAY);   
  48.            
  49.         //向OGL發送實際畫圖指令   
  50.         gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0360);   
  51.            
  52.         //關閉頂點數組功能   
  53.         gl.glDisableClIEntState(GL10.GL_VERTEX_ARRAY);   
  54.   
  55.         //畫圖結束   
  56.         gl.glFinish();   
  57.            
  58.         //更改旋轉角度   
  59.         rotateAngle += 0.5;   
  60.     }   
  61.        
  62.   
  63.     @Override  
  64.     public void onSurfaceChanged(GL10 gl, int width, int height) {   
  65.         // TODO Auto-generated method stub   
  66.            
  67.         float ratio = (float) width / height;   
  68.         //設置OpenGL場景的大小   
  69.         gl.glVIEwport(00, width, height);   
  70.         //設置投影矩陣   
  71.         gl.glMatrixMode(GL10.GL_PROJECTION);   
  72.         //重置投影矩陣   
  73.         gl.glLoadIdentity();   
  74.         // 設置視口的大小   
  75.         gl.glFrustumf(-ratio, ratio, -11110);   
  76.         // 選擇模型觀察矩陣   
  77.         gl.glMatrixMode(GL10.GL_MODELVIEW);       
  78.         // 重置模型觀察矩陣   
  79.         gl.glLoadIdentity();       
  80.            
  81.     }   
  82.   
  83.     @Override  
  84.     public void onSurfaceCreated(GL10 gl, EGLConfig config) {   
  85.         // TODO Auto-generated method stub   
  86.         // 啟用陰影平滑   
  87.         gl.glShadeModel(GL10.GL_SMOOTH);   
  88.         // 黑色背景   
  89.         gl.glClearColor(0000);   
  90.         // 設置深度緩存   
  91.         gl.glClearDepthf(1.0f);                               
  92.         // 啟用深度測試   
  93.         gl.glEnable(GL10.GL_DEPTH_TEST);                           
  94.         // 所作深度測試的類型   
  95.         gl.glDepthFunc(GL10.GL_LEQUAL);                               
  96.            
  97.         // 告訴系統對透視進行修正   
  98.         gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);   
  99.            
  100.            
  101.         //初始化圓形數據   
  102.         for (int i = 0; i < 720; i += 2) {   
  103.             // x value   
  104.             vertices[i]   = (float) (Math.cos(DegToRad(i)) * 1);   
  105.             // y value   
  106.             vertices[i+1] = (float) (Math.sin(DegToRad(i)) * 1);   
  107.         }   
  108.     }   
  109. }  
復制代碼復制打印代碼打印
  1. public class GLRender implements Renderer{   
  2.   
  3.        
  4.     float rotateAngle;   
  5.        
  6.     //頂點數組,GL ES只能用這個辦法畫圓嗎?   
  7.     private float[] vertices = new float[720];   
  8.   
  9.     //度到弧度的轉換   
  10.     public float DegToRad(float deg)   
  11.     {   
  12.         return (float) (3.14159265358979323846 * deg / 180.0);   
  13.     }   
  14.   
  15.        
  16.     @Override  
  17.     public void onDrawFrame(GL10 gl) {   
  18.         // TODO Auto-generated method stub   
  19.            
  20.         // 進入這個函數第一件要做的事就是清除屏幕和深度緩存   
  21.         gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);   
  22.   
  23.         //畫圓形   
  24.         drawCircle(gl);   
  25.     }   
  26.        
  27.     public void drawCircle(GL10 gl)   
  28.     {   
  29.         //重置投影矩陣   
  30.         gl.glLoadIdentity();   
  31.         // 移動操作,移入屏幕(Z軸)5個像素, x, y , z   
  32.         gl.glTranslatef(0.0f, 0.0f, -5.0f);   
  33.            
  34.         //旋轉, angle, x, y , z   
  35.         gl.glRotatef(rotateAngle, 1.0f, 0.0f, 0.0f);   
  36.   
  37.         // 設置當前色為紅色, R, G, B, Alpha   
  38.         gl.glColor4f(1.0f, 0.1f, 0.1f, 1.0f);   
  39.            
  40.         //設置圓形頂點數據,這個是在創建時生成   
  41.         FloatBuffer verBuffer = FloatBuffer.wrap(vertices);   
  42.   
  43.         //設置頂點類型為浮點坐標(GL_FLOAT),不設置或者設置錯誤類型將導致圖形不能顯示或者顯示錯誤   
  44.         gl.glVertexPointer(2, GL10.GL_FLOAT, 0, verBuffer);   
  45.   
  46.         //打開頂點數組   
  47.         gl.glEnableClIEntState(GL10.GL_VERTEX_ARRAY);   
  48.            
  49.         //向OGL發送實際畫圖指令   
  50.         gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0360);   
  51.            
  52.         //關閉頂點數組功能   
  53.         gl.glDisableClIEntState(GL10.GL_VERTEX_ARRAY);   
  54.   
  55.         //畫圖結束   
  56.         gl.glFinish();   
  57.            
  58.         //更改旋轉角度   
  59.         rotateAngle += 0.5;   
  60.     }   
  61.        
  62.   
  63.     @Override  
  64.     public void onSurfaceChanged(GL10 gl, int width, int height) {   
  65.         // TODO Auto-generated method stub   
  66.            
  67.         float ratio = (float) width / height;   
  68.         //設置OpenGL場景的大小   
  69.         gl.glVIEwport(00, width, height);   
  70.         //設置投影矩陣   
  71.         gl.glMatrixMode(GL10.GL_PROJECTION);   
  72.         //重置投影矩陣   
  73.         gl.glLoadIdentity();   
  74.         // 設置視口的大小   
  75.         gl.glFrustumf(-ratio, ratio, -11110);   
  76.         // 選擇模型觀察矩陣   
  77.         gl.glMatrixMode(GL10.GL_MODELVIEW);       
  78.         // 重置模型觀察矩陣   
  79.         gl.glLoadIdentity();       
  80.            
  81.     }   
  82.   
  83.     @Override  
  84.     public void onSurfaceCreated(GL10 gl, EGLConfig config) {   
  85.         // TODO Auto-generated method stub   
  86.         // 啟用陰影平滑   
  87.         gl.glShadeModel(GL10.GL_SMOOTH);   
  88.         // 黑色背景   
  89.         gl.glClearColor(0000);   
  90.         // 設置深度緩存   
  91.         gl.glClearDepthf(1.0f);                               
  92.         // 啟用深度測試   
  93.         gl.glEnable(GL10.GL_DEPTH_TEST);                           
  94.         // 所作深度測試的類型   
  95.         gl.glDepthFunc(GL10.GL_LEQUAL);                               
  96.            
  97.         // 告訴系統對透視進行修正   
  98.         gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);   
  99.            
  100.            
  101.         //初始化圓形數據   
  102.         for (int i = 0; i < 720; i += 2) {   
  103.             // x value   
  104.             vertices[i]   = (float) (Math.cos(DegToRad(i)) * 1);   
  105.             // y value   
  106.             vertices[i+1] = (float) (Math.sin(DegToRad(i)) * 1);   
  107.         }   
  108.     }   
  109. }  

完整程序見附件
再補充一點:
上面的例子畫的是實心的圓,如果想畫空心的圓只要把這句:
gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, 360);  
改為
gl.glDrawArrays(GL10.GL_LINE_STRIP, 0, 360);
即可
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved