2

グリッドのように点の配列を作成しようとしていますが、1つの点が真ん中に表示されます:I

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などで翻訳したいと思います...

また、なぜy軸に沿ってx値だけを変換しているのかわかりませんか?私はこれだと思います:

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

最後に、レンダリングを実行するたびにポイントの配列を再構築することを回避できます。配列を1回構築するだけです。たとえば、今のところコンストラクターで、onDrawFrameメソッドで描画するために配列をループするだけです。後でどのような計画になるかはわかりませんが、配列のサイズが変わらなければ、ポイントを移動する必要がある場合でも、常に同じものを使用することでパフォーマンスが向上します。

演習として、座標配列をラップし、配列に対していくつかの簡単な操作を提供するクラスを作成することをお勧めします。これは、OpenGLでサポートされている頂点配列とバッファ機能の良い入門書として役立つ可能性があります。

于 2013-02-19T06:10:31.880 に答える