OpenGL绘制旋转三角形实例

  在Android中我们使用GLSurfaceView来显示OpenGL视图,GLSurfaceView:是其中很重要的一个类,此类位于android.opengl包下,用于管理是一块可以是复合视图机器人系统的内存的特殊的曲面。管理一个使表面呈现 OpenGL 的 EGL 显示。接受一个用户提供输入Render对象进行显示。从 UI 线程实现一个专用线程渲染界面实现3D性能。所以这里我们先来构建一个自己的Renderer类,
[html]  view plain copy
  1. public class HelloOpenGLES10Renderer implements GLSurfaceView.Renderer {  
  2. }  

在HelloOpenGLES10Renderer类中必须实现Renderer接口的三个抽象方法:onDrawFrame,onSurfaceChanged,onSurfaceCreated

下面我们通过一个实例来演示下:

  首先我们需要创建一个GLSurfaceView

[html]  view plain copy
  1. class HelloOpenGLES10SurfaceView extends GLSurfaceView {   
  2.    public HelloOpenGLES10SurfaceView(Context context){  
  3.            super(context);  
  4.              
  5.            setRenderer(new HelloOpenGLES10Renderer());  
  6.   
  7.        }  

[html]  view plain copy
  1. @Override  
  2.    public void onCreate(Bundle savedInstanceState) {  
  3.        super.onCreate(savedInstanceState);  
  4.          
  5.        GLSurfaceView  view=new HelloOpenGLES10SurfaceView(this);  
  6.          
  7.        setContentView(view);  
  8.    }  

接下来是我们的核心类HelloOpenGLES10Renderer实现了Renderer接口:

[html]  view plain copy
  1. public class HelloOpenGLES10Renderer implements GLSurfaceView.Renderer {  
  2.   
  3.     float rotateTri, rotateQuad;  
  4.     private FloatBuffer triangleVB;  
  5.   
  6.     // 正方形的四个顶点  
  7.     private FloatBuffer quateBuffer;  
  8.   
  9.       /**   
  10.      * 将float数组转换存储在字节缓冲数组   
  11.      * @param arr   
  12.      * @return   
  13.      */    
  14.     private void initQuate() {  
  15.   
  16.         float[] four = { -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, -0.5f, 0.5f,  
  17.                 0.5f, 0.5f, 0.5f, 0.5f, };  
  18.   
  19.         ByteBuffer vbb = ByteBuffer.allocateDirect(  
  20.                 //分配缓冲空间,一个float占4个字节  
  21.                 four.length * 4);  
  22.         vbb.order(ByteOrder.nativeOrder());//设置字节顺序, 其中ByteOrder.nativeOrder()是获取本机字节顺序   
  23.         quateBuffer = vbb.asFloatBuffer();//转换为float型    
  24.         quateBuffer.put(four);  //添加数据    
  25.         quateBuffer.position(0);  //设置数组的起始位置    
  26.   
  27.     }  
  28.   
  29.     private void initShapes() {  
  30.   
  31.         float triangleCoords[] = {  
  32.                 // X, Y, Z  
  33.                 -0.5f, -0.25f, 0, 0.5f, -0.25f, 0, 0.0f, 0.559016994f, 0 };  
  34.   
  35.         ByteBuffer vbb = ByteBuffer.allocateDirect(  
  36.                 triangleCoords.length * 4);  
  37.         vbb.order(ByteOrder.nativeOrder());  
  38.         triangleVB = vbb.asFloatBuffer();  
  39.         triangleVB.put(triangleCoords);  
  40.         triangleVB.position(0);  
  41.   
  42.     }  
  43.   
  44.     public void onSurfaceCreated(GL10 gl, EGLConfig config) {  
  45.         // 设置背景色  
  46.         gl.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);  
  47.   
  48.         initShapes();  
  49.         initQuate();  
  50.   
  51.         gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);  
  52.   
  53.     }  
  54.   
  55.       //所有的绘图操作都在此方法中执行  
  56.     public void onDrawFrame(GL10 gl) {  
  57.           
  58.         //清楚屏幕和深度缓存  
  59.         gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);  
  60.         //切换至模型观察矩阵    
  61.         gl.glMatrixMode(GL10.GL_MODELVIEW);  
  62.         //重置当前的模型观察矩阵  
  63.         gl.glLoadIdentity();   
  64.         //确定视图点  
  65.         GLU.gluLookAt(gl, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f);  
  66.   
  67.           
  68.   
  69.   
  70.         //创建一个旋转三角形   沿Y轴旋转  
  71.         gl.glRotatef(rotateTri, 0.0f, 1.0f, 0.0f);  
  72.         // 画一个三角形  
  73.         //设置当前颜色  
  74.         gl.glColor4f(0.63671875f, 0.76953125f, 0.22265625f, 0.0f);  
  75.         gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangleVB);  
  76.         gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);  
  77.   
  78.         //沿X轴正方形移动1个单位  
  79.         gl.glTranslatef(1.0f, 0.0f, 0.0f);  
  80.   
  81.         // 创建一个旋转的正方形     沿X轴旋转  
  82.         gl.glRotatef(rotateQuad, 1.0f, 0.0f, 0.0f);  
  83.         // 画一个正方形  
  84.         gl.glColor4f(0.63671875f, 0.76953125f, 0.22265625f, 0.0f);  
  85.         gl.glVertexPointer(3, GL10.GL_FLOAT, 0, quateBuffer);  
  86.         gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);  
  87.   
  88.         // 改变旋转角度  
  89.         rotateTri += 0.5f;  
  90.         rotateQuad -0.5f;  
  91.     }  
  92.   
  93.     public void onSurfaceChanged(GL10 gl, int width, int height) {  
  94.           
  95.         //设置OpenGL的场景大小  
  96.         gl.glViewport(0, 0, width, height);  
  97.   
  98.         float ratio = (float) width / height;  
  99.         gl.glMatrixMode(GL10.GL_PROJECTION); //设置投影矩阵    
  100.         gl.glLoadIdentity(); //设置矩阵为单位矩阵,相当于重置矩阵           
  101.         gl.glFrustumf(-ratio, ratio, -1, 1, 3, 7); // 应用投影矩阵  
  102.                                                   
  103.     }  
  104.   
  105. }  

上面的方法基本上都做了注释,相信大家能够理解,

最后看一下运行效果吧!

OpenGL绘制旋转三角形实例_第1张图片


OpenGL绘制旋转三角形实例_第2张图片


http://blog.csdn.net/wangkuifeng0118/article/details/7424480

你可能感兴趣的:(OpenGL)