从 glOrtho 切换到 gluPerspective

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);
    }
}

我尝试使用清除深度缓冲区,但仍然无效。

有点跑题,但是看起来你正在使用固定功能管线。为了获得更好的性能和更好的帮助,你最好切换到“着色器”和“顶点缓冲区”(我无法在这里帮助你,因为我不再使用ffp)。 - Felix K.
切换是问题所在,还是你无法使用正交投影正确地看到场景?(如果你使用正交投影进行初始化而不是透视投影,物体是否可见?) - count0
是的,如果我将它设置为正交投影,一切都会正常显示。问题在于切换。 - Knitex
从正交投影切换到透视投影没问题,但反过来我无法使其工作。 - Knitex
你尝试在GlOrtho分支中添加gluLookAt语句了吗? - didierc
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绘图操作(以及设置变换状态)仅属于绘图代码。因此,您的"menu"函数根本没有意义。它是一个事件处理程序。事件处理程序处理输入,不生成输出。在事件处理程序中,您更改变量的值,然后标记要执行输出。

更新评论:

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();

    ...

}

这仍然无法帮助从透视到正交的转换。我可以很好地将正交改为透视,但在透视状态下返回正交则有困难。 - Knitex
1
@Knitex:请查看我的答案更新,了解如何大致实现它。 - datenwolf
这使得从正交视图切换回来的功能正常工作,但出于某种原因,现在从正交视图切换到透视视图不起作用。 - Knitex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接