3

私は(0,0)で車を引き、いくつかの障害物を設定していますが、現在の私の主な関心事はglPerspectiveからglOrthoに、またはその逆に切り替えることです。パースペクティブからオルソに切り替えたときに得られるのは、黒い画面だけです。

void myinit(){
    glClearColor(0.0,0.0,0.0,0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60,ww/wh,1,100);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(-5,5,3,backcarx,topcarx,0,0,0,1);
}

void menu(int id){
    /*menu selects if you want to view it in ortho or perspective*/
    if(id == 1){
        glClear(GL_DEPTH_BUFFER_BIT);
        glViewport(0,0,ww,wh);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-2,100,-2,100,-1,1);
        glMatrixMode(GL_MODELVIEW);
        glutPostRedisplay();
    }
    if(id == 2){
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(60,ww/wh,1,100);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        viewx = backcarx - 10;
        viewy = backcary - 10;
        gluLookAt(viewx,viewy,viewz,backcarx,topcarx,0,0,0,1);
    }
}

クリアデプスバッファを使用しようとしましたが、まだ機能しません。

4

1 に答える 1

2

あなたの精神的な障害はここにあります:

void myinit(){
    glClearColor(0.0,0.0,0.0,0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60,ww/wh,1,100);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(-5,5,3,backcarx,topcarx,0,0,0,1);
}

OpenGLが初期化されていません!はい、テクスチャのロードなど、たまにしか実行されない操作があります。しかし、一般的に、OpenGLは状態ベースの描画システムです。つまり、使用する直前にすべての描画関連のものを設定するということです。「myinit」関数のそのコードは、実際にはdisplay関数に属しています。そして、そこに配置したら、切り替えを行うのは簡単です。列挙変数を設定し、変数の値に応じて描画する前に正しい投影を設定します。

原則として、OpenGLの描画操作(および変換状態の設定はその操作のセットに属します)は、描画コードのみに属します。したがって、「メニュー」機能はまったく意味がありません。これはイベントハンドラーです。イベントハンドラーは入力を処理し、出力を生成しません。イベントハンドラーでは、変数の値を変更してから、出力を実行するようにフラグを立てます。


コメントによる更新:

typedef enum ProjectionType_t { Ortho, Perspective } ProjectionType;

ProjectionType projection;

void onMenu(int entry)
{
    swtich(entry) {
    case ...:
        projection = Ortho; break;
    case ...:
        projection = Perspective; break;
    }

    glutPostRedisplay();
}

void display(void)
{
    glClear(...);

    glViewport(...);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    switch(projection) {
    case Ortho:
        glOrtho(...); break;

    case Perspective:
        gluPerspective(...); break;
    }    

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    ...

}
于 2012-11-07T16:20:02.500 に答える