OpenGL+MFC对glMatrixMode(),glLoadIdentity()的理解

刚学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)设置当前矩阵为模型视图矩阵,模型视图矩阵储存了有关物体的信息。加上这个函数之后就不会产生那种情况了。











  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值