Animacion_2.c



// 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();
}