如何在OpenGL ES Android中绘制网格线?

时间:2011-03-05 23:41:13

标签: android opengl-es

我想绘制10×10网格,定义地平面,使得中心是世界坐标的原点。 这是为网格中定义的每一行调用的代码。

gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVerticesBuffer);

gl.glTranslatef(x, y, z);
gl.glRotatef(rz, 0, 0, 1);
gl.glRotatef(rx, 1, 0, 0);
gl.glRotatef(ry, 0, 1, 0);

gl.glDrawArrays(GL10.GL_LINES, 0, 2);

gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

问题是我只看到一条水平线。所以我觉得有些不对劲。

这是定义行的代码:

Line line;

for (int i = 0; i <= 10; i++) {
    // horizontal lines
    line =  new Line(-50, 0, 0, 50, 0, 0, 0, 0, 1, 1);  // blue line
    line.z = (i * 100) - 50;
    lines.add(line);

    // draw perspective lines
    line =  new Line(-50, 0, 0, 50, 0, 0, 0, 0, 1, 1);  // blue line
    line.x = (i * 100) - 50;
    line.ry = 90; 
    lines.add(line);
}

对于lines集合中的每一行,我在onDrawFrame中调用绘图代码。

2 个答案:

答案 0 :(得分:3)

原因是你只画了一行。 glDrawArrays基本上从给定的数据中提取opengl原语。因此缓冲区mVerticesBuffer中的坐标由glDrawArrays绘制一次。

做你想做的事的一个简单方法是:

  • 旋转/翻译到起始位置
  • 使用glDrawArrays();
  • 绘制第一行
  • 使用gl.glTranslatef(somenumber,0,0);
  • 再次使用glDrawArrays();
  • 调用
  • 使用gl.glRotatef(90,0,1,0);围绕y轴旋转(或者以0为中心的轴)
  • (也许在轴上转回以达到相同的起始位置)
  • 再次执行第2,第3和第4个要点。

更简洁,更有效的方法是使用推送和弹出矩阵,但为了简单起见,如果你是opengl的新手,这应该有效。

答案 1 :(得分:1)

给你的解决方案似乎很好,应该努力解决你的问题。 也许最好的解决方案是生成一次顶点并将其存储在一个文件中,您可以一次读取文件并一次渲染网格,这在性能和速度方面会更好。