// TRIANGULO MOVIL EN EL PLANO CARTESIANO /* USO DE: ANIMACION (ROTAR, ESCALAR Y TRASLADAR) */ /* INICIA Y TERMINA CON EL DOBLE DE SUS DIMENSIONES AVANZA UNA UNIDAD DE DIBUJO POR SEGUNDO CON DIMENSION=1 AL PASAR POR (0,0,0) HACE UN GIRO DE 360 GRADOS */ #include <GL/glut.h> #include <unistd.h> float Px, Py, FS, ANG, Time; // (Px, Py)posiciOn (FS)factor de escala (ANG)RotaciOn (Time)Retardo int DIRECCION, Normal; // izquierda(0) o derecha(1) (Normal)Comportamiento -0 ó 1- 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(); } 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); Px = -5; Py = 0; FS = 2; ANG = (float)10.0; DIRECCION = 1; Time = (float)800000; Normal = 1; glMatrixMode(GL_MODELVIEW); gluLookAt(-1,-1,1, 2,2,-1, 0,0,1); //gluLookAt(1,1,-1, 0,0,-1, 0,1,0); } void Dibuja(void) { glClear(GL_COLOR_BUFFER_BIT); PintaEjes( ); Gradua( ); //glTranslatef(Px, 0.0f, 0.0f); if (Px == -5 || Px == 5) { glPushMatrix(); glScalef(1.0f, 2.0f, 2.0f); } if (Px == 0 ) { glPushMatrix(); glRotatef(ANG, 0.0f, 0.0f, 1.0f); Time = (float)10000; } glBegin(GL_TRIANGLES); glColor3f(1.0f, 1.0f, 0.0f); glVertex3f(Px, 0.0f, 0.0f); glVertex3f(Px+0.3f, 0.0f, 0.5f); glVertex3f(Px-0.3f, 0.0f, 0.5f); glEnd(); glFlush(); if ( Px == 0 ) { ANG += 10; glPopMatrix(); Normal = 0; } if ( ANG == 360 ) { glPopMatrix(); ANG = (float)10.0; Normal = 1; Time = (float)800000; } if (Px == -5 || Px == 5) glPopMatrix(); if( Normal && DIRECCION) { Px += 1; if(Px==6) { Px=5; DIRECCION=0; } } if( Normal && !DIRECCION) { Px -= 1; if(Px==-6) { Px=-5; DIRECCION=1; } } } void Tiempo(void) { // sleep( Time ); // SEGUNDOS usleep( Time ); // MICRO SEGUNDOS glutPostRedisplay(); } void TeclasFuncion(int Tecla, int x, int y) { int EjeX=0, EjeY=0; switch (Tecla) { case GLUT_KEY_UP: EjeX--; break; case GLUT_KEY_DOWN: EjeX++; break; case GLUT_KEY_RIGHT: EjeY++; break; case GLUT_KEY_LEFT: EjeY--; break; } glutPostRedisplay(); } static void Tecla(unsigned char key, int x, int y) { switch (key) { case 27: exit(0); break; } 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 glutMainLoop(); }