lession 5 3D
// lession 5 3D #include <OpenGL/OpenGL.h> #include <GLUT/GLUT.h> #include <stdio.h> #include <stdlib.h> #include <stdio.h> float rtri; // angle for the triangel float rquad; // angle for the quad void initGL(void) // Create some everyday functions { glShadeModel(GL_SMOOTH); // Enable smooth shading glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // black background glClearDepth(1.0f); // depth buffer setup glEnable(GL_DEPTH_TEST); // Depth buffer setup glDepthFunc(GL_LEQUAL); // the type of depth testing to do. glEnable(GL_COLOR_MATERIAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); } void display(void) // create the siplay functions { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear screen and depth buffer glLoadIdentity(); // reset the current modelview matrix glPushMatrix(); { glTranslatef(-1.5f, 0.0f, -6.0f); // Move left 1.5 units and into the screen 6.0 glRotatef(rtri, 0.0f, 1.0f, 0.0f); glBegin(GL_TRIANGLES); glColor3f(1.0f, 0.0f, 0.0f); // red glVertex3f(0.0f, 1.0f, 0.0f); // top of triangle (Front); glColor3f(0.0f, 1.0f, 0.0f); // green glVertex3f(-1.0f, -1.0f, 1.0f); // Left of triangle (Front) glColor3f(0.0, 0.0, 1.0); // blue glVertex3f(1.0f, -1.0f, 1.0f); // right of triangle (Front) glColor3f(1.0, 0.0, 0.0); // red glVertex3f(0.0f, 1.0f, 0.0f); // top of triangle (right) glColor3f(0.0f, 0.0f, 1.0f); // blue glVertex3f(1.0f, -1.0f, 1.0f); // left of triangle (right) glColor3f(0.0, 1.0, 0.0); // green glVertex3f(1.0f, -1.0f, -1.0f); // right of triangle (right); glColor3f(1.0f, 0.0f, 0.0f); // red glVertex3f(0.0f, 1.0f, 0.0f); // top of triangle (back); glColor3f(0.0f, 1.0f, 0.0f); // green glVertex3f(1.0f, -1.0f, -1.0f); // left of triangle (back) glColor3f(0.0f, 0.0f, 1.0f); // blue glVertex3f(-1.0f, -1.0f, -1.0f); // right of triangle (back) glColor3f(1.0f, 0.0f, 0.0f); // red glVertex3f(0.0f, 1.0f, 0.0f); // top of triangle (left) glColor3f(0.0f, 0.0f, 1.0f); // blue glVertex3f(-1.0f, -1.0f, -1.0f); // left of triangle (left) glColor3f(0.0f, 1.0f, 0.0f); // green glVertex3f(-1.0f, -1.0f, 1.0f); // right of triangle (left); glEnd(); glLoadIdentity(); glTranslatef(1.5f, 0.0f, -6.0f); glRotatef(rquad, 1.0f, 0.0f, 0.0f); // Rotate the quad on the x axis glColor3f(0.5f, 0.5f, 1.0f); // Set teh color to blue on time only glBegin(GL_QUADS); glColor3f(0.0f, 1.0f, 0.0f); // Set the color to blue glVertex3f( 1.0f, 1.0f, -1.0f); // top right of the quad (top) glVertex3f(-1.0f, 1.0f, -1.0f); // top left of the quad (top) glVertex3f(-1.0f, 1.0f, 1.0f); // bottom left of the quad (top) glVertex3f( 1.0f, 1.0f, 1.0f); // bottom right of the quad (top) glColor3f(1.0f, 0.5f, 0.0f); // Set the color to Orange glVertex3f( 1.0f, -1.0f, -1.0f); // top right of the quad (bottom) glVertex3f(-1.0f, -1.0f, -1.0f); // top left of the quad (bottom) glVertex3f(-1.0f, -1.0f, 1.0f); // bottom left of the quad (bottom) glVertex3f( 1.0f, -1.0f, 1.0f); // bottom right of the quad (bottom) glColor3f(1.0f, 0.0f, 0.0f); // Set the color to red glVertex3f( 1.0f, 1.0f, 1.0f); // top right of the quad (front) glVertex3f(-1.0f, 1.0f, 1.0f); // top left of the quad (front) glVertex3f(-1.0f, -1.0f, 1.0f); // bottom left of the quad (front) glVertex3f( 1.0f, -1.0f, 1.0f); // bottom right of the quad (front) glColor3f(1.0f, 1.0f, 0.0f); // Set the color to Yellow glVertex3f( 1.0f, 1.0f, -1.0f); // top right of the quad (back) glVertex3f(-1.0f, 1.0f, -1.0f); // top left of the quad (back) glVertex3f(-1.0f, -1.0f, -1.0f); // bottom left of the quad (back) glVertex3f( 1.0f, -1.0f, -1.0f); // bottom right of the quad (back) glColor3f(0.0f, 0.0f, 1.0f); // Set the color to blue glVertex3f(-1.0f, 1.0f, 1.0f); // top right of the quad (left) glVertex3f(-1.0f, 1.0f, -1.0f); // top left of the quad (left) glVertex3f(-1.0f, -1.0f, -1.0f); // bottom left of the quad (left) glVertex3f(-1.0f, -1.0f, 1.0f); // bottom right of the quad (left) glColor3f(1.0f, 0.0f, 1.0f); // Set the color to Violet glVertex3f( 1.0f, 1.0f, -1.0f); // top right of the quad (right) glVertex3f( 1.0f, 1.0f, 1.0f); // top left of the quad (right) glVertex3f( 1.0f, -1.0f, 1.0f); // bottom left of the quad (right) glVertex3f( 1.0f, -1.0f, -1.0f); // bottom right of the quad (right) glEnd(); } glPopMatrix(); rtri += 0.2f; // increase the rotation variable for the triangle (NEW) rquad -= 0.2f; // decrease the rotation variable for the quad (NEW) glutSwapBuffers(); // Swap the buffers to not be left with a clear screen. } // Create the reshape function (the viewport) void reshape(int width, int height) { if (height == 0) height = 1; glViewport(0, 0, width, height); // Reset the current viewport glMatrixMode(GL_PROJECTION); // Select the projection matrix glLoadIdentity(); // Rest the projection matrix // Calculate the aspect ratio of the window gluPerspective(45.0f, (GLfloat) width / (GLfloat) height, 0.1f, 100.0f); glMatrixMode(GL_MODELVIEW); // Select the Modelview Matrix glLoadIdentity(); // Reset the Modelview Matrix } // Create keyboard function void keyboard(unsigned char key, int x, int y) { switch (key) { case 27: exit(0); break; default: break; } } // Create Special Function (required for arrow keys) void arrow_keys(int a_keys, int x, int y) { switch (a_keys) { case GLUT_KEY_UP: // When Up Arrow is pressed... glutFullScreen(); // Go into full screen mode break; case GLUT_KEY_DOWN: // When Down arrow is pressed.... glutReshapeWindow(500, 500); // go into a 500 by 500 window break; default: break; } } // create main function for bringing it all together int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); glutInitWindowSize(500, 500); glutCreateWindow("NeHe's OpenGL Framework"); // glutFullScreen(); initGL(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutSpecialFunc(arrow_keys); glutIdleFunc(display); glutMainLoop(); return 0; }
Mac 终端运行:
$: clang -o lession lession5.c -Wno-deprecated -framework OpenGL -framework GLUT
$: ./lession
时间: 2024-10-12 03:33:25