【问题标题】:switch from glOrtho to gluPerspective从 glOrtho 切换到 gluPerspective
【发布时间】:2012-11-07 14:46:54
【问题描述】:

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

我已经尝试使用清除深度缓冲区,但仍然不起作用。

【问题讨论】:

  • 有点离题,但您似乎正在使用固定功能管道。你最好切换到ShadersVertexBuffers 以获得更好的性能和更好的帮助(我不能在这里帮助你,因为我不再使用ffp了)。
  • 是切换问题,还是使用 Ortho 无法正确查看场景? (如果您使用正交而不是透视进行初始化,对象是否可见?)
  • 是的,如果我将其设置为 Ortho,一切都会正常显示。它的开关就是问题
  • 从正交变为透视很好,但反过来我无法让它工作
  • 您是否尝试在 GlOrtho 分支中添加 gluLookAt 语句?

标签: c opengl glut projection orthographic


【解决方案1】:

你的心理障碍就在这里:

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

    ...

}

【讨论】:

  • 这仍然无助于从透视到正射的变化。我可以将正交更改为透视很好,但我可以在透视时返回正交
  • @Knitex:请参阅我的答案更新,了解如何操作的粗略大纲。
  • 这让切换回正交工作,但由于某种原因,现在正交到透视不起作用
猜你喜欢
  • 2013-05-09
  • 2013-04-20
  • 2018-07-10
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
  • 2018-11-08
  • 2010-10-10
  • 2017-02-06
相关资源
最近更新 更多