c++ - 从透视到正交投影

标签 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);

我不明白我做错了什么。

最佳答案

在透视投影中,术语 (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);

关于c++ - 从透视到正交投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38261843/

相关文章:

C++关于连接两个字符串

c++ - 外壳指针(unit8_t 到 uint16_t)返回字节的反向表示

c++ - 在 OpenGL 中跟踪圆形鼠标移动

d3.js - DJ3S - 在正交投影中完成旋转时移除标线

c++ - C++错误链接器命令失败,退出代码为1(使用-v查看调用)

c++ - 将数组中的值与第一个和最后一个数字的算术平均值进行比较

opengl - 如何在X窗口中指定OpenGL版本?

opengl - 什么和为什么GLSL textureGrad

javascript - 拆分日期范围重叠成 block (javascript)

Java Spring 投影内部投影