0

編集:したがって、glOrthoは私がやろうとしていたこと(表示したい領域を設定する)を行っているようです.エラーは私のコードにありました. ただし、これは一般的な初心者のエラーである可能性があるため、誰かがまだこれが役立つと思うかもしれません

私は glOrtho を使用しています (正投影よりも正射投影を設定する方が簡単だと思います)。とにかく、500x500x500 の領域 (すべての可視領域) に小さな立方体 (1x1x1) を描画しています。OpenGL (openGL 2 を使用) に、領域 (500,500,500) 内にあるすべてのものを画面に描画するように指示するにはどうすればよいですか?

これは私のコードです - Java ですが、同じように動作するはずです...

public void reshape(GLAutoDrawable gLDrawable, int x, int y, int width, int height) 
{
    final GL2 gl = gLDrawable.getGL().getGL2();

    if (height <= 0) // avoid a divide by zero error!
    {
        height = 1;
    }

    final float h = (float) width / (float) height;

    gl.glViewport(0, 0, width, height);
    gl.glMatrixMode(GL2.GL_PROJECTION);
    gl.glLoadIdentity();
    gl.glOrtho(0, 512, 0, 512, 0, 512);
    gl.glMatrixMode(GL2.GL_MODELVIEW);
    gl.glLoadIdentity();
}

これはうまくいかないようです。数百ではなく、数個の正方形しか見えません...

これが私の立方体描画コードです (すべての立方体のすべての座標は 0 から 500 の間です):

public void display(GLAutoDrawable gLDrawable) 
{
    final GL2 gl = gLDrawable.getGL().getGL2();
    gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
    gl.glLoadIdentity();

    for(InterestingVoxel iv: visibleList) {
        gl.glTranslatef(iv.getI(), iv.getJ(), iv.getK());
        System.out.println("x:"+iv.getI() + ", y:" + iv.getJ() + ", z:" + iv.getK());
        drawCube(gl);
    }


}

void drawCube(GL2 gl)
{
    gl.glBegin(GL2.GL_QUADS);

    // front
    gl.glVertex3f(0.5f, 0.5f, 0.5f);
    gl.glVertex3f(1.5f, 0.5f, 0.5f);
    gl.glVertex3f(1.5f, 1.5f, 0.5f);
    gl.glVertex3f(0.5f, 1.5f, 0.5f);
    // back
    gl.glVertex3f(0.5f, 0.5f, -0.5f);
    gl.glVertex3f(1.5f, 0.5f, -0.5f);
    gl.glVertex3f(1.5f, 1.5f, -0.5f);
    gl.glVertex3f(0.5f, 1.5f, -0.5f);
    // right
    gl.glVertex3f(1.5f, 0.5f, 0.5f);
    gl.glVertex3f(1.5f, 0.5f, -0.5f);
    gl.glVertex3f(1.5f, 1.5f, -0.5f);
    gl.glVertex3f(1.5f, 1.5f, 0.5f);
    // left
    gl.glVertex3f(0.5f, 0.5f, 0.5f);
    gl.glVertex3f(0.5f, 0.5f, -0.5f);
    gl.glVertex3f(0.5f, 1.5f, -0.5f);
    gl.glVertex3f(0.5f, 1.5f, 0.5f);
    // top
    gl.glVertex3f(0.5f, 1.5f, 0.5f);
    gl.glVertex3f(1.5f, 1.5f, 0.5f);
    gl.glVertex3f(1.5f, 1.5f, -0.5f);
    gl.glVertex3f(0.5f, 1.5f, -0.5f);
    // bottom
    gl.glVertex3f(0.5f, 0.5f, 0.5f);
    gl.glVertex3f(1.5f, 0.5f, 0.5f);
    gl.glVertex3f(1.5f, 0.5f, -0.5f);
    gl.glVertex3f(0.5f, 0.5f, -0.5f);

    gl.glEnd();
    gl.glFlush();
}
4

2 に答える 2

0

描画を特定の領域に制限する方法を尋ねていると思います。そうではなく、これがより一般的な「コードが機能しない」という質問である場合は、おそらくこの回答を無視できます。

GL 2.x を使用ClipPlaneしているため、描画を特定の領域にクリップするために使用することを検討することをお勧めします。したがって、あなたの場合、(GL に渡すデータに応じて) 3 ~ 6 個のクリップ プレーンを渡して有効にする必要があります (Enable(CLIP_PLANEi)iクリップ プレーンのインデックス/番号です)。

例(現在GL2テストベッドが機能していないため、疑似コード):

plane planes[] = {
    plane::from_triangle(
        500, 500, 500,
        500, 500, 0,
        500, 0, 500,
    ),
    plane::from_triangle(
        500, 500, 500,
        0, 500, 500,
        500, 0, 500,
    ),
    ...
}
// Assume the above is just a lot of GLdoubles somehow [e.g., POD types]

ClipPlane(6, planes)
for (unsigned plane_index = 0 to 5) {
    Enable(CLIP_PLANE0 + plane_index)
}

そうすることで、レンダリングを指定された平面の片側に限定することができます。ただし、これは推奨されていないことに注意してください (多くの GL 2.x と同様)。そのため、それを超える計画がある場合は、おそらくシェーダーでクリップ プレーンを再実装することをお勧めします。

または、何を描いているかを確認し、描画したい領域にある場合にのみ描画します。

于 2013-06-04T17:52:29.837 に答える