加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

OpenGl绘制旋转三角形实例

(2012-05-17 14:52:54)
标签:

杂谈

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

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

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

  首先我们需要创建一个GLSurfaceView

  1. class HelloOpenGLES10SurfaceView extends GLSurfaceView   
  2.    public HelloOpenGLES10SurfaceView(Context context){  
  3.            super(context);  
  4.              
  5.            setRenderer(new HelloOpenGLES10Renderer());  
  6.   
  7.         

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

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

最后看一下运行效果吧!

http://my.csdn.net/uploads/201204/03/1333462465_8339.jpg


http://my.csdn.net/uploads/201204/03/1333462481_1773.jpg

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

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有