当前位置: 首页 > 编程笔记 >

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

卫松
2023-03-14
本文向大家介绍Android基于OpenGL在GLSurfaceView上绘制三角形及使用投影和相机视图方法示例,包括了Android基于OpenGL在GLSurfaceView上绘制三角形及使用投影和相机视图方法示例的使用技巧和注意事项,需要的朋友参考一下

本文实例讲述了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程序设计有所帮助。

 类似资料:
  • 我是最新版本的OpenGL的新手,我试图通过以下教程来学习它:http://open.gl/drawing 然而,我正在使用LWJGL的最新版本,并尽最大努力将其OpenGL与教程一样使用。然而,应该绘制的白色三角形却不是。 这是我的代码: 我的着色器与本教程的着色器相同,但无论如何都会为了便于阅读而发布它们: 。蓄意杀伤 .vert 代码运行,但都是黑色的。有什么想法吗?

  • 有很多关于3D的opengl投影矩阵的很棒的教程,但我不是在做3D。我真的很难根据自己的喜好进行正交投影设置。 int宽=320;int高=480; 我使用这些设置创建了一个视图投影矩阵。 创建此视图和投影矩阵并将它们传递给gpu之后。 然后我创建一个从的四边形,以便它的原点位于中心。 然后我为四边形制作一个比例矩阵,这样我就可以在屏幕上看到它了。它呈现为一个完美的正方形,但当然glViewpor

  • 针对不同应用的三维场景需要使用不同的投影方式,比如机械、工业设计领域常常采用正投影(平行投影), 大型游戏场景往往采用透视投影(中心投影)。为了完成三维场景不同的投影方式,three.js封装WebGL API和相关算法,提供了正投影相机OrthographicCamera和透视投影相机PerspectiveCamera。 正投影和透视投影简单解释 下面对正投影相机和透视投影相机的投影算法进行简单

  • 我必须在正方形上画一个三角形,带星号,预期输出如下图所示。 指令是这样的:编写一个C程序,从用户那里读取一个数字n,并允许使用“*”字符打印一个带有屋顶的房子。房子应该是一个n×n正方形和屋顶两条45度的对角线形成屋顶(如果n是奇数,屋顶在顶部完美地关闭)。我创建了一个三角形和正方形,但我不能把它们结合起来。三角形

  • 我是OpenGL编程的完全初学者,正在努力学习learnopengl的突破教程。但是他想把球画成一个实际的圆,而不是像乔伊建议的那样使用纹理四维。然而,谷歌为“画圈opengl 3.3”或类似短语向我抛出的每一个结果似乎都至少有几年历史了,并且使用的API版本甚至比那个版本还要旧:-( 我发现的最接近的事情是这个SO问题,但是当然OP只需要使用一个自定义的对象来抽象一些细节,而没有分享他/她的实现

  • 问题内容: 我正在学习有关使用OpenGL在Java中创建游戏引擎的教程。 我正在尝试在屏幕上渲染一个三角形。一切运行正常,我可以更改背景颜色,但三角形不会显示。我也尝试过运行作为教程系列的一部分提供的代码,但仍然无法正常工作。 链接至教程:http : //bit.ly/1EUnvz4 链接到视频中使用的代码:http : //bit.ly/1z7XUlE 建立 我试过检查OpenGL版本,但相