0

Tao Frameworkを使用していますが、使用 glLoadIdentity()に問題があります。画像をgluDisk正常にgluLookAtロードしています。画像が表示されます。ロードした画像でカメラの位置を変更しようとするgluDiskと、代わりに、私が見るのは、ロードした画像の背景色を思い出させる色だけです。デバッグを使用した後、glLoadIdentity()関数が原因で発生することがわかりました。

ディスクを再描画する関数は次のとおりです。

Gl.glClearColor(0F, 0F, 0F, 1.0F);

while (true)
{
    world.drawWorld();
    Application.DoEvents();
    Thread.Sleep(20);
}

これがlookatを変更するための私のコードです:

Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
Gl.glMatrixMode(Gl.GL_MODELVIEW); //Switch to the drawing perspective
Gl.glLoadIdentity(); 
switch (Convert.ToInt32(e.KeyChar))
{
    //down arrow
    case 76:
        rotAngle -= 0.5f;
        rotY -= 0.1f;
        //rotX = 0;
        break;
    //up arrow
    case 82:
        rotAngle += 0.5f;
        rotY += 0.1f;
        //rotX = 0;
        break;
    // left arrow
    case 85:
        rotAngle -= 0.5f;
        //rotY = 0;
        rotX -= 0.1f;
        break;
    //right arrow
    case 68:
        rotAngle += 0.5f;
        //rotY = 0;
        rotX += 0.1f;
        break;

    case 'a':
        xMove -= 1;
        Glu.gluLookAt(xMove, yMove, zMove, xMove + 2, yMove + 2, zMove + 2, 0, 1, 0);
        break;

    case 'd':
        xMove += 1;
        Glu.gluLookAt(xMove, yMove, zMove, xMove + 2, yMove + 2, zMove + 2, 0, 1, 0);
        break;

    case 'w':
        yMove +=1;
        Glu.gluLookAt(xMove, yMove, zMove, xMove + 2, yMove + 2, zMove + 2, 0, 1, 0);
        break;

    case 's':
        yMove -= 1;
        Glu.gluLookAt(xMove, yMove, zMove, xMove + 2, yMove + 2, zMove + 2, 0, 1, 0);
        break;

    case 'z':

        zMove += 1F;
        Glu.gluLookAt(xMove, yMove, zMove, 0, 0, 0, 0, 1, 0);
        break;

    case 'x':
        zMove -= 1F;
        Glu.gluLookAt(xMove, yMove, zMove, 0, 0, 0, 0, 1, 0);
        break;

    case '0':
        //zMove -= 1F;
        Glu.gluLookAt(1, 1, 1, 0, 0, 0, 0, 1, 0);
        break;

これが私の描画コードです:

Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);

Gl.glEnable(Gl.GL_TEXTURE_2D);
LoadTexture();
Glu.GLUquadric qobj = Glu.gluNewQuadric();
Glu.gluQuadricTexture(qobj, Gl.GL_TRUE);
//Glut.glutSetCursor(Glut.GLUT_CURSOR_NONE);
Gl.glPushMatrix();
Gl.glRotatef(80f, 1.0f, 0.0f, 0.0f);
Glu.gluDisk (qobj,0, 800, 900, 300);
Gl.glPopMatrix();
4

1 に答える 1

0

OpenGL の状態変更関数をイベント ハンドラーに入れることは絶対に (!) しないでください。今、あなたはまさにこれを持っています。keypress ハンドラーでいくつかの変数を変更してから、再描画イベントを発行し、それを使用して描画関数でマトリックスを適切に設定します。

glLoadIdentity は、それが属していない場所で呼び出す場合にのみ、これを処理する必要があります。OpenGL は描画 API であり、シーン グラフではありません。

于 2013-01-01T18:58:00.680 に答える