Android OpenGL ES 开发教程(22):绘制一个球体

jerry OpenGL ES 2015年11月25日 收藏

OpenGL ES 只能通过绘制三角形来构造几何图形,比如前面绘制的20面体Android OpenGL ES 开发教程(12):绘制一个20面体,通过增加正多面体的边数,就可以构造出一个球体:

在项目中创建一个Sphere 类,它的Draw 方法,通过绘制三角形来构造球体,并且为其添加法线,法线主要用于光照效果,将在后面介绍。

  1. public void draw(GL10 gl) {
  2. float    theta, pai;
  3. float    co, si;
  4. float    r1, r2;
  5. float    h1, h2;
  6. float    step = 2.0f;
  7. float[][] v = new float[32][3];
  8. ByteBuffer vbb;
  9. FloatBuffer vBuf;
  10.  
  11. vbb = ByteBuffer.allocateDirect(v.length * v[0].length * 4);
  12. vbb.order(ByteOrder.nativeOrder());
  13. vBuf = vbb.asFloatBuffer();
  14.  
  15. gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
  16. gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);
  17.  
  18. for (pai = -90.0f; pai < 90.0f; pai += step) {
  19. int    n = 0;
  20.  
  21. r1 = (float)Math.cos(pai * Math.PI / 180.0);
  22. r2 = (float)Math.cos((pai + step) * Math.PI / 180.0);
  23. h1 = (float)Math.sin(pai * Math.PI / 180.0);
  24. h2 = (float)Math.sin((pai + step) * Math.PI / 180.0);
  25.  
  26. for (theta = 0.0f; theta <= 360.0f; theta += step) {
  27. co = (float)Math.cos(theta * Math.PI / 180.0);
  28. si = -(float)Math.sin(theta * Math.PI / 180.0);
  29.  
  30. v[n][0] = (r2 * co);
  31. v[n][1] = (h2);
  32. v[n][2] = (r2 * si);
  33. v[n + 1][0] = (r1 * co);
  34. v[n + 1][1] = (h1);
  35. v[n + 1][2] = (r1 * si);
  36.  
  37. vBuf.put(v[n]);
  38. vBuf.put(v[n + 1]);
  39.  
  40. n += 2;
  41.  
  42. if(n>31){
  43. vBuf.position(0);
  44.  
  45. gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vBuf);
  46. gl.glNormalPointer(GL10.GL_FLOAT, 0, vBuf);
  47. gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, n);
  48.  
  49. n = 0;
  50. theta -= step;
  51. }
  52.  
  53. }
  54. vBuf.position(0);
  55.  
  56. gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vBuf);
  57. gl.glNormalPointer(GL10.GL_FLOAT, 0, vBuf);
  58. gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, n);
  59. }
  60.  
  61. gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
  62. gl.glDisableClientState(GL10.GL_NORMAL_ARRAY);
  63. }

有了Sphere 类, 创建一个DrawSphere Activity来绘制球体,为了能看出3D效果,给场景中添加光源(后面介绍)

  1. public void DrawScene(GL10 gl) {
  2. super.DrawScene(gl);
  3. initScene(gl);
  4. sphere.draw(gl);
  5. }

下载