歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android 3D系列之入門實踐篇

通過Android 3D系列之入門概念篇(見http://www.linuxidc.com/Linux/2011-09/43752.htm)的學習,我們今天編寫一個簡單的入門程序,實現一個不斷繞x軸,y軸旋轉的彩色立方體,效果如下:

相關閱讀:Android 3D 系列之光效篇 http://www.linuxidc.com/Linux/2011-09/43749.htm

在Android中我們使用GLSurfaceView來顯示OpenGL視圖,GLSurfaceView:是其中很重要的一個類,此類位於android.opengl包下,用於管理是一塊可以是復合視圖機器人系統的內存的特殊的曲面。管理一個使表面呈現 OpenGL 的 EGL 顯示。接受一個用戶提供輸入Render對象進行顯示。從 UI 線程實現一個專用線程渲染界面實現3D性能。支持按需要和連續的呈現。 包裝、 跟蹤,和檢查 OpenGL 渲染器調用的錯誤。所以首先我們需要創建一個GLSurfaceView。 

  1. public class mainActivity extends Activity {  
  2.     CubeRenderer mCubeRenderer;  //我們自定義的立方體Renderer   
  3.     @Override  
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         requestWindowFeature(Window.FEATURE_NO_TITLE); // 去掉標題   
  7.         GLSurfaceView GLView = new GLSurfaceView(this); //創建一個GLSurfaceView   
  8.            mCubeRenderer = new CubeRenderer();  
  9.         GLView.setRenderer(mCubeRenderer);  
  10.         setContentView(GLView);  
  11.   
  12.     }  
  13. }  
接下來我們的主要工作就是去創建一個繼承Renderer接口的CubeRenderer。Renderer是一個專門用來渲染3D的接口。繼承它,我們需要重載以下方法:

    public void onDrawFrame(GL10 gl)

//渲染的繪圖操作,重繪時調用   

}    

public void onSurfaceChanged(GL10 gl, int width, int height)    

//視窗改變時調用,通常在此設置視窗范圍以及透視,投影范圍

}   

public void onSurfaceCreated(GL10 gl, EGLConfig config)    

{

//創建時調用,通常在此進行初始化設置

}

以下是我們CubeRenderer的完整代碼:

  1. public class CubeRenderer implements Renderer {  
  2.   
  3.     float box[] = new float[] {  
  4.             // FRONT   
  5.             -0.5f, -0.5f,  0.5f,  
  6.              0.5f, -0.5f,  0.5f,  
  7.             -0.5f,  0.5f,  0.5f,  
  8.              0.5f,  0.5f,  0.5f,  
  9.             // BACK   
  10.             -0.5f, -0.5f, -0.5f,  
  11.             -0.5f,  0.5f, -0.5f,  
  12.              0.5f, -0.5f, -0.5f,  
  13.              0.5f,  0.5f, -0.5f,  
  14.             // LEFT   
  15.             -0.5f, -0.5f,  0.5f,  
  16.             -0.5f,  0.5f,  0.5f,  
  17.             -0.5f, -0.5f, -0.5f,  
  18.             -0.5f,  0.5f, -0.5f,  
  19.             // RIGHT   
  20.              0.5f, -0.5f, -0.5f,  
  21.              0.5f,  0.5f, -0.5f,  
  22.              0.5f, -0.5f,  0.5f,  
  23.              0.5f,  0.5f,  0.5f,  
  24.             // TOP   
  25.             -0.5f,  0.5f,  0.5f,  
  26.              0.5f,  0.5f,  0.5f,  
  27.              -0.5f,  0.5f, -0.5f,  
  28.              0.5f,  0.5f, -0.5f,  
  29.             // BOTTOM   
  30.             -0.5f, -0.5f,  0.5f,  
  31.             -0.5f, -0.5f, -0.5f,  
  32.              0.5f, -0.5f,  0.5f,  
  33.              0.5f, -0.5f, -0.5f,  
  34.         };  
  35.   
  36.     FloatBuffer cubeBuff;  
  37.       
  38.     float xrot = 0.0f;  
  39.     float yrot = 0.0f;  
  40.       
  41.     /** 
  42.      * 將float數組轉換存儲在字節緩沖數組 
  43.      * @param arr 
  44.      * @return 
  45.      */  
  46.     public FloatBuffer makeFloatBuffer(float[] arr) {  
  47.         ByteBuffer bb = ByteBuffer.allocateDirect(arr.length * 4);//分配緩沖空間,一個float占4個字節   
  48.         bb.order(ByteOrder.nativeOrder()); //設置字節順序, 其中ByteOrder.nativeOrder()是獲取本機字節順序   
  49.         FloatBuffer fb = bb.asFloatBuffer(); //轉換為float型   
  50.         fb.put(arr);        //添加數據   
  51.         fb.position(0);      //設置數組的起始位置   
  52.         return fb;  
  53.     }  
  54.       
  55.     public CubeRenderer() {  
  56.         // TODO Auto-generated constructor stub   
  57.         cubeBuff = makeFloatBuffer(box);//轉換float數組   
  58.     }  
  59.       
  60.       
  61.     protected void init(GL10 gl) {  
  62.         gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);//設置清屏時背景的顏色,R,G,B,A   
  63.           
  64.         gl.glEnable(GL10.GL_DEPTH_TEST); //啟用深度緩存   
  65.         gl.glEnable(GL10.GL_CULL_FACE);  //啟用背面剪裁   
  66.         gl.glClearDepthf(1.0f);    // 設置深度緩存值   
  67.         gl.glDepthFunc(GL10.GL_LEQUAL);  // 設置深度緩存比較函數,GL_LEQUAL表示新的像素的深度緩存值小於等於當前像素的深度緩存值(通過gl.glClearDepthf(1.0f)設置)時通過深度測試      
  68.         gl.glShadeModel(GL10.GL_SMOOTH);// 設置陰影模式GL_SMOOTH   
  69.     }  
  70.       
  71.     @Override  
  72.     public void onSurfaceCreated(GL10 gl, EGLConfig config) {  
  73.         // TODO Auto-generated method stub   
  74.         init(gl);  
  75.     }  
  76.       
  77.     @Override  
  78.     public void onSurfaceChanged(GL10 gl, int w, int h) {  
  79.         // TODO Auto-generated method stub   
  80.         gl.glViewport(00, w, h); //設置視窗   
  81.         gl.glMatrixMode(GL10.GL_PROJECTION); // 設置投影矩陣   
  82.         gl.glLoadIdentity();  //設置矩陣為單位矩陣,相當於重置矩陣          
  83.         GLU.gluPerspective(gl, 45.0f, ((float) w) / h, 0.1f, 10f);//設置透視范圍     
  84.     }  
  85.       
  86.     @Override  
  87.     public void onDrawFrame(GL10 gl) {  
  88.         // TODO Auto-generated method stub   
  89.         gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);// 清除屏幕和深度緩存   
  90.           
  91.         gl.glMatrixMode(GL10.GL_MODELVIEW);   //切換至模型觀察矩陣   
  92.         gl.glLoadIdentity();// 重置當前的模型觀察矩陣   
  93.         GLU.gluLookAt(gl, 003000010);//設置視點和模型中心位置   
  94.       
  95.         gl.glVertexPointer(3, GL10.GL_FLOAT, 0, cubeBuff);//設置頂點數據   
  96.         gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);  
  97.       
  98.         gl.glRotatef(xrot, 100);  //繞著(0,0,0)與(1,0,0)即x軸旋轉   
  99.         gl.glRotatef(yrot, 010);  
  100.           
  101.         gl.glColor4f(1.0f, 001.0f);   //設置顏色,紅色   
  102.         gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 04);  //繪制正方型FRONT面   
  103.         gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 44);  
  104.       
  105.         gl.glColor4f(01.0f, 01.0f);  
  106.         gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 84);  
  107.         gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 124);  
  108.           
  109.         gl.glColor4f(001.0f, 1.0f);  
  110.         gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 164);  
  111.         gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 204);  
  112.       
  113.         xrot += 1.0f;  
  114.         yrot += 0.5f;  
  115.     }  
  116.   
  117. }  

本文源碼工程下載地址:

免費下載地址在 http://linux.linuxidc.com/

用戶名與密碼都是www.linuxidc.com

具體下載目錄在 /pub/Android源碼集錦/2011年/9月/Android 3D系列之入門實踐篇源碼/

Copyright © Linux教程網 All Rights Reserved