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

mon*_*dle 0 c++ opengl graphics dimension

目前我的glFrustum设置为

glFrustum(0, 100.0, 0, 100.0, -50, 50);
Run Code Online (Sandbox Code Playgroud)

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

//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();
Run Code Online (Sandbox Code Playgroud)

Ret*_*adi 5

glFrustum()调用的参数无效:

glFrustum(0, 100.0, 0, 100.0, -50, 50);
Run Code Online (Sandbox Code Playgroud)

nearVal,这是第5个参数,必须是正数.从手册页:

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

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

为了使其工作,同时保持相同的范围,您可以将其更改为例如:

glFrustum(0.0, 100.0, 0.0, 100.0, 50.0, 150.0);
Run Code Online (Sandbox Code Playgroud)

在没有任何额外变换的情况下,摄像机从原点向下指向负z轴.由于我们将近距离和远距离与原始代码相比移动了100.0,因此需要相应地移动对象,这对应于z方向上-100.0的平移.要执行此操作,您可以修改顶点的坐标,也可以将变换应用为模型视图转换的一部分:

glPushMatrix();
glTranslatef(0.0f, 0.0f, -100.0f);
// draw calls
glPopMatrix();
Run Code Online (Sandbox Code Playgroud)

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

glFrustum(-50.0, 50.0, -50.0, 50.0, 50.0, 150.0);
Run Code Online (Sandbox Code Playgroud)

要匹配此项,您需要将几何的x/y坐标放在原点周围.