Android基于OpenGL在GLSurfaceView上绘制三角形及使用投影和相机视图方法示例

所属分类: 软件编程 / Android 阅读数: 45
收藏 0 赞 0 分享

本文实例讲述了Android基于OpenGL在GLSurfaceView上绘制三角形及使用投影和相机视图方法。分享给大家供大家参考,具体如下:

定义三角形

OpenGL 允许我们使用三维坐标来定义物体。在绘制三角形前,我们需要定义它各个点的坐标。我们一般使用数组来存储各个顶点的坐标。

OpenGL ES 默认 [0,0,0] (X,Y,Z) 在GLSurfaceView的中心,[1,1,0]在右上角,[-1,-1,0]在左下角。

绘制三角形

在绘制三角形之前,我们必须告诉OpenGL我们正在使用顶点数组。然后我们才使用绘制函数画出三角形。

实验步骤:

1. 添加新的类Triangle

代码如下:

public class Triangle {
  public Triangle()
  {
     float triangleCoords[] = {
          // X, Y, Z 这是一个等边三角形
          -0.5f, -0.25f, 0,
           0.5f, -0.25f, 0,
           0.0f, 0.559016994f, 0
        };
        // 初始化三角形的顶点缓存
        ByteBuffer vbb = ByteBuffer.allocateDirect(
            // (# of coordinate values * 4 bytes per float)
            triangleCoords.length * 4);
        vbb.order(ByteOrder.nativeOrder());// 使用设备硬件本身的字节序
        triangleVB = vbb.asFloatBuffer(); // 从ByteBuffer中创建一个浮点缓存
        triangleVB.put(triangleCoords); // 向浮点缓存中添加顶点坐标
        triangleVB.position(0); // 使缓存读第一个坐标
  }
  public void draw(GL10 gl)
  {
    gl.glColor4f(0.63671875f, 0.76953125f, 0.22265625f, 0.0f); //设置当前颜色
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangleVB);//设置顶点
    gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);//绘制三角形
  }
  private FloatBuffer triangleVB;
}

2. 在myGLRenderer类中添加成员privateTriangle mTriangle并在构造函数中初始化。

代码如下:

public myGLRenderer()
{
    mTriangle = new Triangle();
}

3. 在myGLRenderer类的onSurfaceCreated()函数最后添加glEnableClientState()方法来启用顶点数组。

代码如下:

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    // TODO Auto-generated method stub
    gl.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
}

4. 在myGLRenderer类的onDrawFrame()函数最后添加三角形绘制方法。

代码如下:

@Override
public void onDrawFrame(GL10 gl) {
    // TODO Auto-generated method stub
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    mTriangle.draw(gl);
}

这样,我们便完成了一个平面三角形的绘制。但我们发现这个三角形并不像我们定义的那样是一个等边三角形,这是由于OpenGL总假设我们的屏幕是一个正方形,这样在绘制的时候最终图形会随着屏幕长宽比例的不同而被拉伸。为了得到正确的显示,我们需要将图形投影到正确的位置。这一功能我们在下一节进行实现。

Android设备屏幕通常不是正方形的,而OpenGL总是默认地将正方形坐标系投影到这一设备上,这就导致图形无法按真实比例显示。要解决这一问题,我们可以使用OpenGL 的投影模式和相机视图将图形的坐标进行转换以适应不同的设备显示。

实验步骤:

1. 修改myGLRenderer类的onSurfaceCreated()函数来启用GL10.GL_PROJECTION模式,计算屏幕的长宽比并使用这一比例来转换物体的坐标。

代码如下:

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
    // TODO Auto-generated method stub
    gl.glViewport(0, 0, width, height);
    float ratio = (float) width / height;
    gl.glMatrixMode(GL10.GL_PROJECTION); // 设置当前矩阵为投影矩阵
    gl.glLoadIdentity(); // 重置矩阵为初始值
    gl.glFrustumf(-ratio, ratio, -1, 1, 3, 7); // 根据长宽比设置投影矩阵
}

2. 修改myGLRenderer的onDrawFrame()方法,启用MODELVIEW模式,并使用GLU.gluLookAt()来设置视点。

代码如下:

@Override
public void onDrawFrame(GL10 gl) {
  // TODO Auto-generated method stub
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    // 设置当前矩阵为模型视图模式
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();  // reset the matrix to its default state
    // 设置视点
    GLU.gluLookAt(gl, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
    mTriangle.draw(gl);
}

这样,我们绘制的图形比例就总是正确的,不再受设备的影响而被拉伸变形了。

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android图形与图像处理技巧总结》、《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结

希望本文所述对大家Android程序设计有所帮助。

更多精彩内容其他人还在看

Android网络编程之获取网络上的Json数据实例

这篇文章主要介绍了Android网络编程之获取网络上的Json数据实例,本文用完整的代码实例讲解了在Android中读取网络中Json数据的方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中的windowSoftInputMode属性详解

这篇文章主要介绍了Android中的windowSoftInputMode属性详解,本文对windowSoftInputMode的9个属性做了详细总结,需要的朋友可以参考下
收藏 0 赞 0 分享

Android网络编程之UDP通信模型实例

这篇文章主要介绍了Android网络编程之UDP通信模型实例,本文给出了服务端代码和客户端代码,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中使用ListView实现漂亮的表格效果

这篇文章主要介绍了Android中使用ListView实现漂亮的表格效果,本文用详细的代码实例创建了一个股票行情表格,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中刷新界面的二种方法

这篇文章主要介绍了Android中刷新界面的二种方法,本文使用Handler、postInvalidate两种方法实现界面刷新,需要的朋友可以参考下
收藏 0 赞 0 分享

Android SDK三种更新失败及其解决方法

这篇文章主要介绍了Android SDK三种更新失败及其解决方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(一)

Android3.0(API level 11)开始,Android设备不再需要专门的菜单键。随着这种变化,Android app应该取消对传统6项菜单的依赖。取而代之的是提供anction bar来提供基本的用户功能
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(二)

这次将继续上一篇文章没有讲完的Menu的学习,上下文菜单(Context menu)和弹出菜单(Popup menu)
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(三)

今天继续昨天没有讲完的Menu的学习,主要是Popup Menu的学习,需要的朋友可以参考下
收藏 0 赞 0 分享

Android显示网络图片实例

这篇文章主要介绍了Android显示网络图片的方法,以实例形式展示了Android程序显示网络图片的方法,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多