目前我的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();
答案 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坐标放在原点附近。