2

我试图像时尚一样在网格中制作一组点,但一个点只出现在中间:我

private Point[][] sq = new Point[10][10];

@Override
public void onDrawFrame(GL10 gl) {



    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

    gl.glLoadIdentity();

    for(int x = 0; x< 10 ; x++){
        for(int y = 0; y< 10 ; y++){
            sq[x][y] = new Point(x/10,y/10);
            gl.glTranslatef(0.0f, x/10,-5.0f);
             sq[x][y].draw(gl, 0, 1, 0);
        }
    }
4

2 回答 2

2

假设 openGL ES 与标准 openGL 相同,您每次转换时都需要推送和弹出矩阵。否则,您将第一次翻译 0,然后翻译 0.1,然后翻译 0.3,然后翻译 0.6,等等......

但我假设您想翻译 0、0.1、0.2、0.3、0.4 等...

我也不确定为什么你只用 x 值沿 y 轴平移?我认为这:

gl.glTranslatef(0.0f, x/10,-5.0f);

应该是这样的:

gl.glTranslatef(x/10.0f, y/10.0f, -5.0f);

我想你想要这样的东西:

for(int x = 0; x< 10 ; x++){
    for(int y = 0; y< 10 ; y++){

        sq[x][y] = new Point(x/10.0f, y/10.0f);

        gl.glPushMatrix();
        gl.glTranslatef(x/10.0f, y/10.0f, -5.0f);
        sq[x][y].draw(gl, 0, 1, 0);
        gl.glPopMatrix();
    }
}
于 2013-02-19T04:39:19.763 回答
0

您可以gl.glVertex2f用来绘制顶点,并将坐标存储在数组中:

float [] coords = new float[200];
for (int x = 0; x < 10; x++) {
    for (y = 0; y < 10; y++) {
        coords[(x * 10 + y) * 2] = (float)x/10.0f;
        coords[(x * 10 + y) * 2 + 1] = (float)y/10.0f;
    }
}

for (int i = 0; i < 100; i++)
    gl.glVertex2f(coords[i * 2], coords[i * 2 + 1]);

如果要绘制规则网格,给定具有绝对坐标的顶点,则不需要使用gl.glTranslate.

最后,您可以避免每次进行渲染时都重新构建点数组:只需构建一次数组 - 比如说现在在构造函数中,并且只在数组上循环以在onDrawFrame方法中进行绘制。我不知道你以后的计划是什么,但如果数组大小没有改变,即使你需要移动点,你也会通过始终使用相同的方式获得一些性能。

作为练习,我建议创建一个类来包装坐标数组并在数组上提供一些简单的操作。这可以很好地介绍 OpenGL 支持的顶点数组和缓冲区功能。

于 2013-02-19T06:10:31.880 回答