我已经在Opengl中实现了以下代码以对模型进行放大和缩小。不幸的是,它在正交投影中没有显示出预期的效果。当我单击“ +”或“-”并从透视图切换到正交时,当我放大和缩小时,它仅显示一步。当我从正交切换到透视时,它会放大和缩小,当单击“ +”时,它会放大和缩小,并且键“-”根本不起作用。
有人可以帮忙吗?提前致谢。
glm::mat4 view = glm::lookAt(glm::vec3(4, 4, -3), glm::vec3(0, 1, 0), glm::vec3(0, 1, 0));
glm::mat4 projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.2f, 1000.0f);
float zoom = 0.5236f;
case 'w':
if (!(perspective)){
projection = glm::perspective(zoom, 1.0f, 0.1f, 1000.0f);
perspective = true;
}
break;
case 's':
if (perspective){
projection = glm::ortho(-1.0f, 1.0f, -1.0f, 1.0f, -1000.0f, 1000.0f);
perspective = false;
}
break;
case '+':
if (zoom >= 0.0236){
if (perspective){
//step of zooming
zoom = zoom - 0.5;
zoom -= 0.1f;
projection = glm::perspective(zoom, 1.0f, 0.1f, 1000.0f);
}
else{
//step of zooming
zoom = zoom - 500;
zoom -= 0.1f;
projection = glm::ortho(-0.1 - zoom, 0.1 + zoom, -0.1 - zoom, 0.1 + zoom, -1000.0, 1000.0);
}
}
break;
case '-':
if (zoom <= 3.0236f){
if (perspective){
// step of zooming
zoom = zoom + 0.5;
zoom += 0.1f;
projection = glm::perspective(zoom, 1.0f, 0.1f, 1000.0f);
}
else{
//step of zooming
zoom = zoom + 500;
zoom += 0.1f;
projection = glm::ortho(-0.1 - zoom, 0.1 + zoom, -0.1 - zoom, 0.1 + zoom, -1000.0, 1000.0);
}
}
break;
}
最佳答案
不幸的是,它在正交投影中没有显示出预期的效果。当我单击“ +”或“-”并从透视图切换到正交时,当我放大和缩小时,它仅显示一步
那是因为在你的case 's'
case 's':
if (perspective){
projection = glm::ortho(-1.0f, 1.0f, -1.0f, 1.0f, -1000.0f, 1000.0f);
perspective = false;
}
break;
您没有将缩放系数限制在此开关上。仅在按“ +”或“-”时出现:
projection = glm::ortho(-0.1 - zoom, 0.1 + zoom, -0.1 - zoom, 0.1 + zoom, -1000.0, 1000.0);
当我从正交切换到透视时,它会放大和缩小,当单击“ +”时,它会放大和缩小,并且键“-”根本不起作用。
让我们说您处于正交视图,并且
zoom = 0.5236f;
。您按“-”键。按照您的程序,一旦缩放小于3.0236f,您将获得if语句。因此,您的缩放变为zoom = 0.5236f + 500 = 500.5236
在那之后,我不知道为什么,您添加0.1,所以
zoom = 500.6236f
。然后,您切换回透视投影。现在,每次按“ +”时,一旦缩放> 0.0236,它就会减少0.6f。但是,当您按“-”时,您的缩放比例约为500,这比3.0236f太大。因此,您将无法进入if语句。
如您所见,您的逻辑是错误的。您需要改进它。不好意思说