// lession4.c #include <OpenGL/OpenGL.h> #include <GLUT/GLUT.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> /* ASCII code for teh escape key. */ #define ESCAPE 27 /* The number of our GLUT window */ int window; /* rotation angle for the triangle. */ float rtri = 0.0f; /* rotation angle for the quadrilateral. */ float rquad = 0.0f; /* A general OpenGL initialization function. Sets all of the initial parameters. */ // We call this right after our OpoenGL window is created. void initGL(int width, int height) { // This will clear The background color to black. glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1.0); // Enables clearing of the depth buffer glDepthFunc(GL_LESS); // The type of test to do. glEnable(GL_DEPTH_TEST); // Enables depth testing. glShadeModel(GL_SMOOTH); // Enalbes smooth color shading. glMatrixMode(GL_PROJECTION); glLoadIdentity(); // Reset the projection matrix. // calculate the aspect ratio of the window. gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f); glMatrixMode(GL_MODELVIEW); } /* The function called when our window is resized (which shouldn't happend, because we're fullscreen) */ void resizeGLScene(int width, int height) { if (height == 0) // Prevent a divide by zero if the window is too small. height = 1; glViewport(0, 0, width, height); // Reset the current viewport and perspective transformation glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f); glMatrixMode(GL_MODELVIEW); } /* The main drawing function. */ void drawGLScene() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear the screen and the depth buffer glLoadIdentity(); // Reset the view. 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); // Rotate the triangle on the y axis // Draw a triangel (in smooth coloring mode) glBegin(GL_POLYGON); // Start drawing a polygon glColor3f(1.0f, 0.0f, 0.0f); // set the color to red glVertex3f(0.0f, 1.0f, 0.0f); // top glColor3f(0.0f, 1.0f, 0.0f); // set the color to green. glVertex3f(1.0f, -1.0f, 0.0f); // bottom right glColor3f(0.0f, 0.0f, 1.0f); // set the color to blue. glVertex3f(-1.0f, -1.0f, 0.0f); // bottom left. glEnd(); // we're done with the polygon (smooth color interpolation) glLoadIdentity(); // make sure we're no longer rotated. glTranslatef(1.5f, 0.0f, -6.0f); // Move Right 3 Units, and back into the screen 6.0 glRotatef(rquad, 1.0f, 0.0f, 0.0f); // Roate the quad on the x axis // Draw a square (quadrilateral) glColor3f(0.5f, 0.5f, 1.0f); // set color to a blue shade. glBegin(GL_QUADS); // Start drawing a polygon (4 sides); glVertex3f(-1.0f, 1.0f, 0.0f); // top left. glVertex3f( 1.0f, 1.0f, 0.0f); // top right. glVertex3f( 1.0f, -1.0f, 0.0f); // bottom right. glVertex3f(-1.0f, -1.0f, 0.0f); // bottom left. glEnd(); // done with the polygon. rtri += 15.0f; // Increase the rotation variable for the triangle rquad -= 15.0f; // decrease the rotation variable for the quad. // swap the buffers to display, since double buffering in used. glutSwapBuffers(); } /* The function called whenever a key is pressed. */ void keyPressed(unsigned char key, int x, int y) { /* sleep to avoid thrashing this procedure */ usleep(100); /* If escape is pressed, kill everything. */ if (key == ESCAPE) { /*shut down our window */ glutDestroyWindow(window); /* exit the program...normal termination. */ exit(0); } } int main(int argc, char **argv) { glutInit(&argc, argv); /* Select type of display mode: Double buffer RGBA color Alpha components supported Depth buffer */ glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH); /* Get a 640 x 480 window */ glutInitWindowSize(640, 480); /* the window starts at teh upper left corner of the screen */ glutInitWindowSize(0, 0); /* Openg a window */ window = glutCreateWindow("Jeff Molofee's GL Code Tutorial ... NeHe '99"); /* Register the function to do all our OpenGL drawing. */ glutDisplayFunc(&drawGLScene); /* Go full screen. This is as soon as possible. */ // glutFullScreen(); /* Even if there are not events, redarw our gl scene. */ glutIdleFunc(&drawGLScene); /* register the function called when our window is resized. */ glutReshapeFunc(&resizeGLScene); /* Register the function claled when teh keyboard is pressed. */ glutKeyboardFunc(&keyPressed); /* Initialize our window. */ initGL(640, 480); /* start event processing engine. */ glutMainLoop(); return 1; }
主要介绍了旋转
塞塞塞