glLoadIdentity()重置当前矩阵,为什么要PushMatrix(),然后PopMatrix(),因为是由于是对矩阵进行变换,这样操作不至
于影响后面的矩阵操作。
Translate()每一次操作都把当前所在的位置作为原点。Rotate()每一次操作都是相对于当前原点的(而不是屏幕的中央)。
#include <windows.h> #include <GL/gl.h> #include <gl/glu.h> #include <gl/glut.h> void init(void) { glClearColor(0.0,0.0,0.0,0.0); glShadeModel(GL_SMOOTH); glClearDepth(1.0f); } void display(void) { 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( 1.2, 0.0, 0.0 ); // glLoadIdentity(); // glPopMatrix(); //再绘制一个正方形 glColor3f( 0.0, 1.0, 0.0 ); //glRectf( -0.05, -0.05, 0.05, 0.05 );//这时,当我们还想在同样位置绘制时,却发现已经偏移 glFlush(); glFlush(); } void reshape(int w,int h) { glViewport(0,0,(GLsizei)w,(GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(w<=h) glOrtho(-1.5,1.5,-1.5*(GLfloat)h/(GLfloat)w,1.5*(GLfloat)h/(GLfloat)w,-10.0,10.0); else glOrtho(-1.5*(GLfloat)w/(GLfloat)h,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5,-10.0,10.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) { } break; case GLUT_MIDDLE_BUTTON: //按下左键 if(state==GLUT_DOWN) { } break; case GLUT_RIGHT_BUTTON: //按下左键 if(state==GLUT_DOWN) { } break; default: break; } } void keyboard(unsigned char key,int x,int y) { switch(key) { case 27: exit(0); break; default: break; } glutPostRedisplay(); } int main(int argc, char** argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(500,500); glutInitWindowPosition(50,50); glutCreateWindow("测试"); init(); glutReshapeFunc(reshape); glutDisplayFunc(display); glutKeyboardFunc(keyboard); glutMainLoop(); return 0; }
参考文章:http://blog.sina.com.cn/s/blog_602c65870100e703.html