#include #include #include int do_rotate = 1; // Callback Funktion: Reaktion auf Tastendruck void keyb(unsigned char keyPressed, int x, int y) { switch (keyPressed) { case 'l': // Licht aktivieren glEnable(GL_LIGHTING); glutPostRedisplay(); break; case 'o': // Licht deaktivieren glDisable(GL_LIGHTING); glutPostRedisplay(); break; case 's': // Bewegung stoppen do_rotate = 0; break; case 'g': // Bewegung starten do_rotate = 1; break; } } void DrawScene(void) { static float rtri = 0.0f; // Puffer löschen glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // EINHEITSMATRIX glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // Objekt 5.0 nach hinten versetzen glTranslatef(0.0f, 0.0f, -5.0f); // und drehen glRotatef(rtri, 0.0f, 1.0f, 0.0f); glRotatef(rtri, 0.0f, 0.0f, 1.0f); if (do_rotate) { rtri += .1f; } glBegin(GL_QUADS); // VORNE glColor3f(1.0f, 0.0f, 0.0f); glNormal3f(0.0f, 0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glVertex3f(1.0f, -1.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // HINTEN glColor3f(0.0f, 1.0f, 0.0f); glNormal3f(0.0f, 0.0f, -1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glVertex3f(1.0f, 1.0f, -1.0f); glVertex3f(1.0f, -1.0f, -1.0f); // OBEN glColor3f(0.0f, 0.0f, 1.0f); glNormal3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f); // UNTEN glColor3f(1.0f, 1.0f, 0.0f); glNormal3f(0.0f, -1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glVertex3f(1.0f, -1.0f, -1.0f); glVertex3f(1.0f, -1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // RECHTS glColor3f(0.0f, 1.0f, 1.0f); glNormal3f(1.0f, 0.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f); glVertex3f(1.0f, 1.0f, -1.0f); glVertex3f(1.0f, 1.0f, 1.0f); glVertex3f(1.0f, -1.0f, 1.0f); // LINKS glColor3f(1.0f, 0.0f, 1.0f); glNormal3f(-1.0f, 0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glEnd(); // Vordergrund- und Hintergrundpuffer wechseln glutSwapBuffers(); glutPostRedisplay(); } // eigene Initialisierungsfunktion void myinit() { // Lichtposition GLfloat LightPosition[] = { 0.0, 0.0, -1.0, 1.0f }; // Werte für ambienten Lichtanteil GLfloat LightAmbient[] = { 0.1f, 0.1f, 0.1f, 1.0f }; // Werte für diffusen Lichtanteil GLfloat LightDiffuse[] = { .6f, .6f, .6f, 1.0f }; // Werte für specularen Lichtanteil GLfloat LightSpecular[] = { .9f, .9f, .9f, 1.0f }; // Lichtquelle initialisieren glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient); glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, LightSpecular); glLightfv(GL_LIGHT0, GL_POSITION, LightPosition); // und aktivieren glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); // Material an glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); // Z-Puffer aktivieren glDepthFunc(GL_LEQUAL); glEnable(GL_DEPTH_TEST); // Matritzen setzen glMatrixMode(GL_PROJECTION); // Sichtpyramide erstellen gluPerspective(60.0, 1.0, 1.0, 1000.0); // glMatrixMode(GL_MODELVIEW); // gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.); } int main(int argc, char *argv[]) { // GLUT initialisieren, Fenster setzen glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(500, 500); glutInitWindowPosition(100, 100); glutCreateWindow(argv[0]); // eigene Initialisierungen myinit(); // Callbacks für Tastaturaktivitäten glutKeyboardFunc(keyb); // Callback zum Zeichnen der GL-Funktion glutDisplayFunc(DrawScene); glutMainLoop(); return EXIT_SUCCESS; }