#include <stdio.h> #include <GL/glut.h> #include <unistd.h> float Ang_rot, Px, Py, Pz, IncX, IncY, IncZ, Time; // (Px, Py, Pz)PosiciOn (IncX, IncY, IncZ)Incremento (Time)Retardo int X, Y, Z, Rotar, Inicio; // Eje en turno (1)Activo (0)Inactivo void PintaEjes() { glBegin(GL_LINES); glColor3f(1,0,0); glVertex3f(-5, 0, 0); glVertex3f(5, 0, 0); // X glColor3f(0,1,0); glVertex3f(0, -5, 0); glVertex3f(0, 5, 0); // Y glColor3f(0,0,1); glVertex3f(0, 0, -5); glVertex3f(0, 0, 5); // Z glEnd(); glPushMatrix(); glColor3f(1,0,0); glTranslatef(5.0f, 0.0f, 0.0f); glutWireSphere(0.20, 20, 20); glPopMatrix(); glPushMatrix(); glColor3f(0,1,0); glTranslatef(0.0f, 5.0f, 0.0f); glutWireSphere(0.20, 20, 20); glPopMatrix(); glPushMatrix(); glColor3f(0,0,1); glTranslatef(0.0f, 0.0f, 5.0f); glutWireSphere(0.20, 20, 20); glPopMatrix(); } void Gradua ( ) { int k=0, x1,y1,x2,y2; glBegin(GL_LINES); glColor3f(1,0,0); for(k=1; k<10; k++) { glVertex3f(-5+k, 0.2, 0); glVertex3f(-5+k, -0.2, 0); } glColor3f(0,1,0); for(k=1; k<10; k++) { glVertex3f(0.2, -5+k, 0); glVertex3f(-0.2, -5+k, 0); } glColor3f(0,1,0); for(k=1; k<10; k++) { glVertex3f(0.2, 0, -5+k); glVertex3f(-0.2, 0, -5+k); } glEnd(); } int Inicializa() { glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-8.0,8.0, -8.0,8.0, -7.0,7.0); Inicio = 1; Px = Py = Pz = 0; IncX = IncY = IncZ = 0; Time = (float)800000; Rotar = Ang_rot = X = Y = Z = 0; glMatrixMode(GL_MODELVIEW); gluLookAt(-1,-1,1, 2,2,-1, 0,0,1); return 1; } void Reset( ) { Px = Py = Pz = 0; IncX = IncY = IncZ = 0; X = Y = Z = 0; } void Dibuja(void) { glClear(GL_COLOR_BUFFER_BIT); PintaEjes( ); Gradua( ); //glRotatef(45, 0.0f, 1.0f, 0.0f); if ( Rotar ) { glPushMatrix(); glRotatef(Ang_rot, 0.0f, 0.0f, 1.0f); printf("ROTAR= %d\tANGULO= %f\n", Rotar, Ang_rot); } glBegin(GL_TRIANGLES); glColor3f(1.0f, 1.0f, 0.0f); glVertex3f(Px, 0.0f, 0.0f); glVertex3f(Px+0.3f, Py, Pz+0.5f); glVertex3f(Px-0.3f, Py, Pz+0.5f); glEnd(); glFlush(); if ( Rotar && !Inicio ) { Ang_rot += 15; glPopMatrix(); if (Ang_rot > 360) { Rotar=0; Ang_rot=0; } } else { Px += IncX; Py += IncY; Pz += IncZ; if ( X && Px == 5 ) IncX = -1; if ( X && Px == -5 ) IncX = 1; if ( X && Px == 0 ) Reset(); if ( Y && Py == 5 ) IncY = -1; if ( Y && Py == -5 ) IncY = 1; if ( Y && Py == 0 ) Reset(); if ( Z && Pz == 5 ) IncZ = -1; if ( Z && Pz == -5 ) IncZ = 1; if ( Z && Pz == 0 ) Reset(); if ( !Px && !Py && !Pz && !Inicio) Rotar = 1; printf("ROTAR= %d\t Px=%f\t Py=%f\n", Rotar, Px, Py); } } void Tiempo(void) { // sleep( Time ); // SEGUNDOS usleep( Time ); // MICRO SEGUNDOS glutPostRedisplay(); } void TeclasFuncion(int Tecla, int x, int y) { switch (Tecla) { case GLUT_KEY_UP: { Reset(); Y = 1; IncY = 1; break; } case GLUT_KEY_DOWN: { Reset(); Y = 1; IncY = -1; break; } case GLUT_KEY_RIGHT: { Reset(); X = 1; IncX = 1; break; } case GLUT_KEY_LEFT: { Reset(); X = 1; IncX = -1; break; } } glutPostRedisplay(); } static void Tecla(unsigned char key, int x, int y) { switch (key) { case 27: exit(0); break; } glutPostRedisplay(); } static void Raton(int Boton, int Estado, int x, int y) { switch ( Boton ) { case GLUT_RIGHT_BUTTON: { Reset(); X = 1; IncX = 1; break; } case GLUT_LEFT_BUTTON: { Reset(); Z = 1; IncZ = 1; break; } } if (Inicio) Inicio = 0; glutPostRedisplay(); } int main(int argc, char ** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA); glutInitWindowPosition(700,100); glutInitWindowSize(650,650); glutCreateWindow("USO DE LA CAMARA ... "); Inicializa(); glutDisplayFunc(Dibuja); glutIdleFunc(Tiempo); // MIENTRAS HAGAS NADA glutSpecialFunc(TeclasFuncion); // DETECTA LAS TECLAS DE FUNCION glutKeyboardFunc(Tecla); // DETECTA EL TECLADO glutMouseFunc(Raton); // DETECTA AL RATON glutMainLoop(); }