澄清glFrustum,以及为什么我无法看到图像

时间:2014-09-30 04:01:23

标签: c++ opengl graphics dimension

目前我的glFrustum设置为

glFrustum(0, 100.0, 0, 100.0, -50, 50);

我的图像是一个矩形立方体,尺寸为: 当形状的尺寸小于观察盒时,为什么我看不到图像?

//top
    glBegin(GL_POLYGON);
        glVertex3f(25, 60, 25);
        glVertex3f(75, 60, 25);
        glVertex3f(75, 60, -25);
        glVertex3f(25, 60, -25);
    glEnd();

    //bottom
    glBegin(GL_POLYGON);
        glVertex3f(25, 55, 25);
        glVertex3f(75, 55, 25);
        glVertex3f(75, 55, -25);
        glVertex3f(25, 55, -25);
    glEnd();

    //front
    glBegin(GL_POLYGON);
        glVertex3f(25, 55, 25);
        glVertex3f(75, 55, 25);
        glVertex3f(75, 60, 25);
        glVertex3f(25, 60, 25);
    glEnd();

    //back
    glBegin(GL_POLYGON);
        glVertex3f(25, 60, -25);
        glVertex3f(75, 60, -25);
        glVertex3f(75, 55, -25);
        glVertex3f(25, 55, -25);
    glEnd();

1 个答案:

答案 0 :(得分:5)

glFrustum()来电的参数无效:

glFrustum(0, 100.0, 0, 100.0, -50, 50);

nearVal,这是第五个参数,必须是正数。来自man page

  

nearVal,farVal:指定到近深度和远深度剪裁平面的距离。两个距离必须是正的。

将它们视为相机距离指向的距离。 -50.0的值会将近剪裁平面放在摄像机后面,这是无效的。

要使此功能正常工作,同时保持相同的范围,您可以将其更改为例如:

glFrustum(0.0, 100.0, 0.0, 100.0, 50.0, 150.0);

在没有任何其他变换的情况下,相机从原点向下指向负z轴。由于我们将近距离和远距离与原始代码相比移动了100.0,因此需要相应地移动对象,这对应于z方向上-100.0的平移。要做到这一点,您可以修改顶点的坐标,或者在模型视图转换中应用转换:

glPushMatrix();
glTranslatef(0.0f, 0.0f, -100.0f);
// draw calls
glPopMatrix();

另请注意,glFrustum()电话的前4个参数有些不同寻常。它们指定了非对称平截头体。结果看起来像相机放在窗户的一角。虽然这是完全合法的,但它可能看起来很奇怪。具有对称平截头体的情况更为常见,这意味着左/右和上/下各自具有相同的绝对值,具有相反的符号。例如:

glFrustum(-50.0, 50.0, -50.0, 50.0, 50.0, 150.0);

要匹配此项,您需要将几何体的x / y坐标放在原点附近。