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

ace*_*ace 5 android opengl-es

我想绘制 10 x 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);
Run Code Online (Sandbox Code Playgroud)

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

这是定义行的代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

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

Inf*_*izz 3

原因是因为你只画了一条线。glDrawArrays 基本上从给定的数据中绘制 opengl 图元。因此缓冲区 mVerticesBuffer 中的坐标由 glDrawArrays 绘制一次。

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

  • 旋转/平移到起始位置
  • 使用 glDrawArrays() 绘制第一条线;
  • 使用 gl.glTranslatef(somenumber, 0, 0);
  • 使用对 glDrawArrays() 的相同调用再次绘制;
  • 使用 gl.glRotatef(90, 0, 1, 0); 绕 y 轴旋转(或者以 0 所在的轴为中心)
  • (也许沿轴平移以到达相同的起始位置)
  • 再次执行第二、第三和第四点。

一种更整洁、更有效的方法是使用推入和弹出矩阵,但为了简单起见,如果您是 opengl 的新手,这应该可行。