从glOrtho切换到gluPerspective

时间:2012-11-07 14:46:55

标签: c opengl glut projection orthographic

我在(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);
    }
}

我尝试过使用清晰的深度缓冲区但仍无法正常工作。

1 个答案:

答案 0 :(得分: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”函数中的代码实际上属于显示功能。一旦你有了它,切换就变得微不足道了:根据变量的值设置一个枚举变量并在绘图之前设置正确的投影。

作为一般规则: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();

    ...

}