#include "..\glut.h" #include #include #include #include /* global variable declarations */ int plusOrMinus = 1; int xYorZ = 4; GLfloat myX = 30.0, myY = 20.0, myZ = 100.0; float matSpecular[] = {1.0, 1.0, 1.0, 1.0}; float matAmbient[] = {1.0, 1.0, 1.0, 1.0}; float matDiffuse[] = {1.0, 1.0, 1.0, 1.0}; float matShininess = 50.0; /* function declarations ----------------------------------*/ void myInit(){ glClearColor(0.0, 0.0, 0.0, 1.0); glColor3f(1.0, 1.0, 1.0); glEnable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-100.0, 100.0, -100.0, 100.0, -100.0, 100.0); } // end of myInit() /* --------------------------------------------------------*/ void myDisplay() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(myX, myY, myZ, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); // positive axes in blue glColor3f(0.0, 0.6, 0.8); glBegin(GL_LINES); glVertex3f(100.0, 0.0, 0.0); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0, 100.0, 0.0); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0, 0.0, 100.0); glVertex3f(0.0, 0.0, 0.0); glEnd(); // negative axes in orange glColor3f(1.0, 0.4, 0.2); glBegin(GL_LINES); glVertex3f(-100.0, 0.0, 0.0); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0, -100.0, 0.0); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0, 0.0, -100.0); glVertex3f(0.0, 0.0, 0.0); glEnd(); // 5 lightgreen tetrahedra for (int t = -2; t <= 2; t++) { glColor3f(0.6, 1.0, 0.8); glBegin(GL_POLYGON); glVertex3f(40.0*t, 30.0, 0.0); glVertex3f(40.0*t-10, 0.0, 0.0); glVertex3f(40.0*t+10, 0.0, 0.0); glEnd(); glColor3f(0.0, 0.8, 0.6); glBegin(GL_POLYGON); glVertex3f(40.0*t, 30.0, 0.0); glVertex3f(40.0*t-10, 0.0, 0.0); glVertex3f(40.0*t, 0.0, 20.0); glEnd(); glColor3f(0.2, 1.0, 0.8); glBegin(GL_POLYGON); glVertex3f(40.0*t, 30.0, 0.0); glVertex3f(40.0*t+10, 0.0, 0.0); glVertex3f(40.0*t, 0.0, 20.0); glEnd(); glColor3f(0.2, 0.8, 0.4); glBegin(GL_POLYGON); glVertex3f(40.0*t, 0.0, 20.0); glVertex3f(40.0*t-10, 0.0, 0.0); glVertex3f(40.0*t+10, 0.0, 0.0); glEnd(); } // end of for loop glutSwapBuffers(); } // end of myDisplay() /* --------------------------------------------------------*/ void spinDisplay() { if (xYorZ == 1) myX += plusOrMinus*0.05; if (xYorZ == 2) myY += plusOrMinus*0.05; if (xYorZ == 3) myZ += plusOrMinus*0.05; // orbit around y axis from current position if (xYorZ == 4) { float oldX = myX; myX = cos(.314159/180)*myX - sin(.314159/180)*myZ; myZ = sin(.314159/180)*oldX + cos(.314159/180)*myZ; } // end of orbit code glutPostRedisplay(); } /* --------------------------------------------------------*/ void myKeyboard(unsigned char key, int x, int y) { if (key == 'X' || key == 'x') xYorZ = 1; if (key == 'Y' || key == 'y') xYorZ = 2; if (key == 'Z' || key == 'z') xYorZ = 3; if (key == 'O' || key == 'o') xYorZ = 4; if (key == 'Q' || key == 'q') exit(0); } /* --------------------------------------------------------*/ void myMouse(int button, int state, int x, int y) { if (state == GLUT_DOWN) plusOrMinus *= -1; } /* --------------------------------------------------------*/ void quit_menu(int id) { float lightPosition[] = {-30.0, 30.0, 30.0, 0.0}; float lightDiffuseColor[] = {1.0, 0.0, 0.0, 1.0}; float lightSpecularColor[] = {1.0, 1.0, 0.0, 1.0}; float lightAmbientColor[] = {0.2, 0.2, 0.2, 1.0}; switch (id) { case 1: xYorZ = 1; break; case 2: xYorZ = 2; break; case 3: xYorZ = 3; break; case 4: xYorZ = 4; break; case 5: xYorZ = 0; break; case 6: glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuseColor); glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpecularColor); glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbientColor); break; case 7: glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, matSpecular); glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, matAmbient); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, matDiffuse); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, matShininess); break; case 8: glDisable(GL_LIGHTING); glDisable(GL_LIGHT0); break; default: exit(0); } } /* --------------------------------------------------------*/ void myReshape(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0, (double)w/h, 10.0, 200.0); } /* --------------------------------------------------------*/ int main(int argc, char **argv) { glutInit(&argc, argv); /* set up display window */ glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(400, 400); glutInitWindowPosition(150, 100); glutCreateWindow("Always Looking at the Origin"); /* register callback functions */ glutReshapeFunc( myReshape ); glutDisplayFunc( myDisplay ); glutKeyboardFunc( myKeyboard ); glutIdleFunc( spinDisplay ); glutMouseFunc( myMouse ); /* add a menu! */ glutCreateMenu(quit_menu); glutAddMenuEntry("move along x axis", 1); glutAddMenuEntry("move along y axis", 2); glutAddMenuEntry("move along z axis", 3); glutAddMenuEntry("orbit arount y axis", 4); glutAddMenuEntry("pause movement", 5); glutAddMenuEntry("turn lights on", 6); glutAddMenuEntry("turn on material properties", 7); glutAddMenuEntry("turn lights off", 8); glutAddMenuEntry("quit", 9); glutAttachMenu(GLUT_RIGHT_BUTTON); /* start the event loop */ myInit(); glutMainLoop(); return 0; } // end of main