5.5 编程实例-红蓝三角形
注:教材中原程序中第55行glLoadIdentity()位置不对,现在更正至第31行。图5.17同时更正如上图。
1 #include <GL/glut.h> 2 3 typedef GLfloat point2d[2]; // a point data type 4 5 void triangle( point2d a, point2d b, point2d c) // display a triangle 6 7 { 8 9 glBegin(GL_TRIANGLES); 10 11 glVertex2fv(a); 12 13 glVertex2fv(b); 14 15 glVertex2fv(c); 16 17 glEnd(); 18 19 } 20 21 void display(void) 22 23 { 24 25 point2d v[3] = {{-1.0, -0.58}, {1.0, -0.58}, {0.0, 1.15}}; //initial triangle vertices 26 27 glClear(GL_COLOR_BUFFER_BIT); // Clear display window 28 29 glColor3f(0.0,0.0,1.0); // Set fill color to blue 30 31 glLoadIdentity();//应该放在此处,保证每次显示正确 32 33 glViewport(0, 0, 300, 400); // Set left viewport 34 35 triangle(v[0], v[1], v[2]); 36 37 glColor3f(1.0,0.0,0.0); // Set fill color to red 38 39 glViewport(300, 0, 300, 400); // Set right viewport 40 41 glRotatef(90.0, 0.0, 0.0, 1.0); // Rotate about z axis 42 43 triangle(v[0], v[1], v[2]); // Display blue triangle 44 45 glFlush(); 46 47 } 48 49 void init() 50 51 { 52 53 glMatrixMode(GL_PROJECTION); 54 55 //glLoadIdentity();//如果放在此处,会导致第一次显示正确,再次刷新时图形旋转 56 57 gluOrtho2D(-2.0, 2.0, -2.0, 2.0); 58 59 glMatrixMode(GL_MODELVIEW); 60 61 glClearColor(1.0, 1.0, 1.0,1.0); 62 63 } 64 65 void main(int argc, char **argv) 66 67 { 68 69 glutInit(&argc, argv); 70 71 glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); 72 73 glutInitWindowSize(600, 400); 74 75 glutCreateWindow("Triangle"); 76 77 glutDisplayFunc(display); 78 79 init(); 80 81 glutMainLoop(); 82 83 }
附上本实验的VC++工程代码(VC++2008)