glFrustum,GL_MODELVIEW与GL_PROJECTION

时间:2016-09-28 08:21:34

标签: opengl

我正在努力学习,但我真的不明白。 使用:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glBegin(GL_QUADS);
glVertex3f(-0.5, -0.5, 0.5);
glVertex3f(0.5, -0.5, 0.5);
glVertex3f(0.5, 0.5, 0.5);
glVertex3f(-0.5, 0.5, 0.5);
glEnd();

这是我在绘图程序中唯一做的事情。我画了一张脸,一切都好。

现在我希望看到相同的脸离观察者越来越远,所以我改变了Z坐标。问题是屏幕上显示的面部大小不会改变。

我尝试用glFrustum(-15, 15, -15, 15, 0.1, 15)设置一个视锥体,但随后一切都消失了(脸不是在视锥体视图中?)。 我想要的只是画一张脸,设置一个平截头体并沿着Z坐标移动脸部,看着脸越来越大。我知道有GL_MODELVIEWGL_PROJECTION,但我不明白它们是什么,也许这就是麻烦。

1 个答案:

答案 0 :(得分:0)

在OpenGL中,按照惯例,相机朝向Z轴的负方向,即Z轴指向的屏幕。您的四边形位于Z = 0.5,有效位于相机后面。所以至少要看到你必须将四边形移动到负坐标:

glBegin(GL_QUADS);
glVertex3f(-0.5, -0.5, -0.5);
glVertex3f(0.5, -0.5, -0.5);
glVertex3f(0.5, 0.5, -0.5);
glVertex3f(-0.5, 0.5, -0.5);
glEnd();

您也可以旋转相机:

glMatrixMode(GL_PROJECTION);
glFrustum(-15, 15, -15, 15, 0.1, 15);
glMatrixMode(GL_MODELVIEW);
static const GLfloat m[] = { -1, 0, 0, 0,  0, 1, 0, 0,  0, 0, -1, 0,  0, 0, 0, 1 };
glLoadMatrixf(m);

话虽这么说,你最好放弃传统的OpenGL固定管道功能,并自学可编程管道。