使用OpenGL Android的点数组

时间:2013-02-19 04:22:19

标签: java android opengl-es multidimensional-array point

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

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);
        }
    }

2 个答案:

答案 0 :(得分:2)

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

但我认为你想翻译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();
    }
}

答案 1 :(得分: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支持的顶点数组和缓冲区功能的良好介绍。