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)
此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坐标放在原点周围.