gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:59:49 25 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

关于c++ - OpenGL 在正射和透视问题之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44710262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com