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

时间:2017-06-22 22:26:23

标签: c++ opengl zoom perspective orthographic

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

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

我现在也认识到,在从正交视图切换到透视图后直接使用摄像机视图更改时,透视图中的模型只会丢失。如果我在更改透视后首先按放大/缩小然后使用相机视图更改一切正常

1 个答案:

答案 0 :(得分:0)

尝试使用更大范围的比例矩阵,

//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是否需要如此大的范围。尝试使用较小的数字。

也许将您的第一个问题作为单独的问题发布