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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-08 04:56:28

OpenGL+MFC对glMatrixMode(),glLoadIdentity()的理解的相关文章

OpenGL函数解析之glLoadIdentity()

函数原型:void glLoadIdentity(void) 函数说明:调用glLoadIdentity()函数可以恢复初始坐标系,用一个4x4的单位矩阵来代替当前矩阵,实际上就是对当前矩阵进行初始化.无论之前进行了多少次矩阵变换,在执行该函数后,当前矩阵均恢复成一个单位矩阵,即相当于没有进行任何矩阵变换. 调用glLoadIdentity()函数之后,实际上将当前点移到了屏幕中心,类似于一个复位操作,状态如下: x轴从左至右,y轴从下至上,z轴从里至外. OpenGL屏幕中心的坐标值是x轴和y

Android OpenGL ES和OpenGL一起学(二)------理解Viewport(视口)和坐标系Android OpenGL ES篇(转帖)

? 来自:http://www.cnblogs.com/xiaobo68688/archive/2011/12/01/2269985.html ? 首先我们在屏幕中心显示一个矩形,效果如图: // 代码没有经过优化,为的是容易理解public class OpenGLTestActivity extends Activity { GLSurfaceView glView; @Override public void onCreate(Bundle savedInstanceState) { su

说说我对OpenGL坐标变换几个关键点的理解

刚接触OpenGL的朋友们,可能对坐标变换不太理解. 本人不才, 接触了三维一段时间后,冒昧说说我的理解, 如有偏差, 请指正. 一:  首先说说什么是世界坐标. 每个三维模型都有自己的局部坐标, 这个大家都好理解,  这个称作模型坐标, 坐标原点可以是模型的中心.   但是一个场景中如果有许多个三维模型,  那要想标准其每个位置, 就需要一个统一的坐标来标定,  那么这个坐标就叫世界坐标.  这都好理解对吧,  下面说点难的. 二:  再说说世界坐标怎么转换到摄像机坐标. 我们知道,  观察三

opengl 对投影变化函数的理解

投影变化分两种: 1 . 平行投影       2 . 透视投影 投影变化的设置一般放在reshape函数当中调用 每次要对投影变化进行操作的时候我们需要修改矩阵的变化模式,指定它为投影变化 glMatrixMode(GL_PROJECTION); 用完了记得改回去让 视景体内的物体进行正常的视图变化 glMatrixMode(GL_MODELVIEW); 这里主要讲一下最近对透视投影的理解,以免以后自己又不记得了 透视投影主要的两个函数 void glFrustum(GLdouble left

opengl中对glOrtho()函数的理解

glOrtho是创建一个正交平行的视景体. 一般用于物体不会因为离屏幕的远近而产生大小的变换的情况.比如,常用的工程中的制图等.需要比较精确的显示. 而作为它的对立情况, glFrustum则产生一个透视投影.这是一种模拟真是生活中,人们视野观测物体的真实情况.例如:观察两条平行的火车到,在过了很远之后,这两条铁轨是会相交于一处的.还有,离眼睛近的物体看起来大一些,远的物体看起来小一些. glOrtho(left, right, bottom, top, near, far), left表示视景

使用opengl 绘制9个点,理解各个参数的含义

1 // SimpleTest1.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 #include<gl/glut.h> 6 #include<iostream> 7 using namespace std; 8 void DrawTriggle() 9 { 10 glPointSize(20); 11 glColor4f(1.0,0.0,0.0,0.6); 12 glColor4f(0.5,0.8,0,0

计算机图形学OpenGL中的glLoadIdentity、glTranslatef、glRotatef原理,用法 .(转)

单位矩阵 对角线上都是1,其余元素皆为0的矩阵. 在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的1,我们称这种矩阵为单位矩阵. 它是个方阵,除左上角到右下角的对角线(称为主对角线)上的元素均为1以外全都为0. OpenGL中的坐标用齐次坐标表示,即(x,y,z)表示成(x',y',z',h),其中x=x'/h; y=y'/h; z=z'/h. 通常h取1. 比如空间中的点(2,3,4),在OpenGL中将表示成(2,3,4,1). 齐次坐标表示方式适合于矩阵运算,也很方便地表示了无穷

c++对MFC消息映射机制和运行时类型识别的理解

对MFC消息映射机制和运行时类型识别的理解 对MFC消息映射机制的理解 MFC中派生于Cobject的每个类都有一个消息映射表,所有MFC窗口都有一个同样的窗口过程AfxWndProc(),AfxWndProc的参数列表中有一个是窗口句柄,在AfxWndProc函数中将句柄(HWND)转换成了窗口指针(CWnd*),通过这个窗口指针就可以获得该窗口的消息映射表.对于WM_COMMAND这类特殊消息,将依据C++的虚函数多态机制来决定调用哪个类的函数. 对MFC运行时类型识别的理解 定义一个CRu

OpenGL一些函数详解(二)

OpenGL ES顶点数据绘制技巧 在OpenGL中,绘制一个长方体,需要将每个顶点的坐标放在一个数组中.保存坐标时有一些技巧(由于字母下标不好表示,因此将下标表示为单引号,如A1将在后文中表示为A' ): (1)将对立面坐标保存在相邻的位置,如坐标的保存顺序为:前面(A'ABB'),后面(D'DCC'),上面(D'A'B'C'),下面(DABC),左面(D'A'AD),右面(C'B'BC).因为对立面的坐标除了其垂直的那根轴的坐标相反以外,其他坐标值一样:如前面和后面(垂直于z轴),x和y的坐