OpenGL中glMatrixMode的使用,以及glPushMatrix和glPopMatrix的原理

本文详细介绍了OpenGL中的glMatrixMode()函数参数及其三种模式:投影(GL_PROJECTION)、模型视图(GL_MODELVIEW)和纹理(GL_TEXTURE)。同时深入解析了glPushMatrix和glPopMatrix函数的工作原理,即如何通过栈操作来保存和恢复当前坐标系的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值