【问题标题】:Zoom out doesn´t work in orthographic projection缩小在正交投影中不起作用
【发布时间】:2017-06-26 20:35:47
【问题描述】:

我在 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;  
    }

【问题讨论】:

标签: c++ opengl zooming projection orthographic


【解决方案1】:

不幸的是,它在正交投影中没有按预期显示。当我点击“+”或“-”并从透视切换到正交时,当我放大和缩小时它只显示一步

那是因为在你的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 语句。

如您所见,您的逻辑是错误的。你需要改进它。很抱歉这么说

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 2013-01-22
    • 2015-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多