glPushMatrix()和glPopMatrix()以及glLoadIdentity()的理解

glLoadIdentity()重置当前矩阵,为什么要PushMatrix(),然后PopMatrix(),因为是由于是对矩阵进行变换,这样操作不至

于影响后面的矩阵操作。

Translate()每一次操作都把当前所在的位置作为原点。Rotate()每一次操作都是相对于当前原点的(而不是屏幕的中央)。

 

[cpp]   view plain copy
  1. #include <windows.h>  
  2. #include <GL/gl.h>  
  3. #include <gl/glu.h>  
  4. #include <gl/glut.h>  
  5. void init(void)  
  6. {  
  7.  glClearColor(0.0,0.0,0.0,0.0);  
  8.  glShadeModel(GL_SMOOTH);  
  9.  glClearDepth(1.0f);  
  10. }  
  11. void display(void)  
  12. {  
  13.    glClear( GL_COLOR_BUFFER_BIT );  
  14.    glShadeModel( GL_SMOOTH );  
  15.   //现在原点绘制一个红色正方形  
  16.    glColor3f( 1.0, 0.0, 0.0 );  
  17.    glRectf( -0.05, -0.05, 0.05, 0.05 );  
  18.   //glPushMatrix();  
  19.    //变换--沿x轴移动  
  20.     glTranslatef( 1.2, 0.0, 0.0 );  
  21.    // glLoadIdentity();  
  22.    // glPopMatrix();  
  23. //再绘制一个正方形  
  24. glColor3f( 0.0, 1.0, 0.0 );  
  25. //glRectf( -0.05, -0.05, 0.05, 0.05 );//这时,当我们还想在同样位置绘制时,却发现已经偏移  
  26. glFlush();  
  27.    glFlush();  
  28. }  
  29. void reshape(int w,int h)  
  30. {  
  31.  glViewport(0,0,(GLsizei)w,(GLsizei)h);  
  32.  glMatrixMode(GL_PROJECTION);  
  33.  glLoadIdentity();  
  34.  if(w<=h)  
  35.  glOrtho(-1.5,1.5,-1.5*(GLfloat)h/(GLfloat)w,1.5*(GLfloat)h/(GLfloat)w,-10.0,10.0);  
  36.  else  
  37.      glOrtho(-1.5*(GLfloat)w/(GLfloat)h,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5,-10.0,10.0);  
  38.  glMatrixMode(GL_MODELVIEW);  
  39.  glLoadIdentity();  
  40. }  
  41. void mouse(int button,int state,int x,int y)//鼠标函数  
  42. {  
  43.  switch(button)  
  44.  {  
  45.  case GLUT_LEFT_BUTTON:  //按下左键  
  46.     if(state==GLUT_DOWN)  
  47.      {  
  48.        
  49.      }  
  50.      break;  
  51.      case GLUT_MIDDLE_BUTTON:  //按下左键  
  52.     if(state==GLUT_DOWN)  
  53.      {  
  54.        
  55.      }  
  56.      break;  
  57.      case GLUT_RIGHT_BUTTON:  //按下左键  
  58.     if(state==GLUT_DOWN)  
  59.      {  
  60.        
  61.      }  
  62.      break;  
  63.  default:  
  64.      break;  
  65.  }  
  66. }  
  67. void keyboard(unsigned char key,int x,int y)  
  68. {  
  69.  switch(key)  
  70.  {  
  71.    
  72.   case 27:  
  73.       exit(0);  
  74.       break;  
  75.   default:  
  76.       break;  
  77.  }  
  78.  glutPostRedisplay();  
  79. }  
  80. int main(int argc, char** argv)  
  81. {  
  82.     glutInit(&argc,argv);  
  83.     glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);  
  84.     glutInitWindowSize(500,500);  
  85.     glutInitWindowPosition(50,50);  
  86.     glutCreateWindow("测试");  
  87.     init();  
  88.     glutReshapeFunc(reshape);  
  89.     glutDisplayFunc(display);  
  90.      
  91.     glutKeyboardFunc(keyboard);  
  92.     glutMainLoop();  
  93.     return 0;  
  94. }  

你可能感兴趣的:(glPushMatrix()和glPopMatrix()以及glLoadIdentity()的理解)