OpenGL中glMatrixMode的使用,以及glPushMatrix和glPopMatrix的原理
一、glMatrixMode()函数的参数,这个函数其实就是对接下来要做什么进行一下声明,也就是在要做下一步之前告诉计算机我要对“什么”进行操作了,这个“什么”在glMatrixMode的“()”里的选项(参数)有3种模式: GL_PROJECTION 投影, GL_MODELVIEW 模型视图, GL_TEXTURE 纹理。
二保存状态矩阵
glPushMatrix、glPopMatrix操作事实上就相当于栈里的入栈和出栈。
很多人不明确的可能是入的是什么,出的又是什么。
比如你当前的坐标系原点在你电脑屏幕的左上方。如今你调用glPushMatrix,然后再调用一堆平移、旋转代码等等,然后再绘图。那些平移和旋转都是基于左上角为原点进行变化的。并且都会改变坐标的位置,经过了这些变化后,你的坐标肯定不再左上角了。
那假设想恢复怎么办呢?这时就调用glPopMatrix从栈里取出一个“状态”了,这个状态就是你调用glPushMatrix之前的那个状态。就如非常多opengl的书上所讲:调用glPushMatrix事实上就是把当前状态做一个副本放入堆栈之中。
当你做了一些移动或旋转等变换后,使用glPushMatrix();
OpenGL 会把这个变换后的位置和角度保存起来。
然后你再随便做第二次移动或旋转变换,再用glPopMatrix();
OpenGL 就把刚刚保存的那个位置和角度恢复。
比方:
glLoadIdentity();
glTranslatef(1,0,0);//向右移动(1,0,0)
glPushMatrix();//保存当前位置
glTranslatef(0,1,0);//如今是(1,1,0)了
glPopMatrix();//这样,如今又回到(1,0,0)了
//-----------------------------------------
所有的这几个函数的本质都是对坐标系的操作。
前提知识:
1。每一种矩阵对应着一种坐标系。见图一
2。每一次对矩阵的操作都是对当前矩阵进行的。确切的说,作为一种状态机,每一时刻在矩阵方面只能有一种状态。
3。每一次压栈和出栈都对应着一种对坐标系的操作。
4。我们所有对矩阵的操作都是对矩阵栈的栈顶矩阵进行的。
如图:全局坐标系中有一个局部坐标系,这个坐标系的状态对应着一种矩阵。假如当前矩阵为该矩阵,则该矩阵为矩阵栈中的栈顶元素。假如此时又进行了一系列glTranslate(),glRotatef()等操作,都是对当前矩阵也就是栈顶矩阵进行了修改。若此时调用glPushMatrix()函数,则将该矩阵压入栈中第二层的位置,当然此时栈顶位置的矩阵也与此矩阵相同。(就如很多opengl的书上所讲:调用glPushMatrix其实就是把当前状态做一个副本放入堆栈之中。)
当进行完一系列变换之后,栈顶矩阵为该矩阵。若此时调用glPopMatrix()函数,则恢复当前矩阵为该坐标系的状态。以前所进行的有关修改都被忽略了。
记住一句话,所有对矩阵进行的操作都是对栈顶矩阵进行的,压进去的矩阵是哪个矩阵,当前矩阵就是哪个矩阵,弹出来的是哪个矩阵,当前矩阵就为哪个矩阵。
记住:一个矩阵对应一个局部坐标系。
转载地址: http://www.bubuko.com/infodetail-435954.html
OpenGL中glMatrixMode的使用,以及glPushMatrix和glPopMatrix的原理相关推荐
- OpenGL中glPushMatrix和glPopMatrix的原理
glPushMatrix.glPopMatrix操作事实上就相当于栈里的入栈和出栈. 很多人不明确的可能是入的是什么,出的又是什么. 比如你当前的坐标系原点在你电脑屏幕的左上方.如今你调用glPush ...
- OpenGL之glMatrixMode函数的用法
函数原型: void glMatrixMode(GLenum mode) 参数说明: mode 指定哪一个矩阵堆栈是下一个矩阵操作的目标,可选值: GL_MODELVIEW,对模型视图矩阵堆栈应用随后 ...
- OpenGL:glMatrixMode()
在OpenGL中,如果想对模型进行操作,就要对这个模型的状态(当前的矩阵)乘上这个操作对应的一个矩阵. 如果当前矩阵乘以变换矩阵(平移, 缩放, 旋转), 那相乘之后, 模型的位置被变换; 如果当前矩 ...
- (zt)OpenGL中的Alpha测试,深度测试,模板测试,裁减测试
转自http://www.cppblog.com/flashboy/archive/2009/09/01/94974.html 大家好.现在因为参加工作的关系,又是长时间没有更新.趁着国庆的空闲,总算 ...
- OpenGL中的投影使用
OpenGL中的投影使用 在OpenGL中,投影矩阵指定了可视区域的大小和形状.对于正投影与透视投影这两种不同的投影类型,它们分别有各自的用途. 正投影 它适用于2D图形,如文本.建筑画图等.在它的应 ...
- OpenGL中各种坐标系的理解
OPENGL坐标系可分为:世界坐标系和当前绘图坐标系. 世界坐标系:在OpenGL中,世界坐标系是以屏幕中心为原点(0, 0, 0),且是始终不变的.你面对 屏幕,你的右边是x正轴,上面是y正轴,屏幕 ...
- OpenGL中的gl,glu,glut的区别
OpenGL中gl,glu,glut的区别 OpenGL中的gl库是核心库,glu是实用库,glut是实用工具库, gl是核心,glu是对gl的部分封装,glut是OpenGL的跨平台工具库,gl中包 ...
- OPENGL中GLU和GLUT工具箱
GLUT工具箱提供几种图形3维图形的函数: void glutWireSphere(GLdouble radius, GLint slices, GLint stacks); 丝状球 void gl ...
- OpenGL中gl,glu,glut的区别
OpenGL中的gl库是核心库,glu是实用库,glut是实用工具库, gl是核心,glu是对gl的部分封装,glut是OpenGL的跨平台工具库,gl中包含了最基本的3D函数,而glu似乎对gl的辅 ...
最新文章
- 机器学习中目标函数、损失函数、代价函数之间的区别和联系
- index.php?s=$1,thinkphp nginx配置rewrite,地址会多出个.php
- 通俗讲解分布式锁,看完不懂算我输
- JVM 的内存模型及jstat命令的使用
- kafka 集群的部署安装
- mysql滴的一声就关了_关于mysql数据库在输入密码后,滴的一声直接退出界面的解决办法(详细办法)...
- 被逼至“盗版合法化”,俄罗斯要把 RuTracker 放出来了?
- 使用ionic2开发一个登录功能
- 【机器学习】径向基(RBF)神经网络的tensorflow实现
- git基本使用知识点总结
- BIGEMAP教您如何选择分度带(中央子午线)
- iPhone屏幕适配 新增iPhone XS iPhone XR iPhone XS Max
- NetBeans 打开/保存具有指定编码的文件插件
- Router中如何设置光标以全屏十字架显示
- 设计模式 - 创建型模式_工厂方法模式
- 汉谷拼形是克服“提笔忘字”最犀利的武器
- Android开发之简单快速对APP进行GIF动图生成
- 关于在终端使用pip命令命令
- Advice(通知)的类别有哪些?
- STM32 W5500以太网通讯