/* * camcube: static cube with moving camera * * P Flynn 021703: based on Angel's cube.c * */ #include #include #include #include GLfloat vertices[][3] = {{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0}, {1.0,1.0,-1.0}, {-1.0,1.0,-1.0}, {-1.0,-1.0,1.0}, {1.0,-1.0,1.0}, {1.0,1.0,1.0}, {-1.0,1.0,1.0}}; GLfloat colors[][3] = {{0.3,0.6,0.7},{1.0,0.0,0.0}, {1.0,1.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}, {1.0,0.0,1.0}, {1.0,1.0,1.0}, {0.0,1.0,1.0}}; void polygon(int a, int b, int c , int d) { /* draw a polygon via list of vertices */ glBegin(GL_POLYGON); //glBegin(GL_LINE_LOOP); glColor3fv(colors[a]); glVertex3fv(vertices[a]); glColor3fv(colors[b]); glVertex3fv(vertices[b]); glColor3fv(colors[c]); glVertex3fv(vertices[c]); glColor3fv(colors[d]); glVertex3fv(vertices[d]); glEnd(); } void colorcube(void) { /* map vertices to faces */ polygon(0,3,2,1); polygon(2,3,7,6); polygon(0,4,7,3); polygon(1,2,6,5); polygon(4,5,6,7); polygon(0,1,5,4); } /* * The camera: * - looks at the origin always * - is located on a sphere of radius r * - thea and phi control eye point and view-up vector */ static GLfloat theta = 0.0, phi=0.0; static r = 2; void display(void) { float xeye, yeye, zeye; /* display callback, clear frame buffer and z buffer, rotate cube and draw, swap buffers */ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); xeye = r * cos(phi*M_PI/180.0) * cos(theta*M_PI/180.0); yeye = r * cos(phi*M_PI/180.0) * sin(theta*M_PI/180.0); zeye = r * sin(phi*M_PI/180.0); gluLookAt(xeye,yeye,zeye, // eye 0.0,0.0,0.0, // at 0.0,0.0,1.0); // vup // draw coordinate axes glLineWidth(3.0); glBegin(GL_LINES); glColor3f(1.0,0.0,0.0); glVertex3f(0.0,0.0,0.0); glVertex3f(1.5,0.0,0.0); glColor3f(0.0,1.0,0.0); glVertex3f(0.0,0.0,0.0); glVertex3f(0.0,1.5,0.0); glColor3f(0.0,0.0,1.0); glVertex3f(0.0,0.0,0.0); glVertex3f(0.0,0.0,1.5); glEnd(); colorcube(); glFlush(); glutSwapBuffers(); } void spinCube() { } void mouse(int btn, int state, int x, int y) { if(btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN) { theta += 2; if (theta >= 360.0) theta -= 360.0; }; if(btn==GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) { phi += 2; if (phi >= 360.0) phi -= 360.0; }; glutPostRedisplay(); } /* pjf note: this function is called prior to first display, so can be used as an init function as well... I think that's what Angel did here */ void myReshape(int w, int h) { glViewport(0, 0, w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w <= h) glOrtho(-2.0, 2.0, -2.0 * (GLfloat) h / (GLfloat) w, 2.0 * (GLfloat) h / (GLfloat) w, -10.0, 10.0); else glOrtho(-2.0 * (GLfloat) w / (GLfloat) h, 2.0 * (GLfloat) w / (GLfloat) h, -2.0, 2.0, -10.0, 10.0); glMatrixMode(GL_MODELVIEW); } void main(int argc, char **argv) { glutInit(&argc, argv); /* need both double buffering and z buffer */ glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(500, 500); glutCreateWindow("colorcube"); glutReshapeFunc(myReshape); glutDisplayFunc(display); //glutIdleFunc(spinCube); glutMouseFunc(mouse); glEnable(GL_DEPTH_TEST); /* Enable hidden--surface--removal */ /* pjf this should be in a separate init function! */ //glShadeModel(GL_FLAT); glutMainLoop(); }