澄清glFrustum,为什么我不能看到图像
问题描述:
目前,我有我的glFrustum设置为澄清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);
的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坐标放置在原点周围。
雷托科拉迪已经给了你一个很好的答案。如果你有问题想象如何截锥体的工作,你可能想看看这个:https://github.com/datenwolf/codesamples/blob/master/samples/OpenGL/frustum/frustum.c – datenwolf 2014-09-30 07:26:36