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

Clarify glFrustum, and why I can't see the image

本文关键字:我看 看不到 图像 为什么 glFrustum 澄清      更新时间:2023-10-16

当前我的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();

glFrustum()调用的参数无效:

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

第5个参数nearVal必须为正。来自手册页:

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坐标放置在原点周围。