当前位置:操作系统 > 安卓/Android >>

基于Android的OpenGL—在GLSurfaceView上绘制三角形和使用投影和相机视图

定义三角形

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

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

 

绘制三角形

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


实验步骤:

1.      添加新的类Triangle

代码如下:

[java] <span style="font-size:16px;">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; 

</span> 
<span style="font-size:16px;">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;
}
</span>

 


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

代码如下:

 

[java] <span style="font-size:16px;">public myGLRenderer() 
    { 
        mTriangle = new Triangle(); 
    } 
</span> 
<span style="font-size:16px;">public myGLRenderer()
 {
  mTriangle = new Triangle();
 }
</span>

 


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

代码如下:

 

[java] <span style="font-size:16px;">@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); 
    } 
</span> 
<span style="font-size:16px;">@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);
 }
</span>

 


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

代码如下:

 

[java] <span style="font-size:16px;">@Override 
 &nb

补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,