// CUADRO GIRANDO #include <GL/glut.h> //#include <stdlib.h> static GLfloat Giro = 0.0; // VARIABLE PARA ALMACENAR EL GIRO void init(void) { glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT); // CAMBIAMOS LA OPCION POR DEFECTO LA TECNICA DE SOMBREADO // DEFECTO: GL_SMOOTH (asigna diferentes colores a cada pixel) // GL_FLAT: (selecciona el color de uno de los vErtices y se lo asigna al resto) } void display(void) { glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); glRotatef(Giro, 0.0, 0.0, 1.0); // (Angulo, x, y, z) glColor3f(1.0, 1.0, 0.0); glRectf(-25.0, -25.0, 25.0, 25.0); // (x1, y1, x2, y2) glPopMatrix(); glutSwapBuffers(); // CAMBIAMOS EL BUFFER OCULTO POR EL ACTIVO } void Giro_Display(void) { Giro = Giro + 2.0; if (Giro > 360) Giro = Giro - 360.0; glutPostRedisplay(); // HACE QUE TRAS LA ACTUALIZACION SE DIBUJE EL SIGUIENTE FRAME } void reshape(int w, int h) { glViewport (0, 0, (GLsizei) w, (GLsizei) h); // (x, y, ancho, alto) glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0); // (-x, x, -y, y, -z, z) glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void mouse(int button, int state, int x, int y) { switch (button) { case GLUT_LEFT_BUTTON: if (state == GLUT_DOWN) glutIdleFunc(Giro_Display); // REGISTRAR FUNCION Callback break; case GLUT_MIDDLE_BUTTON: if (state == GLUT_DOWN) glutIdleFunc(NULL); break; default: break; } } // SE REQUIERE EL DESPLIEGUE DE DOBLE BUFFER // SE UTILIZA LOS EVENTOS DEL RATON int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); // INDICAMOS QUE SE VA A UTILIZAR EL DOBLE BUFFER EN LUGAR DE GLUT_SINGLE glutInitWindowSize (300, 300); glutInitWindowPosition (100, 100); glutCreateWindow (argv[0]); init (); glutDisplayFunc(display); // REGISTRAR FUNCION Callback glutReshapeFunc(reshape); glutMouseFunc(mouse); glutMainLoop(); return 0; }