前言

前面已经讲了如何绘制点、线、面,现在就来绘制一个立方体,OpenGL ES中任何一个立体图形都是由很多面组成的,这个面指的就是三角形,所以绘制立方体就是绘制多个三角形而组合起来。

绘制

立方体有6个面,左、右、前、后、上、下。共有8个顶点,每个面有4个顶点,代码如下
PS:一定要注意顶点的顺序,不能随意选择

        // 定义立方体的8个顶点          float[] cubeVertices = {                               //左面                   -0.5f,0.5f,0.5f,                  -0.5f,-0.5f,0.5f,                  -0.5f,0.5f,-0.5f,                  -0.5f,-0.5f,-0.5f,                //右面                  0.5f, 0.5f,0.5f,                                  0.5f,-0.5f,0.5f,                  0.5f,-0.5f,-0.5f,                  0.5f,0.5f,-0.5f ,                //前面                 -0.5f,0.5f,0.5f,                 -0.5f,-0.5f,0.5f,                  0.5f,-0.5f,0.5f,                  0.5f, 0.5f,0.5f,                //后面                   0.5f,-0.5f,-0.5f,                  0.5f,0.5f,-0.5f,                  -0.5f,0.5f,-0.5f,                 -0.5f,-0.5f,-0.5f,                //上面                 -0.5f,0.5f,0.5f,                  0.5f, 0.5f,0.5f,                  0.5f,0.5f,-0.5f,                  -0.5f,0.5f,-0.5f,                //下面                  -0.5f,-0.5f,0.5f,                  0.5f,-0.5f,0.5f,                  0.5f,-0.5f,-0.5f,                  -0.5f,-0.5f,-0.5f         };  

然后定义一个颜色数组

       //  颜色数组        float []  cubeColors = {                   1f,0f,0f,1f ,                  0f,1f,0f,1f,                  0f,0f,1f,1f,                  1f,0f,0f,1f,                  1f,0f,0f,1f ,                  0f,1f,0f,1f,                  0f,0f,1f,1f,                  1f,0f,0f,1f,                 1f,0f,0f,1f ,                  0f,1f,0f,1f,                  0f,0f,1f,1f,                  1f,0f,0f,1f,                 1f,0f,0f,1f ,                  0f,1f,0f,1f,                  0f,0f,1f,1f,                  1f,0f,0f,1f,                 1f,0f,0f,1f ,                  0f,1f,0f,1f,                  0f,0f,1f,1f,                  1f,0f,0f,1f,                 1f,0f,0f,1f ,                  0f,1f,0f,1f,                  0f,0f,1f,1f,                  1f,0f,0f,1f,            };    

然后是获取浮点型缓冲数据

            //获取浮点形缓冲数据            VerticesBuffer = Utils.getFloatBuffer(cubeVertices);            //获取浮点型颜色数据            Colorbuffer= Utils.getFloatBuffer(cubeColors);

为了能看到立体的效果,就让这个矩阵一直绕Y轴旋转。因为默认的是一直绘制的渲染模式,所以指定一个角度,每次都加1即可。另外指定绘制线的模式为 GL_TRIANGLE_STRIP 。即相邻三个顶点绘制一个三角形。

代码如下


        @Override        public void onDrawFrame(GL10 gl) {         // 清除屏幕缓存和深度缓存              gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);              // 启用顶点座标数据              gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);              // 启用顶点颜色数据              gl.glEnableClientState(GL10.GL_COLOR_ARRAY);               // 重置当前的模型视图矩阵               gl.glLoadIdentity();               // 沿着Y轴旋转               gl.glRotatef(rotate, 0f, 1f, 0f);               // 设置顶点的位置数据              gl.glVertexPointer(3, GL10.GL_FLOAT, 0, VerticesBuffer);              // 设置顶点的颜色数据              gl.glColorPointer(4, GL10.GL_FLOAT, 0, Colorbuffer);              //绘制三角形              gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP  , 0, 24);             gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);              gl.glDisableClientState(GL10.GL_COLOR_ARRAY);              // 旋转角度增加1              rotate-=1;             }

效果如下:

可以看到有很多三角形,那么这并不是我们想要的效果,这时候要用到索引了。


索引绘制

索引就是让不同的顶点按照规定的顺序来绘制,这样就不会导致各种三角形的错乱。

首先定义一个索引数组,这里的0,1,2等指的是顶点顺序,比如0,1,2就是按照0,1,2的顺序绘制三角形,0,2,3就是按照02,3的顺序绘制三角形,就不会出现0,1,2 和1,2,3 以及 023都绘制的情况。

       //索引数组       private short[] indices={                  0,1,2,                  0,2,3,                  4,5,6,                  4,6,7,                  8,9,10,                  8,10,11,                  12,13,14,                  12,14,15,                  16,17,18,                  16,18,19,                  20,21,22,                  20,22,23,          };  

获取浮点型索引数据

//获取浮点型索引数据indexbuffer= Utils.getShortBuffer(indices);

最后在onDrawFrame方法里,把以下去掉

     //绘制三角形       //gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP  , 0, 24); 

换成

gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_SHORT, indexbuffer);  

这里讲一下glDrawElements方法,Android OpenGL ES学习笔记之绘制点
里讲了
OpenGL ES提供了两类方法来绘制一个空间几何图形:

 -public abstract void glDrawArrays(int mode, int first, int count) 使用VetexBuffer 来绘制,顶点的顺序由vertexBuffer中的顺序指定。 - public abstract void glDrawElements(int mode, int count, int type, Buffer indices) ,可以重新定义顶点的顺序,顶点的顺序由indices Buffer 指定。

glDrawElements各个参数如下:

 - mode——指明被渲染的是哪种图元,被允许的符号常量有GL_POINTS,GL_LINE_STRIP,GL_LINE_LOOP,GL_LINES,GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN 和GL_TRIANGLES - count——指明被渲染的元素个数。 - type——指明索引指的类型,不是GL_UNSIGNED_BYTE 就是GL_UNSIGNED_SHORT。 - indices——指明存储索引的位置指针。

现在看下效果

总结

绘制正方体就这样完成了。
Demo地址:点击打开
密码:arxc

更多相关文章

  1. Android圆形头像的绘制(三)之多人头像的实现
  2. Android(安卓)UI性能优化详解
  3. Android(安卓)九宫格解锁Demo--Android(安卓)进阶之路
  4. Android(安卓)View的绘制之 从源码了解measure的过程。
  5. Android(安卓)OpenGLES2.0(八)——纹理贴图之显示图片
  6. android中Bitmap导致的内存溢出
  7. Android(安卓)贝塞尔曲线实现QQ拖拽清除效果
  8. Android(安卓)仪表进度条 自定义View
  9. Android开发-----03-使用Canvas绘制虚线……

随机推荐

  1. 【Android游戏开发十四】深入Animation,
  2. android 自定义控件 自定义属性详细介绍
  3. android多线程模型和service分析
  4. android中图片的三级cache策略(内存、文件
  5. Android中的手势交互
  6. android 动画分析
  7. Android进程通信Binder(2)-Android系统服
  8. 关于Android的问号(?)和 @符号的用法
  9. Android上定义播放器控件UniversalVideoV
  10. Android源码分析系列-整理篇