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你的第一个问题作为一个单独的问题
我已经将模型集成到 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你的第一个问题作为一个单独的问题