从透视到正投影

时间:2016-07-08 08:08:24

标签: c++ opengl projection glm-math

我正在尝试将相机投影从透视更改为正交投影。 目前,我的代码与透视投影一起正常工作

m_prespective = glm::perspective(70.0f, (float)DISPLAY_WIDTH / (float)DISPLAY_HEIGHT, 0.01f, 1000.0f);
m_position = glm::vec3(mesh.centre.x, mesh.centre.y, -mesh.radius);
m_forward = centre;
m_up = glm::vec3(0.0f, 1.0f, 0.0f);
return m_prespective * glm::lookAt(m_position, m_forward, m_up);

但是一旦我将其改为正交投影,我就再也看不到我的网格了。

m_ortho = glm::ortho(0.0f, (float)DISPLAY_WIDTH, (float)DISPLAY_HEIGHT,5.0f, 0.01f, 1000.0f);
m_position = glm::vec3(mesh.centre.x, mesh.centre.y, -mesh.radius);
m_forward = centre;
m_up = glm::vec3(0.0f, 1.0f, 0.0f);
return m_ortho * glm::lookAt(m_position, m_forward, m_up);

我不明白我做错了什么。

1 个答案:

答案 0 :(得分:2)

在透视投影中,术语(float)DISPLAY_WIDTH / (float)DISPLAY_HEIGHT正在评估图像宽高比。此数字将接近1.透视投影的近平面处的左右剪裁平面距离为aspect * near_distance。更有趣的是在观看距离处左右扩展,在你的情况下是abs(m_position.z)= abs(mesh.radius)

将其转换为正交投影,左,右,顶部和底部剪裁平面距离应该具有相同的数量级,因此,如果该方面接近1,则左,右,底部和顶部的值应该接近到abs(mesh.radius)的值。除了宽高比之外,以像素为单位的显示分辨率完全不相关。

此外,在使用透视投影时,应尽可能选择near的值,以便可以看到所有需要的几何体。否则会浪费宝贵的深度缓冲区分辨率。

float const view_distance = mesh.radius + 1;

float const aspect = (float)DISPLAY_WIDTH / (float)DISPLAY_HEIGHT;
switch( typeof_projection ){
case perspective:
    m_projection = glm::perspective(70.0f, aspect, 1.f, 1000.0f);
    break;

case ortho:
    m_projection = glm::ortho(
        -aspect * view_distance,
         aspect * view_distance,
        view_distance,
        view_distance,
        -1000, 1000 );
    break;
}

m_position = glm::vec3(mesh.centre.x, mesh.centre.y, -view_distance);
m_forward = centre;
m_up = glm::vec3(0.0f, 1.0f, 0.0f);

return m_projection * glm::lookAt(m_position, m_forward, m_up);