android 3D系列之入門實踐篇

來源:互聯網
上載者:User

                                                           By 何明桂(http://blog.csdn.net/hmg25) 轉載請註明出處
    通過之前文章--概念篇的學習,我們今天編寫一個簡單的入門程式,實現一個不斷繞x軸,y軸旋轉的彩色立方體,效果如下:

                                             

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

public class mainActivity extends Activity {CubeRenderer mCubeRenderer;  //我們自訂的立方體Renderer@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE); // 去掉標題GLSurfaceView GLView = new GLSurfaceView(this); //建立一個GLSurfaceView       mCubeRenderer = new CubeRenderer();GLView.setRenderer(mCubeRenderer);setContentView(GLView);}}

接下來我們的主要工作就是去建立一個繼承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的完整代碼:

public class CubeRenderer implements Renderer {float box[] = new float[] {// FRONT-0.5f, -0.5f,  0.5f, 0.5f, -0.5f,  0.5f,-0.5f,  0.5f,  0.5f, 0.5f,  0.5f,  0.5f,// BACK-0.5f, -0.5f, -0.5f,-0.5f,  0.5f, -0.5f, 0.5f, -0.5f, -0.5f, 0.5f,  0.5f, -0.5f,// LEFT-0.5f, -0.5f,  0.5f,-0.5f,  0.5f,  0.5f,-0.5f, -0.5f, -0.5f,-0.5f,  0.5f, -0.5f,// RIGHT 0.5f, -0.5f, -0.5f, 0.5f,  0.5f, -0.5f, 0.5f, -0.5f,  0.5f, 0.5f,  0.5f,  0.5f,// TOP-0.5f,  0.5f,  0.5f, 0.5f,  0.5f,  0.5f, -0.5f,  0.5f, -0.5f, 0.5f,  0.5f, -0.5f,// BOTTOM-0.5f, -0.5f,  0.5f,-0.5f, -0.5f, -0.5f, 0.5f, -0.5f,  0.5f, 0.5f, -0.5f, -0.5f,};FloatBuffer cubeBuff;float xrot = 0.0f;float yrot = 0.0f;/** * 將float數群組轉換儲存在位元組緩衝數組 * @param arr * @return */public FloatBuffer makeFloatBuffer(float[] arr) {ByteBuffer bb = ByteBuffer.allocateDirect(arr.length * 4);//分配緩衝空間,一個float佔4個位元組bb.order(ByteOrder.nativeOrder()); //設定位元組順序, 其中ByteOrder.nativeOrder()是擷取本機位元組順序FloatBuffer fb = bb.asFloatBuffer(); //轉換為float型fb.put(arr);        //添加資料fb.position(0);      //設定數組的起始位置return fb;}public CubeRenderer() {// TODO Auto-generated constructor stubcubeBuff = makeFloatBuffer(box);//轉換float數組}protected void init(GL10 gl) {gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);//設定清屏時背景的顏色,R,G,B,Agl.glEnable(GL10.GL_DEPTH_TEST); //啟用深度緩衝gl.glEnable(GL10.GL_CULL_FACE);  //啟用背面剪裁gl.glClearDepthf(1.0f);    // 設定深度緩衝值gl.glDepthFunc(GL10.GL_LEQUAL);  // 設定深度緩衝比較函數,GL_LEQUAL表示新的像素的深度緩衝值小於等於當前像素的深度緩衝值(通過gl.glClearDepthf(1.0f)設定)時通過深度測試gl.glShadeModel(GL10.GL_SMOOTH);// 設定陰影模式GL_SMOOTH}@Overridepublic void onSurfaceCreated(GL10 gl, EGLConfig config) {// TODO Auto-generated method stubinit(gl);}@Overridepublic void onSurfaceChanged(GL10 gl, int w, int h) {// TODO Auto-generated method stubgl.glViewport(0, 0, w, h); //設定視窗gl.glMatrixMode(GL10.GL_PROJECTION); // 設定投影矩陣gl.glLoadIdentity();  //設定矩陣為單位矩陣,相當於重設矩陣GLU.gluPerspective(gl, 45.0f, ((float) w) / h, 0.1f, 10f);//設定透視範圍}@Overridepublic void onDrawFrame(GL10 gl) {// TODO Auto-generated method stubgl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);// 清除螢幕和深度緩衝gl.glMatrixMode(GL10.GL_MODELVIEW);   //切換至模型觀察矩陣gl.glLoadIdentity();// 重設當前的模型觀察矩陣GLU.gluLookAt(gl, 0, 0, 3, 0, 0, 0, 0, 1, 0);//設定視點和模型中心位置gl.glVertexPointer(3, GL10.GL_FLOAT, 0, cubeBuff);//設定頂點資料gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);gl.glRotatef(xrot, 1, 0, 0);  //繞著(0,0,0)與(1,0,0)即x軸旋轉gl.glRotatef(yrot, 0, 1, 0);gl.glColor4f(1.0f, 0, 0, 1.0f);   //設定顏色,紅色gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);  //繪製正方型FRONT面gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 4, 4);gl.glColor4f(0, 1.0f, 0, 1.0f);gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 8, 4);gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 12, 4);gl.glColor4f(0, 0, 1.0f, 1.0f);gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 16, 4);gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 20, 4);xrot += 1.0f;yrot += 0.5f;}}

源碼工程,:http://download.csdn.net/source/3566635











聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.