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

5

我希望绘制一个10x10的网格,用来定义地面平面,使其中心为世界坐标的原点。 以下是每个网格线的代码。

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个回答

3
原因是因为您只绘制了一条线。glDrawArrays基本上从给定的数据中绘制opengl图元。因此,您缓冲区mVerticesBuffer中的坐标仅由glDrawArrays绘制一次。
实现您想要的简单方法是:
- 旋转/平移到起始位置 - 使用glDrawArrays()绘制第一条线; - 使用gl.glTranslatef(somenumber, 0, 0); - 再次使用相同的glDrawArrays()调用进行绘制; - 使用gl.glRotatef(90, 0, 1, 0)围绕y轴旋转(或任何其他轴); - (可能在轴上平移回到相同的起始位置) - 再次执行第2、3和4个步骤。
使用推入和弹出矩阵的方式更加整洁和高效,但如果您是OpenGL新手,则使用此方法应该可以工作。

1
好的,我会在测试后回复。 - ace
我更新了我的问题并添加了更多的代码以使它更清晰。我已经按照你的建议尝试过了,但是还不起作用。 - ace
1
哦,Line类从哪里来的?“lines”列表是否在某个地方转换为mVerticesBuffer? - Infiniti Fizz
是的,该行代码将float[]转换为mVerticesBuffer(Base类的实例变量)。这个转换代码可以正常工作,因为我用它来绘制更复杂的网格。我可以绘制多个立方体、球体等等,但我无法绘制线条。 - ace

2

给你的解决方案看起来不错,应该可以解决你的问题。 也许最好的解决方案是生成顶点并将其存储在文件中,您可以一次读取该文件并一次性呈现网格,这在性能和速度方面会更好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接