2007/09/29
Reporte Practica 6
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.
Archivos de texto:
texto.txt
archivo.txt
void leeArchivo (void){
FILE *f;
char c;
int i=1, a=0, b=0, d=0;
if (variable.tempo == 3)
f=fopen("texto.txt","r");
else
f=fopen("archivo.txt","r");
c=fgetc(f);
variable.temporal[0] = c;
while (c!=EOF){
c=fgetc(f);
variable.temporal[i] = c;
i++;
}
fclose(f);
variable.temporal[i-1] = '\0';
for (a=0;a<=19;a++)
for (b=0;b<=19;b++){
variable.buffer[a][b]=variable.temporal[d];
d++;
}
}
void imprimeCadenaStroke(float x, float y, float z, char *string) {
char *c;
glTranslatef( x, y, z);
for (c=string; *c != '\0'; c++) {
glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN, *c);
}
}
glPushMatrix();
glRotatef(variable.reduce, 1,0,0);
glPushMatrix();
glColor3f( 0.0f, 1.0f, 0.0f);
glScalef ( 0.70f, 0.70f, 0.70f);
variable.tempo = 3;
leeArchivo();
glTranslatef( -1050, variable.transladatexto, 0.0);
glPushMatrix();
for (i=0;i<13;i++){
imprimeCadenaStroke ( 0, 0, 0,variable.buffer[i]);
glScalef ( variable.reduce, variable.reduce, 1.0);
glTranslatef(-2095,120,0);
glScalef ( variable.reduce, variable.reduce, 1.0);
}
glPopMatrix();
glPopMatrix();
glPopMatrix();
break;
2.- Escriba un programa que, dada una cadena de entrada, dibuje en forma desordenada los caracteres en la
ventana y los vaya trasladando y ordenando hasta mostrar la cadena correcta.
2007/09/26
Tareas 4 y 5
En OpenGL: dibujar un robot, usando modelado jerárquico. El dibujo deberá ser similar al siguiente:
Tarea 5Animar el robot que diseñaron en la tarea 4. Como sugerencias: Puede saludar a la cámara, caminar, bailar, dar marometas, responder a eventos como clicks, sentarse, etc.
El código es demaciado grande y lo subi a las direcciones:
http://wyrven.iespana.es/099036568.cpp y
http://wyrven.iespana.es/objetos.h
2007/09/24
Previo Practica 6
Utilizando la función glutbitmapCharacter podemos pintar texto bidimencional en un ambiente tridimencionar que no podemos rotar o escalar, no tiene grosor y siempre estara orientado hacia el observador, esto presenta ciertas desventajas pero por otro lado no nos tenemos que preocupar por reorientar el texto cuando hacemos alguna transformación.
Utilizando la función glutStrokeCharacter podemos pintar texto que puede ser rotado, escalado o transladado.
¿Cambia el dibujo de texto en FreeGLUT y OpenGLUT? ¿Por qué?
Si, cambia pues OpenGLUT hereda un pequeño número de fuentes estándar de FreeGLUT y GLUT.
2.- Cómo funcionan y cuántos son los parametros de los comandos:
glutBitmapCharacter();
void glutBitmapCharacter(void *font, int character)
Parametros:
font - El nombre del font a usar
GLUT_BITMAP_8_BY_13
GLUT_BITMAP_9_BY_15
GLUT_BITMAP_TIMES_ROMAN_10
GLUT_BITMAP_TIMES_ROMAN_24
GLUT_BITMAP_HELVETICA_10
GLUT_BITMAP_HELVETICA_12
GLUT_BITMAP_HELVETICA_18
character - ASCII a imprimir (va entre comillas simples por ser un entero)
glutStrokeCharacter();
void glutStrokeCharacter(void *font, int character)
Parametros:
font - El nombre del font a usar
GLUT_STROKE_ROMAN
GLUT_STROKE_MONO_ROMAN
character - ASCII a imprimir (va entre comillas simples por ser un entero)
¿En que se diferencian?
stroke puede rotar, escalar o transladar el texto y bitmap no.
3.- Escriba un programa que dibuje su nombre y numero de cuenta en la pantalla.
imprimeCadenaBitmap (-95,0,0,"Alberto Bobadilla");
glColor3f( 0.0f, 1.0f, 0.0f);
glScalef( 0.15f, 0.15f, 0.15f);
imprimeCadenaStroke (0,0,0,"99036568");
void imprimeCadenaBitmap(float x, float y, float z, char *string) {
char *c;
glRasterPos3f( x, y, z);
for (c=string; *c != '\0'; c++) {
glutBitmapCharacter(GLUT_BITMAP_9_BY_15, *c);
}
}
void imprimeCadenaStroke(float x, float y, float z, char *string) {
char *c;
glRasterPos3f( x, y, z);
for (c=string; *c != '\0'; c++) {
glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN, *c);
}
}
Reporte Practica 5
Es el tipo de diseño que recibe entradas desde diferentes dispositivos provocando sucesos en el codigo.
2.- ¿Qué utilidad tiene el manejo de eventos en el desarrollo de aplicaciones gráficas?
Un ejemplo claro puede ser la programación de juegos de video en donde los eventos generan ciertas situaciones sobre los graficos para denotar un suceso en el programa.
3.- Escriba un programa en el cual:
- Al hacer click en la ventana se toman las coordenadas del mouse y se dibuja un punto.
- Cada dos puntos acumulados se dibuja una linea.
- Cada tres puntos acumulados se dubuja un triángulo.
- Cada cuatro puntos acumulados dibuja un cuadrilatero.
- Cada 5 o más puntos acumulados, dibuja un poligono.
- El botón izquierdo del mouse limpia la ventana.
OJO: checar la funcion glViewport para ajustar escalas dentro de la ventana.
2007/09/18
Previo Practica 5
1.- Escriba una aplicacion que usando la libreria GLUT detecte que se ha realizado un click con el botón derecho del mouse sobre la ventana principal e imprima las coordenadas del mouse con la salida estándar.
-Cuando se haga click con el boton izquierdo, cierre la aplicación.
Nota: Usar glutMouseFunc();
void mouse (int button, int state, int x, int y){
switch (button){ //Left Button Clicked
case GLUT_LEFT_BUTTON:
switch (state){
case GLUT_DOWN: //Pressed
exit(0);
break;
}
break;
case GLUT_RIGHT_BUTTON:// Right Button Clicked
switch (state){
case GLUT_DOWN: // Pressed
printf ("Mouse Right Button Pressed on (%d,%d)(Down)...\n",x,y);
break;
case GLUT_UP: // Released
printf ("Mouse Left Button Released on (%d,%d)(Up)...\n",x,y);
break;
}
break;
}
glutPostRedisplay ();
}
2.- Escriba una aplicación que cada 5 segundos abra una nueva ventana y como titulo le
ponga el tiempo en el que se creó.
-Al apretar el botón izquierdo del mouse, para el contador.
-Al apretar el botón derecho reinicia el contador.
-Al apretar la tecla "ESC" cierra la aplicación.
#include
#include
#include
#include
#include
struct practicas{
int ancho, alto, x, y, PrevX, PrevY, ventana;
time_t comienzo, final;
char buffer[10];
float cont;
signed int bandera, RMB;
}variable;
void inicializa (void){
variable.ancho = 500;
variable.alto = 500;
variable.x=100;
variable.y=100;
variable.bandera=0;
variable.RMB=0;
variable.ventana=1;
}
void display(void){
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glFlush();
}
void reshape (int ancho, int alto){
if(ancho==0)
ancho=1;
glViewport(0, (GLsizei) 0, (GLsizei) ancho, (GLsizei) alto);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(float)(ancho/((alto==0)?1:alto)),0.01f,500.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void mouse (int button, int state, int x, int y){
variable.PrevX = x;
variable.PrevY = y;
switch (button){ //Left Button Clicked
case GLUT_LEFT_BUTTON:
switch (state){
case GLUT_DOWN: //Pressed
variable.bandera = 0;
break;
}
break;
case GLUT_MIDDLE_BUTTON:// Middle Button clicked
switch (state){
case GLUT_DOWN:// Pressed
exit(0);
break;
}
break;
case GLUT_RIGHT_BUTTON:// Right Button Clicked
switch (state){
case GLUT_DOWN: // Pressed
variable.bandera = 0;
variable.comienzo = time( NULL );
break;
}
break;
}
glutPostRedisplay ();
}
void TimerFunction(int valor){
if(variable.ventana<=10 && variable.bandera == 0){
variable.x=variable.x+50;
variable.y=variable.y+50;
glutInitWindowPosition(variable.x,variable.y);
variable.final = time( NULL );
variable.cont=difftime(variable.final, variable.comienzo);
printf( "Segundos desde el comienzo del programa: %f s\n", variable.cont);
sprintf(variable.buffer,"%.1f s\0",variable.cont);
glutCreateWindow(variable.buffer);
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMouseFunc (mouse);
variable.ventana++;
}
glutPostRedisplay();
glutTimerFunc(5000,TimerFunction, 1);
}
int main(int argc, char **argv){
inicializa();
variable.comienzo = time( NULL );
printf( "Segundos desde el comienzo del programa: %f s\n", variable.cont);
sprintf(variable.buffer,"%.1f s\0",variable.cont);
glutInit (&argc, argv);
glutInitDisplayMode (GLUT_RGB);
glutInitWindowSize (variable.ancho, variable.alto);
glutInitWindowPosition (variable.x,variable.y);
glutCreateWindow (variable.buffer);
glutDisplayFunc (display);
glutReshapeFunc (reshape);
glutMouseFunc (mouse);
glutTimerFunc(5000, TimerFunction, 99036568);
glutMainLoop();
return 0;
}
Nota: Usar glutTimeFunc, glutMouseFunc y glutKeyboardFunc
3.- ¿Que comandos para manejo de eventos nos proporciona GLUT?
Describa cada uno de éstos.
glut________func();
glutKeyboardfunc()ñ
Maneja entradas de eventos desde teclado correspondientes al teclado normal y caracteres en el codico ASCII
glutSpecialfunc();
Maneja entradas de eventos desde teclado para caracteres especiales como las teclas de función flechas direccionales etc
glutMousefunc()ñ
Maneja entradas de eventos desde el raton para 3 botones.
2007/09/15
Reporte Practica 4
1.- Describa las ventajas de construir de manera jerárquica escenas
Las ventajas que presenta el construir una escena de forma Jerárquica es que podemos modificar parte del escenario sin tener necesidad de escribir nuevo código para nuevos elementos. Simplemente se aplican nuevas transformaciones a elementos anteriores de manera que se reutiliza código.
2.- Escriba un programa que construya de manera jerárquica una escena en la que:
- Hayan 3 humanoides:
- 1 alto y flaco
- 1 normal
- 1 chaparro y regordete
- Cada uno se encuentre en el vértice de un triángulo equilátero coplanar con el plano XY
- En el centro del triángulo se encuentre un prisma de base cuadrada
- En la cima del prisma se encuentre "Cthulhu" (esfera con 8 brazos amorfos, con puntas en tenaza...)
void Rlyeh (void){
glPushMatrix();
//----Piso----//
glPushMatrix();
glColor3f( 0.0f, 0.0f, 1.0f);
glTranslatef( 0.0f,-10.0f, 0.0f);
glScalef ( 300.0f, 5.0f, 300.0f);
cubo();
glPopMatrix();
glPushMatrix();
glColor3f( 0.0f, 0.0f, 0.7f);
glTranslatef( 0.0f,-5.0f, 0.0f);
glScalef ( 280.0f, 4.0f, 280.0f);
cubo();
glPopMatrix();
//----Altar----//
glPushMatrix();
glColor3f( 1.0f, 1.0f, 1.0f);
glTranslatef( 0.0f, 25.0f, 0.0f);
glScalef ( 50.0f, 50.0f, 50.0f);
cubo3();
glPopMatrix();
//----Cthulhu----//
glPushMatrix();
glTranslatef( 1.0f, 110.0f, 1.0f);
glScalef ( 8.0f, 8.0f, 8.0f);
Cthulhu();
glPopMatrix();
//----Humanoide Alto----//
glPushMatrix();
glColor3f( variable.cr, variable.cg, variable.cb);
glRotatef(-45.0f, 0.0f, 1.0f, 0.0f);
glTranslatef( 0.0f, 50.0f,-80.0f);
glScalef ( 3.0f, 8.0f, 3.0f);
variable.ropa = 1;
hume(variable.c_piel[0], variable.c_piel[1], variable.c_piel[2], 3, variable.ropa, variable.m_arm, variable.m_finger);
glPopMatrix();
//----Humanoide Chaparro----//
glPushMatrix();
glColor3f( variable.cr, variable.cg, variable.cb);
glRotatef( 45.0f, 0.0f, 1.0f, 0.0f);
glTranslatef( 0.0f, 21.0f,-80.0f);
glScalef ( 5.0f, 3.0f, 5.0f);
hume(variable.c_piel[0], variable.c_piel[1], variable.c_piel[2], 2, variable.ropa, variable.m_arm, variable.m_finger);
glPopMatrix();
//----Humanoide Normal----//
glPushMatrix();
glRotatef( 180.0f, 0.0f, 1.0f, 0.0f);
glColor3f( variable.cr, variable.cg, variable.cb);
glTranslatef( 0.0f, 35.0f, -75.0f);
glScalef ( 5.0f, 5.0f, 5.0f);
hume(variable.c_piel[0], variable.c_piel[1], variable.c_piel[2], variable.cabeza, variable.ropa, variable.m_arm,variable.m_finger);
glPopMatrix();
glPopMatrix();
}
2007/09/11
Previo 4
Previo 4.- Escenas y manejo de eventos
1. ¿Qué es una escena?
Es el conjunto de luces, cámaras, atributos y modelos asociados a un ambiente 3D.
2. ¿Cómo podemos definir cada escena jerárquicamente?
Es necesario ordenar los elementos de manera lógica por medio de la técnica grafo de escena. Se define la relación que existe entre varios objetos y se emplean transformaciones en común.
3. Describa el funcionamiento y parámetros de las siguientes funciones:
void glutSwapBuffers(void);
Los comandos son asignados al buffer secundario hasta que llamamos a esta función para que glut tome el contenido de dicho buffer lo pase al primario para dibujar.
void glutKeyboardFunc(void (*func)(unsigned char key, int x, int y));
Funcion que maneja los eventos del teclado para ASCII, sinembargo no toma los caracteres especiales.
void glutIdleFunc(void (*func)(void));
Esta function se llama automaticamente cuando detecta que el procesador no esta trabajando para hacer tareas en segundo plano.
4. ¿Qué es un double buffer? ¿Para que sirve?
Al tenerte una memoria secundaria de nuestra escena evitamos perdida en el refresco de pantalla. De esto se encarga el doublé buffer, en tener una copia de nuestra escena completa.
5. ¿Qué es una función callback (llamada a función)?
Es una función que se llama a si misma reiteradamente cuando detecta una entrada o la mandamos llamar para esperar un evento.
6. Escriba código que detecte un evento
void mouse (int button, int state, int x, int y){
switch (button){ //Left Button Clicked
case GLUT_LEFT_BUTTON:
switch (state){
case GLUT_DOWN: //Pressed
Ang=Ang+5;
mx=0;
my=1;
mz=0;
break;
case GLUT_UP:// Released
Ang=Ang+5;
mx=0;
my=1;
mz=0;
break;
}
break;
case GLUT_MIDDLE_BUTTON:// Middle Button clicked
switch (state){
case GLUT_DOWN:// Pressed
printf ("Mouse Middle Button Pressed (Down)...\n");
break;
case GLUT_UP:// Released
printf ("Mouse Middle Button Released (Up)...\n");
break;
}
break;
case GLUT_RIGHT_BUTTON:// Right Button Clicked
switch (state){
case GLUT_DOWN: // Pressed
Ang=Ang-5;
mx=0;
my=1;
mz=0;
break;
case GLUT_UP: // Released
Ang=Ang-5;
mx=0;
my=1;
mz=0;
break;
}
break;
}
glutPostRedisplay ();
}
void keyboard(unsigned char key, int x, int y){
switch (key) {
case 27:
exit(0);
break;
case 88:
case 120:
Ang=Ang+15;
mx=1;
my=0;
mz=0;
break;
case 89:
case 121:
Ang=Ang+15;
mx=0;
my=1;
mz=0;
break;
case 90:
case 122:
Ang=Ang+15;
mx=0;
my=0;
mz=1;
break;
case 66:
case 98:
cr=0;
cg=0;
cb=255;
bandera=1;
break;
case 71:
case 103:
cr=0;
cg=255;
cb=0;
bandera=1;
break;
case 82:
case 114:
cr=255;
cg=0;
cb=0;
bandera=1;
break;
case 48:
pinta=0;
break;
case 49:
pinta=1;
break;
case 50:
pinta=2;
break;
case 51:
pinta=3;
break;
case 52:
pinta=4;
break;
case 53:
pinta=5;
break;
case 54:
pinta=6;
break;
case 55:
pinta=7;
break;
case 56:
pinta=8;
break;
case 57:
pinta=9;
break;
}
glutPostRedisplay ();
}
Reporte practica 3
//Escriba el código para dibujar una mano.
void finger (float c_pielR,float c_pielG,float c_pielB,float m_finger){
glPushMatrix();
glPushMatrix();
glColor3f(c_pielR, c_pielG+0.03f, c_pielB+0.03f);
glScalef( 1.0f, 2.0f, 1.0f);
cubo();
glPopMatrix();
glTranslatef( 0.0f, 1.5f, 0.0f);
glRotatef ( (GLfloat) m_finger, -1.0f, 0.0f, 0.0f);
glTranslatef( 0.0f, 0.5f, 0.0f);
glPushMatrix();
glColor3f(c_pielR, c_pielG+0.08f, c_pielB+0.08f);
glScalef ( 1.0f, 2.0f, 1.0f);
cubo();
glPopMatrix();
glPushMatrix();
glTranslatef( 0.0f, 0.5f, 0.0f);
glRotatef ( (GLfloat) m_finger, -1.0f, 0.0f, 0.0f);
glTranslatef( 0.0f, 1.5f, 0.0f);
glColor3f(c_pielR, c_pielG+0.1f, c_pielB+0.1f);
glScalef ( 1.0f, 2.0f, 1.0f);
cubo();
glPopMatrix();
glPopMatrix();
}
void hand (float c_pielR,float c_pielG,float c_pielB,float m_finger){
glPushMatrix();
glPushMatrix();// Palma
glPushMatrix();
glColor3f(c_pielR, c_pielG-0.02f, c_pielB-0.02f);
glTranslatef( 0.0f, 3.5f, 0.0f);
glScalef ( 4.0f, 5.0f, 1.0f);
cubo();
glPopMatrix();
glPushMatrix();
glColor3f(c_pielR, c_pielG-0.02f, c_pielB-0.02f);
glTranslatef( 0.0f, 0.5f, 0.0f);
glScalef ( 2.0f, 1.0f, 1.0f);
cubo();
glPopMatrix();
glPopMatrix();
glPushMatrix();// Dedo Indice
glTranslatef(-1.5f, 6.5f, 0.0f);
glRotatef( m_finger,-1.0f, 0.0f, 0.0f);
glTranslatef( 0.0f, 0.5f, 0.0f);
glScalef ( 0.7f, 1.0f, 0.7f);
finger(c_pielR, c_pielG, c_pielB, m_finger);
glPopMatrix();
glPushMatrix();// Dedo Medio
glTranslatef(-0.5f, 6.5f,-0.05f);
glRotatef( m_finger * variable.obsena,-1.0f, 0.0f, 0.0f);
glTranslatef( 0.0f, 0.5f, 0.0f);
glScalef ( 0.7f, 1.2f, 0.7f);
finger( c_pielR, c_pielG, c_pielB, m_finger * variable.obsena);
glPopMatrix();
glPushMatrix();// Dedo Anular
glTranslatef( 0.5f, 6.5f, 0.0f);
glRotatef( m_finger,-1.0f, 0.0f, 0.0f);
glTranslatef( 0.0f, 0.5f, 0.0f);
glScalef ( 0.7f, 1.0f, 0.7f);
finger( c_pielR, c_pielG, c_pielB, m_finger);
glPopMatrix();
glPushMatrix();// Dedo Menique
glTranslatef( 1.5f, 6.2f, 0.05f);
glRotatef( m_finger,-1.0f, 0.0f, 0.0f);
glTranslatef( 0.0f, 0.5f, 0.0f);
glScalef ( 0.7f, 0.7f, 0.7f);
finger( c_pielR, c_pielG, c_pielB, m_finger);
glPopMatrix();
glPushMatrix();// Dedo Pulgar
glTranslatef(-2.0f, 3.5f, 0.0f);
glRotatef( 45.0f,0.0f, 0.0f, 1.0f);
glScalef ( 1.0f, 0.4f, 1.0f);
finger(c_pielR, c_pielG, c_pielB, m_finger);
glPopMatrix();
glPopMatrix();
}

