歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android 3D系列之入門實踐篇

Android 3D系列之入門實踐篇

日期:2017/3/1 11:18:08   编辑:Linux編程

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

本文源碼工程下載地址:

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

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

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

Copyright © Linux教程網 All Rights Reserved