OpenGL 在正射和透视问题之间切换

OpenGL switching between ortho and perspecive problems

我已经将模型集成到 OpenGL 中并实现了一些键盘功能,例如在正交视图和透视视图之间切换。您也可以放大和缩小并更改相机视图。现在我认识到的是在切换到正交模型然后回到透视模型后,模型出现了很多问题。第一个:如果我现在在透视视图中更改水平相机视图,模型会在一段时间后丢失(在经常按下相机视图键之后)。第二个问题是我无法在正交视图中真正放大和缩小。我试图缩放我的模型,因为我认为它可能太大了,但这没有帮助。而且我不知道为什么 orthografic 函数会在透视图中产生这个问题,因为在透视图中,即使不按 ortho 键,一切都可以正常工作。

//change to perspective
case 'p':
    if (!(perspective)) {
        projection = glm::perspective(zoom, 1.0f, 0.1f, 100.0f);
        perspective = true;
    }
    break;

//change to ortho
case 'o':
    if (perspective) {
        projection = glm::ortho(-100.0f, 100.0f, -100.0f, 100.0f, -1000.0f, 1000.0f);
        perspective = false;
    }
    break;

// zoom out 
case '-':
    if (zoom <= 3.0236f) {
        zoom += 0.1f;
        if (perspective) { 
            projection = glm::perspective(zoom, 1.0f, 0.1f, 1000.0f);
        }
        else {
            projection = glm::ortho(-0.1f - zoom, 0.1f + zoom, -0.1f - zoom, 0.1f + zoom, -10000.0f, 10000.0f);
        }
    }
    break;

放大后前缀相同

希望有人能帮忙谢谢

如果您需要更多详细信息或更多代码,请告诉我

编辑: 对于第一个问题,我在显示函数中清除深度缓冲区的代码

void display()
{
       ... defined camera settings code here ....


    glClear(GL_DEPTH_BUFFER_BIT);
    glClearBufferfv(GL_COLOR, 0, color);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, texture);

    // set shader param and calculate matrices
    modelView = view * modelView * model; 
    ...
    glDrawArrays(GL_TRIANGLES, 0, obj.vertices.size());

    glutSwapBuffers(); 
}

现在我也认识到了,只有在从正视图切换到透视视图后直接使用相机视图变化时,透视视图中的模型才会丢失。如果我在更改为透视后先按缩放 in/out,然后使用相机视图进行更改,一切正常

尝试为您的正交矩阵使用更大范围的比例,

//change to ortho
case 'o':
    if (perspective) { 
        float min = -pow(10, zoom);
        float max = pow(10, zoom);
        projection = glm::ortho(min, max, min, max, -1000.0f, 1000.0f);
        perspective = false;
    }
    break;

放大/缩小时使用相同的代码,或者更好的是,将其分解到子例程中。此外,请考虑您是否需要 zNear 和 zFar 的如此大的范围。尝试使用较小的数字。

也许post你的第一个问题作为一个单独的问题