一、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的原理相关推荐

  1. OpenGL中glPushMatrix和glPopMatrix的原理

    glPushMatrix.glPopMatrix操作事实上就相当于栈里的入栈和出栈. 很多人不明确的可能是入的是什么,出的又是什么. 比如你当前的坐标系原点在你电脑屏幕的左上方.如今你调用glPush ...

  2. OpenGL之glMatrixMode函数的用法

    函数原型: void glMatrixMode(GLenum mode) 参数说明: mode 指定哪一个矩阵堆栈是下一个矩阵操作的目标,可选值: GL_MODELVIEW,对模型视图矩阵堆栈应用随后 ...

  3. OpenGL:glMatrixMode()

    在OpenGL中,如果想对模型进行操作,就要对这个模型的状态(当前的矩阵)乘上这个操作对应的一个矩阵. 如果当前矩阵乘以变换矩阵(平移, 缩放, 旋转), 那相乘之后, 模型的位置被变换; 如果当前矩 ...

  4. (zt)OpenGL中的Alpha测试,深度测试,模板测试,裁减测试

    转自http://www.cppblog.com/flashboy/archive/2009/09/01/94974.html 大家好.现在因为参加工作的关系,又是长时间没有更新.趁着国庆的空闲,总算 ...

  5. OpenGL中的投影使用

    OpenGL中的投影使用 在OpenGL中,投影矩阵指定了可视区域的大小和形状.对于正投影与透视投影这两种不同的投影类型,它们分别有各自的用途. 正投影 它适用于2D图形,如文本.建筑画图等.在它的应 ...

  6. OpenGL中各种坐标系的理解

    OPENGL坐标系可分为:世界坐标系和当前绘图坐标系. 世界坐标系:在OpenGL中,世界坐标系是以屏幕中心为原点(0, 0, 0),且是始终不变的.你面对 屏幕,你的右边是x正轴,上面是y正轴,屏幕 ...

  7. OpenGL中的gl,glu,glut的区别

    OpenGL中gl,glu,glut的区别 OpenGL中的gl库是核心库,glu是实用库,glut是实用工具库, gl是核心,glu是对gl的部分封装,glut是OpenGL的跨平台工具库,gl中包 ...

  8. OPENGL中GLU和GLUT工具箱

    GLUT工具箱提供几种图形3维图形的函数: void glutWireSphere(GLdouble radius, GLint slices, GLint stacks);  丝状球 void gl ...

  9. OpenGL中gl,glu,glut的区别

    OpenGL中的gl库是核心库,glu是实用库,glut是实用工具库, gl是核心,glu是对gl的部分封装,glut是OpenGL的跨平台工具库,gl中包含了最基本的3D函数,而glu似乎对gl的辅 ...

最新文章

  1. 机器学习中目标函数、损失函数、代价函数之间的区别和联系
  2. index.php?s=$1,thinkphp nginx配置rewrite,地址会多出个.php
  3. 通俗讲解分布式锁,看完不懂算我输
  4. JVM 的内存模型及jstat命令的使用
  5. kafka 集群的部署安装
  6. mysql滴的一声就关了_关于mysql数据库在输入密码后,滴的一声直接退出界面的解决办法(详细办法)...
  7. 被逼至“盗版合法化”,俄罗斯要把 RuTracker 放出来了?
  8. 使用ionic2开发一个登录功能
  9. 【机器学习】径向基(RBF)神经网络的tensorflow实现
  10. git基本使用知识点总结
  11. BIGEMAP教您如何选择分度带(中央子午线)
  12. iPhone屏幕适配 新增iPhone XS iPhone XR iPhone XS Max
  13. NetBeans 打开/保存具有指定编码的文件插件
  14. Router中如何设置光标以全屏十字架显示
  15. 设计模式 - 创建型模式_工厂方法模式
  16. 汉谷拼形是克服“提笔忘字”最犀利的武器
  17. Android开发之简单快速对APP进行GIF动图生成
  18. 关于在终端使用pip命令命令
  19. Advice(通知)的类别有哪些?
  20. STM32 W5500以太网通讯

热门文章

  1. 国内外程序员的薪资如何?年薪最高218万!人人都想当程序员
  2. 学会linux需要哪些技术,运维安全需要掌握哪些技术呢?linux基础知识学习
  3. 借力大数据开拓中国市场 新加坡国家旅行馆入驻蚂蜂窝
  4. 优雅的 Python 动态图工具
  5. 计算机基础:原码补码反码计算
  6. C-多线程,冰淇淋问题
  7. linux busybox tar,busybox tar 命令支持 tar.gz
  8. 2023企业数字化转型组织人才发展
  9. MySQL系列—全文检索(fulltext)使用
  10. 管理和理解 suspect_pages 表