1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
#include <gl/glut.h> #include<iostream> using namespace std; float rtri; float rquad; GLfloat points0[5][3] ={{ 0, 1, 0}, {-1, -1, 1}, { 1, -1, 1}, { 1, -1, -1},{-1, -1,-1}}; GLfloat points1[8][3]={ { 1, 1, -1 }, {-1, 1, -1}, {-1, 1, 1}, { 1, 1, 1}, { 1, -1, 1 }, {-1, -1, 1}, {-1,-1,-1}, { 1, -1, -1}}; GLfloat Colors0[4][3]={{1,0,0},{0,1,0}, {0,0,1},{1,1,0}}; //四棱锥的颜色 //下行是立方体的颜色 GLfloat Colors1[6][3]={{0,1,0},{1,0.5,0},{1,0,0},{1,1,0},{0,0,1},{1,0,1}}; int vertice0[4][3]={{0,1,2},{0,2,3},{0,3,4},{0,4,1}}; //四棱锥的顶点号序列 //下行是立方体的顶点号序列 int vertice1[6][4]={{0,1,2,3},{4,5,6,7},{3,2,5,4},{7,6,1,0},{2,1,6,5}, {0,3,4,7}}; void InitGL ( GLvoid ) { glShadeModel(GL_SMOOTH); glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glEnable ( GL_COLOR_MATERIAL ); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); } void CreatePyramid() { glBegin(GL_TRIANGLES); for(int i=0;i<4;i++) { glColor3fv(Colors0[i]); for(int j=0;j<3;j++) { int VtxId=vertice0[i][j]; glVertex3fv(points0[VtxId]); } } glEnd(); glBegin( GL_QUADS); //构建底面 glColor3f(1.0f, 1.0f, 1.0f ); for(i=0;i<4;i++) glVertex3fv(points0[i]); glEnd(); } void CreateCube() { glBegin(GL_QUADS); for(int i=0;i<6;i++) { glColor3fv(Colors1[i]); for(int j=0;j<4;j++) { int VtxId=vertice1[i][j]; glVertex3fv(points1[VtxId]); } } glEnd(); } void display ( void ) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glPushMatrix(); glTranslatef(-1.5f,0.0f,-6.0f); //平移至左侧 glRotatef(rtri,0.0f,1.0f,0.0f); //旋转一个角度 CreatePyramid(); //创建三角塔
glLoadIdentity(); //将矩阵归一化回原样 glTranslatef(1.5f,0.0f,-6.0f); //平移到右侧 glRotatef(rquad,1.0f,0.0f,0.0f); //旋转一个角度 CreateCube(); //创建立方体 glPopMatrix(); rtri+=0.2f; //修改三角塔旋转角度 rquad-=0.15f; //修改立方体的旋转角度 glutSwapBuffers ( ); } void reshape ( int width , int height ) { if (height==0) height=1; glViewport(0,0,width,height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void main ( int argc, char** argv ) { glutInit ( &argc, argv ); glutInitDisplayMode ( GLUT_RGBA | GLUT_DOUBLE ); glutInitWindowSize ( 600, 400 ); glutCreateWindow ( "Pyramid and cube" ); InitGL(); glutDisplayFunc ( display ); glutReshapeFunc ( reshape ); glutIdleFunc ( display ); glutMainLoop ( ); }
|