刚学OpenGL,我试着用MFC把我 做的OpenGL程序整理成一个带有菜单单文档的形式,点击不同的菜单会弹出不同的图形
下面我把我程序中出现的小问题说一下
/*绘制三维球、棱锥、棱柱*/
void CXXXView::wireQuadSurfs()
{
glMatrixMode(GL_PROJECTION);
glOrtho(-2.0, 2.0, -2.0, 2.0, 0.0, 5.0);
gluLookAt(2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glColor3f(0.0, 0.0, 1.0);
glPushMatrix();
glTranslatef(1.0, 1.0, 0.0);
glutWireSphere(0.75, 8, 6);
glPopMatrix();
glPushMatrix();
glTranslated(1.0, -0.5, 0.5);
glutWireCone(0.7, 2.0, 7, 6);
glPopMatrix();
GLUquadricObj
*cylinder;
glPushMatrix();
glTranslatef(0.0, 1.2, 0.8);
cylinder = gluNewQuadric();
gluQuadricDrawStyle(cylinder, GLU_LINE);
gluCylinder(cylinder, 0.6, 0.6, 0.5, 6, 4);
glPopMatrix();
glFlush();
}
这是我的部分代码,主要是画球·棱锥· 棱柱的。
运行后:
点击图中菜单选项
出现结果:
在弹出菜单,重复上述步骤:
可以发现每次运行结果都不一样,经过我的实验得出是因为每次运行时
glMatrixMode(GL_PROJECTION);
glMatrixMode(GL_MODELVIEW);
这两个函数都被执行一次,
这里说一下glMatrixMode(mode)函数参数的作用
mode 指定哪一个矩阵堆栈是下一个矩阵操作的目标,可选值:
GL_MODELVIEW、GL_PROJECTION、GL_TEXTURE.
说明
glMatrixMode设置当前矩阵模式:
GL_MODELVIEW,对模型视景矩阵堆栈应用随后的矩阵操作.
GL_PROJECTION,对投影矩阵应用随后的矩阵操作.
GL_TEXTURE,对纹理矩阵堆栈应用随后的矩阵操作.
glMatrixMode每次执行过之后都没对模型进行单一化处理,所以会产生上述问题,解决这个问题的方法就是让glMatrixMode函数与glLoadIdentity()一同使用
glLoadIdentity():将当前的用户坐标系的原点移到了屏幕中心:类似于一个复位操作
在glLoadIdentity()之后我们为场景设置了透视图。glMatrixMode(GL_MODELVIEW)设置当前矩阵为模型视图矩阵,模型视图矩阵储存了有关物体的信息。加上这个函数之后就不会产生那种情况了。
版权声明:本文为博主原创文章,未经博主允许不得转载。