当你做了一些移动或旋转等变换后,使用glPushMatrix();
OpenGL 会把这个变换后的位置和角度保存起来。
然后你再随便做第二次移动或旋转变换,再用glPopMatrix();
OpenGL 就把刚刚保存的那个位置和角度恢复。

比如:
glLoadIdentity();
glTranslatef(1,0,0);//向右移动(1,0,0)
glPushMatrix();//保存当前位置
glTranslatef(0,1,0);//现在是(1,1,0)了
glPopMatrix();//这样,现在又回到(1,0,0)了

以下来自:http://www.cppblog.com/doing5552/archive/2009/01/08/71531.html(感谢作者,作者的logo很棒)

今天忽然感悟到为什么在进行变换之前要用glPushMatrix();这个函数,而在变换完毕后有用glPopMatrix()这两个函数了,赶紧记下来:

我们在变换坐标的时候,使用的是glTranslatef(),glRotaef()等函数来操作,操作的是什么呢?操作的是当前矩阵,我们也知道,这些坐标变换(翻转,旋转也好)都是通过操作矩阵来实现的,而矩阵相乘是会叠加的,当你用完一个变换函数后,当前操作的矩阵就被改变了,当你还停留在变换以前的思维,我在这个地方绘制恰好是我想要的时候,你会发现再绘制出来的不是在你想要的位置,因为你在操作变换的时候,当前矩阵被改变了。

比如你在默认情况下在原点画了一个球,然后又进行了一个变换,比如用glTranslatef( 0.0, 0.0, 1.0 );沿z轴移动一定距离又画了一个球,然后你想再在原点画一个大一点的球覆盖原来的那个,当你绘制的时候就会发现,你现在绘制的球已不在你想像的地方了。

我们来做个实验:

代码如下:

void display()
{
glClear( GL_COLOR_BUFFER_BIT );
glShadeModel( GL_SMOOTH );

//现在原点绘制一个红色正方形
glColor3f( 1.0, 0.0, 0.0 );
glRectf( -0.05, -0.05, 0.05, 0.05 );

//glPushMatrix();

//变换--沿x轴移动
    glTranslatef( 0.2, 0.0, 0.0 );

//glPopMatrix();

//再绘制一个正方形
glColor3f( 0.0, 1.0, 0.0 );
glRectf( -0.05, -0.05, 0.05, 0.05 );//这时,当我们还想在同样位置绘制时,却发现已经偏移

glFlush();
}

当我们把glPushMatrxi()和glPopMatrix()注释掉以后我们发现,当我们再想在同样的位置绘制一个正方形的时候,就会发现已经按我们的glTransfef()所指定的沿x轴偏移了0.2个单位。

而当我们不把两句函数调用注释掉时,运行发现,绿色的正方形覆盖了原来的红色的正方形。

所以,这两个函数的压栈弹栈是有用地~~~~~~~~~~

这两个函数的具体的执行方式就不扯了,网上n多。

知之为知之,不知百度之

~~~~~~~~~~~~吼吼~~~~~~~~~~

续文:

顿悟这点以后,晚上又突然想明白了另一个大问题:移动光源的位置。

在顿悟以前,总觉得光源该怎么移动呢?那不是十分十分麻烦么,而且不知道怎么办,现在明白了这个道理以后,光照的移动就简单了。

移动方式:

先pushMatrix()一下,然后在进行移动操作,然后旋转操作,然后指定光源的位置,然后PopMatrix()一下,就完成了。

测试代码:

#include <gl/glut.h>

static int spin = 0;

void init()
{
glShadeModel( GL_SMOOTH );
    glEnable( GL_LIGHTING );
glEnable( GL_LIGHT0 );
glEnable( GL_DEPTH_TEST );

}

void display()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

GLfloat position[] = { 0.0, 0.0, 1.5, 1.0 };

glPushMatrix();
glTranslatef( 0.0, 0.0, -5.0 );

glPushMatrix();
glRotated( (GLdouble)spin, 1.0, 0.0, 0.0 );
glLightfv( GL_LIGHT0, GL_POSITION, position );
glTranslated( 0.0, 0.0, 1.5 );
glDisable( GL_LIGHTING );
glColor3f( 0.0, 1.0, 0.0 );
glutWireCube( 0.1 );//绿色的下框,代表光源位置
glEnable( GL_LIGHTING );
glPopMatrix();

glutSolidSphere( 0.5, 40, 40 );//被光照的物体
glPopMatrix();
glFlush();
}

void reshape( int w, int h )
{
    glViewport( 0, 0, (GLsizei)w, (GLsizei)h );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective( 40.0, (GLfloat)w/(GLfloat)h, 1.0, 20.0 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
}

void mouse( int button, int state, int x, int y )
{
switch ( button )
{
case GLUT_LEFT_BUTTON:
   if ( state == GLUT_DOWN )
   {
    spin = ( spin + 30 ) % 360;
    glutPostRedisplay();
   }
   break;
default:
   break;
}
}

int main( int argc, char ** argv )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH );
glutInitWindowPosition( 100, 100 );
glutInitWindowSize( 500, 500 );
glutCreateWindow( argv[0] );
init();
glutDisplayFunc( display );
glutReshapeFunc( reshape );
glutMouseFunc( mouse );
glutMainLoop();
return 0;
}

小白学opengl之glpushmatrix()与glpopmatrix()的作用相关推荐

  1. 通俗解释glLoadIdentity(),glPushMatrix(),glPopMatrix()的作用 (

    原文地址如下: http://blog.sina.com.cn/s/blog_70c3d9ed010122bp.html#cmt_56C57036-7F000001-15BB06C27-948-8A0 ...

  2. glLoadIdentity(),glPushMatrix(),glPopMatrix()的作用

    对于glLoadIdentity(),glPushMatrix(),glPopMatrix()的作用虽然网上有很多的帖子,而且都试图解释得很详细,但是效果总是越说越黑,模棱两可的.今天我就简单滴说几句 ...

  3. OpenGL的glPushMatrix和glPopMatrix矩阵栈顶操作函数

    在之前的博客中,我就说过后面会详细讲解这两个函数.今天让我们来认识下它们(glPushMatrix和glPopMatrix函数). OpenGL中图形绘制后,往往需要一系列的变换来达到用户的目的,而这 ...

  4. OpenGL的glPushMatrix和glPopMatrix矩阵栈顶操作函数详解

    OpenGL中图形绘制后,往往需要一系列的变换来达到用户的目的,而这种变换实现的原理是又通过矩阵进行操作的.opengl中的变换一般包括视图变换.模型变换.投影变换等,在每次变换后,opengl将会呈 ...

  5. OpenGL中glPushMatrix和glPopMatrix的原理

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

  6. Opengl的glPushMatrix和glPopMatrix理解

    glPushMatrix()和glPopMatrix()的配对使用可以消除上一次的变换对本次变换的影响,将本次需要执行的缩放.平移等操作放在两者之间.使本次变换是以世界坐标系的原点为参考点进行. 1) ...

  7. glPushMatrix和glPopMatrix的作用

    glPushMatrix.glPopMatrix操作其实就相当于栈里的入栈和出栈. 许多人不明白的可能是入的是什么,出的又是什么. 例如你当前的坐标系原点在你电脑屏幕的左上方.现在你调用glPushM ...

  8. 通俗解释glLoadIdentity(),glPushMatrix(),glPopMatrix()的作

    对于glLoadIdentity(),glPushMatrix(),glPopMatrix()的作用虽然网上有很多的帖子,而且都试图解释得很详细,但是效果总是越说越黑,模棱两可的.今天我就简单滴说几句 ...

  9. opengl入门记录--glPushMatrix和glPopMatrix原理

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

最新文章

  1. idea工具使用总结
  2. Linux 系统线程数量上限是多少?
  3. js 实现2的n次方计算函数_「计算机组成原理」:一文快速了解计算机原理知识点-附思维导图...
  4. 三十岁前不要去在乎的29件事
  5. Greenplum使用简明手册
  6. 单击浏览器右上角的X弹出提示窗口
  7. 【剑指offer】_08.数值的整数次方
  8. CSS3 炫酷简单动画 详解!
  9. ARM交叉编译工具链
  10. pscc2018教程photoshop软件全套入门到精通分享
  11. ☆☆☆Windows服务器部署及原理☆☆☆
  12. java获取本机外网ip
  13. SylixOS中断延迟队列
  14. folium,绘制线段,连接成多边形
  15. 阿里云-个人建网站从0到精通(一)
  16. 你轻轻哼唱一句,都是最美的一首歌
  17. 时间的流逝,流逝了谁的无奈?
  18. BIOS和UEFI区别,以及Boot Loader【上】
  19. 杭中国高铁“走出去”的意义
  20. 虚拟机LINUX系统下安装JKD(附详细操作过程截图)

热门文章

  1. win10休眠_win10和win7谁更流畅?
  2. 重测序专题(二)| 不断完善的参考基因组
  3. sed命令替换字符串
  4. Overfeat,RCNN,Sppnet 2014年三篇经典文献及其创新思路总结
  5. 打开思维,新年开工一定要元气满满!
  6. ubuntu 安装 Python
  7. Golang和HTTPS在网站前端接入里的高效应用
  8. c语言isnumber函数用法,科技教程:ISNUMBER函数介绍及用法
  9. mysql查找top k_查询分页-----强势top
  10. php 笛卡尔积,php自定义函数生成笛卡尔积的方法