viernes, 12 de octubre de 2007

Reporte Practica 6 (LABORATORIO)

1.- Escriba un programa que lea un archivo de texto plano (.txt) y lo transforme a caracteres dibujados (stroke) y dibuje dicho texto en pantalla. -El texto se debe mostrar con un efecto de deslizamiento (scroll) de abajo hacia arriba (Estilo entrada de Star Wars). Usar el callback glutIdleFunc, glutSwapBuffers y el parámetro GLUT_DOUBLE. Explique cómo y dónde se usan estas funciones y constante.

glutIdleFunc se utiliza en el main, recibe como parámetro la función display (), lo que nos indica que cada vez que haya inactividad se estará llamando a la función display. Esto nos sirve para que el scroll del texto sea constante y no tener que accionarlo con algún evento en particular

GLUT_DOUBLE es un parametro que recibe el glutInitDisplayMode. Nos sirve apra tener un buffer doble quepermite que se actualicen más rápido lso frames que se mostrarán en pantalla

glutSwapBuffers se utiliza al final de la función display (), es necesario poner esta sentencia ya que estamos usando buffer doble.

código

#include
#include


char cadena[250];

char c;
int posicion;
float y;



void output3(float x, float y, char *text) //funcion para dibujar el texto
{
char *p;

glPushMatrix();
glTranslatef(x, y, 0);
glScalef(0.001, 0.004, 0.004);
for (p = text; *p; p++)
glutStrokeCharacter(GLUT_STROKE_ROMAN, *p);
glPopMatrix();
}




void display()
{

glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0, 0.0, 1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(35.0, 1.0, 0.2, 150.0); //perspectiva



glPushMatrix();

glTranslatef(1, 0, -4);
glRotatef(-60, 1, 0, 0);
glTranslatef(0,y,0); //y es el desplazamiento

//se dibuja al texto alamacenado en el archivo
output3(-2.5, -0.6, cadena);

glPopMatrix();


glFlush();
glutSwapBuffers();

y=y+0.003; //se incrementa el desplazamiento, para dar el efecto de que se aleja el texto


}



void reshape(int w, int h)
{

glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glScalef(1,-1,1);

glMatrixMode(GL_MODELVIEW);

}



void init() //cada vez que se inicia el programa se lee el archivo de texto
{

FILE *archivo=fopen("archivo.txt", "rw");


while((c=getc(archivo))!=EOF) //todo lo que lee lo gaurda en "cadena"
{
cadena[posicion]=c;
posicion++;
}

fclose(archivo);
}



int main(int argc, char **argv)
{

int i, msg_submenu, color_submenu;

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(800, 600);
glutInitWindowPosition (50, 100);
init();
glutCreateWindow("Reporte 6 Ximena");
glClearColor(0.0, 0.0, 0.0, 1.0);
glutIdleFunc(display);
glutDisplayFunc(display);
glutReshapeFunc(reshape);



glutMainLoop();

return 0;
}


No hay comentarios: