我已将模型集成到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();
}
我现在也认识到,在从正交视图切换到透视图后直接使用摄像机视图更改时,透视图中的模型只会丢失。如果我在更改透视后首先按放大/缩小然后使用相机视图更改一切正常
答案 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是否需要如此大的范围。尝试使用较小的数字。
也许将您的第一个问题作为单独的问题发布