#include #include float fovy = 45.0f, angle = 0.0f, eyeX = 0.0f, eyeY = 0.0f, eyeZ = 0.0f; bool keyNormal[256]; bool keySpecial[256]; void drawGround() { glColor3ub(200, 200, 200); glPushMatrix(); glScalef(5, 0, 5); glBegin(GL_QUADS); glVertex3f(-1, 0, 1); glVertex3f( 1, 0, 1); glVertex3f( 1, 0, -1); glVertex3f(-1, 0, -1); glEnd(); glPopMatrix(); } void drawTorus() { glColor3ub(255, 0, 0); glPushMatrix(); glTranslatef(0, 1.25, -2); glutWireTorus(0.25, 1, 20, 30); glPopMatrix(); } void drawTeapot() { glColor3ub(0, 0, 255); glPushMatrix(); glTranslatef(0, 1, 0); glutWireTeapot(1.0); glPopMatrix(); } void checkKeyboard() { if (keySpecial[GLUT_KEY_UP]) { eyeY += 0.5; if(eyeY > 20) eyeY = 20; } if (keySpecial[GLUT_KEY_DOWN]) { eyeY -= 0.5; if(eyeY < -20) eyeY = -20; } if (keySpecial[GLUT_KEY_LEFT]) { angle -= 1; if(angle < 0) angle = 359; } if (keySpecial[GLUT_KEY_RIGHT]) { angle += 1; if(angle > 359) angle = 0; } } void reshapeWindow(int w, int h) { if (h == 0) h = 1; glMatrixMode(GL_PROJECTION); glLoadIdentity(); glViewport(0, 0, w, h); gluPerspective(fovy, (GLfloat)w / (GLfloat)h, 0.1, 100); glMatrixMode(GL_MODELVIEW); } void renderGraphics() { glClearColor(1, 1, 1, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); checkKeyboard(); eyeX = 6 * sin(angle * M_PI / 180); eyeZ = 6 * cos(angle * M_PI / 180); // eyeX eyeY eyeZ centerX centerY centerZ upX upY upZ gluLookAt( eyeX, eyeY, eyeZ, 0, 0, 0, 0, 1, 0 ); glColor3ub(0, 0, 255); drawTeapot(); drawTorus(); drawGround(); glutSwapBuffers(); } void timer(int) { glutPostRedisplay(); glutTimerFunc(1000.0 / 60.0, timer, 0); } void normalKeyPressed(unsigned char key, int x, int y){ keyNormal[key] = true; } void specialKeyPressed(int key, int x, int y){ keySpecial[key] = true; } void normalKeyReleased(unsigned char key, int x, int y) { keyNormal[key] = false; } void specialKeyReleased(int key, int x, int y){ keySpecial[key] = false; } int main(int argc, char** argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); glutInitWindowPosition(100, 100); glutInitWindowSize(640, 480); glutCreateWindow("OpenGL 3D | Use arrow keys to move camera"); glutDisplayFunc(renderGraphics); glutReshapeFunc(reshapeWindow); glutKeyboardFunc(normalKeyPressed); glutKeyboardUpFunc(normalKeyReleased); glutSpecialFunc(specialKeyPressed); glutSpecialUpFunc(specialKeyReleased); glutTimerFunc(1000.0 / 60.0, timer, 0); glEnable(GL_DEPTH_TEST); glutMainLoop(); return 0; }