domingo, 25 de octubre de 2009

Domingo de clásico

Como ya se me ha hecho costumbre, hoy solo dormí 5 malditas horas, sueño que no fue reparador, aunque divertido por que se me apareció en mi inconsciente la mascota de mi madre, jaja. En fin es un clásico domingo donde después de fiestear toda la noche, solo logré dormir un poco, y que creen??, sigo inmensamente cansado, lo cual es clásico por que mi trastorno hace que sufra un poco de fatiga crónica (eso dice mi siquiatra), aunque yo más bien la llamo hueva crónica.
Como me cuesta conciliar el sueño de nuevo, decidí escribir. Los domingos me agradan, son los únicos días que puedo dedicarle tiempo completo a la persona que más adoro (yo), por que los otros días me dedico la mañana con el ejercicio, y el tiempo restante me lo dedico al trabajo, para una empresa que estoy empezando a querer, aunque tenga que como gente normal, y las noches también son mías. Desayuno unas enchiladas hechas por mi santa madre que dice que para la cruda, ¿cuál? le pregunto sarcásticamente, y luego un cafecito acompañado con el motor de mi familia, si, mi mami, charla larga y sincera, me encanta que sea tan directa, luego cada quien a lo suyo.
Ahora veo asesinos por naturaleza, últimamente veo muchas películas violentas y groseras, pero me encantan, me gusta todo lo que no sea "correcto", y me pondré a ver el juego de americano mientras hago tiempo y conspiro contra el mundo, en lo que llega la banda para irnos al estadio azteca para ver el clásico, que mamada, el mundo se cae y yo me voy a ver futbol, pero es mi cruz y lo que me quita el estrés, no hay pedo, para tratar de cambiar el mundo o para hacer ver a la gente que se puede ser mejor tengo toda la semana, como dije los domingos soy egoísta (más) y me vale, quiero ver el fut con mi chelita y todo.
Ya les contaré como nos fue, a las chivitas y a mi. Mientras tanto, tengan bonito día, tarde o noche, depende a que hora lean mi queja por no poder dormir más, soy un quejumbres pero, no culpo a nadie, solo nosotros podemos hacer que cambien las cosas que queremos que cambien.

Nos leemos.

miércoles, 21 de octubre de 2009

Jalón de orejas

Hay momentos en la vida en que uno tiene la capacidad de hacer lo que quiera, pero algo te frena y hace que hagas todo lo que no debes hacer. Ayer me regaño la vida, fue un día atípico, con todo mundo actuando extraño (eso creía yo), lo cierto es que el extraño fue Herson, comencé a darme cuenta de que las cosas que antes me motivaban y que aún siguen provocando curiosidad, ahora no me producen sensación alguna. Quizá sea que trabajo como relojíto, tic tac, tic tac... a la perfección, en automático, hasta que termina la pila. Bien, todo mundo habla de que puedo dar más, que soy capaz, pero, ¿por qué siento que no quiero dar más?, el futuro realmente es incierto, se que lo haré, daré más, solo tengo que quitarme esta pelusa de los engranes, y tal ves marcar la hora en sentido contrario, encontrar de nuevo la emoción, en fin, haré algo que realmente me encanta, cine, hoy por lo menos veré cine, mañana comienzo de nuevo.

NOTA: Olvidarte, trabajar mejor, no faltar al bosque en las mañanas.

martes, 13 de octubre de 2009

Día de contrastes

Ayer fue un día de contrastes, todo en menos de 16 horas. Despierto: mañana soleada, aire fresco. tomo mi ropa deportiva y salgo a correr, lo que estoy tratando de volver a hacer un habito. Mientras voy recorriendo el bosque, veo rostros en los árboles, me olvido de todo y no siento las piernas, la adrenalina hace su chamba. Termina mi rutina y desayuno con una amiga que he conocido apenas hace una semana. Desayuno sano por cierto. Retorno a mi casa y las rodillas comienzan a quejarse, el día sigue fresco y el sol me da en los ojos, sonrío nomas y pienso que debe seguir así. Me alisto para ir al trabajo, no sin antes escuchar rolas mañaneras que me ponen contento.

Estoy en la oficina y el jefe ha dejado un mensaje, "me fui de vacaciones, te quedas a cargo", pavor total, pero estoy listo, aunque el día comienza a nublarse, maldita sea, bueno, hoy soy jefe y me siento bien. Termino mi jornada, bueno la terminé antes, quería sentirme jefe, jaja. Comienzan a juntarse los nubarrones, así como una estela de tristeza se me pega en la sombra, de la nada me siento triste. Chale!!! Tan bien que estaba, llego a casa, me preparo algo de cenar y busco algo en la lectura la distracción, pero aumenta el nivel de tristeza, razón no conocida, no tenía por que estarlo, pero lo estaba. Por si fuera poco el día que conocí horas atrás se había ido y la lluvia comenzó a golpear fuerte mi ventana. Aunque me agrada ver la lluvia y sentir los tintineos rondar, el día no merecía terminar así. Me di un baño, relajante, pero no curo mi sentir, "me rindo, a dormir", todo esto acompañado del mensajero y la platica con una amiga y unas rolas de bunbury, rematando con una dosis de mis agradables pastillitas apendejadoras.

lunes, 12 de octubre de 2009

De nuevo

Este blog, lo abrí originalmente para entregar trabajos escolares, para un profe que nunca vio lo que postee aquí, lo reciclo para escribir y comunicar situaciones que me han ocurrido o que soñé talvéz.

Les doy de nuevo la bienvenida a un pedazo en letras de mi mente ebria de clonazepam, y sinápsis únicas.

martes, 9 de octubre de 2007

Previo 7.

1.¿Que es "shading" (sombreado) en términos de computación gráfica?
OpenGL nos permite elegir entre dos métodos de sombreado, de caras planas y suaves. Para elegir el método de sombreado, usaremos la función glShadeModel con parámetro GL_FLAT para caras planas, y GL_SMOOTH para el suave.
OpenGL, excepto cuando renderiza NURBS y otras funciones gráficas de alto nivel, no genera automáticamente normales, así que tenemos que especificárselas nosotros mismos.
Para especificar la normal actual, basta con hacer una llamada a la función glNormal3f(nx, ny, nz). A partir de ese momento, cualquier vértice que se renderice se supondrá que tiene como normal (nx, ny, nz)
Esta normal es deseable que esté normalizada.
Con el modo de sombreado suave activo, dependiendo de si definimos la misma normal para toda la carao para cada vértice, podemos obtener un sombreado de caras planas o de tipo gouraud. Para obtener un sombreado de tipo gouraud, bastan con definir a cada vértice la normal media de las caras a las que pertenece. Esto es especialmente interesante cuando queremos renderizar superficies curvas, mientras que para renderizar poliedros es más aconsejable asignar una única normal para todos los vértices de una misma cara.

2¿Qué es y cómo se declara y usa en OpenGL/GLUT
-Una fuente de luz?
-Un material?
-Una textura?

TEXTURAS
Cargando texturas en memoria
El proceso de cargar la textura en memoria, no es propio de OpenGL. Se tiene que realizar una función externa. Existen algunas limitaciones que la librería impone. Las dimensiones de todas las texturas que carguen tienen que ser potencias de 2, como por ejemplo 64x64, 128x64, etc.
Se tiene que tener en cuenta que si se debe estar dibujando en RGB, sin color indexado, o bien cargando texturas en formato RGB. Si se carga una imagen GIF, que tiene color indexado, se tiene que programar una función extra para convertirla a RGB.. Sea cuál sea el método, al final se tendrá un puntero a un segmento de memoria que contiene la imagen:
unsigned char *textura;
Es importante también guardar las propiedades de la textura, en concreto sus dimensiones de ancho y alto, así como su profundidad en bits. Si estamos trabajando en RGB, la profundidad será 24bits.
Los pasos a seguir son:
• Determinamos el tamaño
• Calculamos la memoria que será necesaria
• Reservamos memoria
• Generación de archivo TGA el cual viene en formato RGB. Si no está en este formato se deberá realizar la conversión.
Una vez tenemos la imagen cargada en memoria, los pasos a seguir son:
• Generar la referencia para la textura. [glGenTextures (1, &textura);] Con el GLuint textura referenciaremos a "esa textura". Si se quiere tener más, se debe crear un array de GLuint. El 1 significa que sólo generamos una textura.
• Referenciamos esa textura: [glBindTexture (GL_TEXTURE_2D, textura);]. Esta función dice que ahora en adelante, todas las operaciones que afecten al manejo de texturas se aplicarán sobre esa textura. En este caso es una etextura 2D
• Especificamos los filtros para esa textura:
o glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
• OpenGL puede aplicar filtros a las texturas para mejorar su visualización. La primer línea especifica el filtro a utilizar en caso de que las textura se vea más grande de lo que en realidad es (Aumento). La segunda, especifica el filtro para el caso de que la textura se vea más pequeña de lo que en realidad es. Aquí utilizamos un filtro LINEAR para el 1er caso y del segundo hablaremos más adelante. Otro valor que podríamos haber utilizado es el GL_NEAREST, que es un filtro peor pero más rápido
• Creamos la textura por medio de MIPMAPS para mejor rendimiento, en vez de filtrar las textura dinámicamente, al crear un mipmap, creamos varias texturas de diferentes tamaños (del original hacia más pequeño). OpenGL, decidirá en función de lo lejano que esté el objeto con esa textura, de qué mipmap utilizar.
• Por ultimo, sólo hace falta habilitar el empleo de texturas con:glEnable(GL_TEXTURE_2D);En la función init_gl.

TEXTURAS EN UNA SUPERFICIE
•Al mapear la imagen de textura sobre una superficie, los texels no se van a corresponder exactamente con los pixels
Magnificación : Si la superficie es mayor que la textura, cada pixel se corresponderá con un trozo pequeño de texel

Minificación : Si la superficie es menor que la textura, cada pixel se corresponderá con una conjunto de texels contiguos•
Texels

Pixeles

Modos de mapeo
•Para establecer el modo de mapeo:
• glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GLint valor)
• donde valor puede tomar 3 valores:
–GL_DECAL: el valor del texel se copia directamente al pixel
–GL_MODULATE: el valor del texel se escala por el color del objeto
–GL_BLEND: el valor del texel se usa para interpolar entre el color del objeto y un color constante definido para la textura, mediante la función
• glTexEnvfv(GL_TEXTURE_ENV,GL_TEXTURE_ENV_COLOR,GLfloat color[4])


MODOS DE APLICACIÓN DE TEXTURAS

GL TEXTURE WRAP S
Establece el parámetro wrap para la coordenada de textura s a GL_CLAMP, GL_CLAMP_TO_EDGE, o GL_REPEAT. GL_CLAMP causa que las coordenadas s estén limitadas al rango [0,1] y es útil para prevenir artefactos de envoltura (compresión?) cuando se mapea una única imagen en un objeto. GL_CLAMP_TO_EDGE causa que las coordenadas s se limiten al rango [1/2n, 1-(1/2n)i], donde n es el tamaño de la textura en la dirección del límite. GL_REPEAT causa que la parte entera de s se ignore; el GL utiliza solo la parte fraccionaria, creando por lo tanto un patrón repetitivo. Los elementos de textura de borde son accesados solo si la envoltura se establece a GL_CLAMP. Inicialmente, GL_TEXTURE¬_WRAP_S se establece a GL_REPEAT.

GL TEXTURE WRAP T
Establece el parámetro wrap para la coordenada de textura t a GL_CLAMP, GL_CLAMP_TO_EDGE, o GL_REPEAT (véase arriba). Inicialmente, GL_TEXTURE_WRAP_T se establece a GL_REPEAT.


3¿Cuales son los atributos/características que se pueden declarar en OpenGL/GLUT para manejo de:
-Luces
-Materiales
-Texturas
y con que funciones se hace esto?


En OpenGL se pueden definir tres formas de luz distintas, estas son: AMBIENTE, DIFUSA y ESPECULAR

AMBIENTE.- la luz llega de todas las direcciones de forma distribuida y es reflejada de igual forma por los polígonos de la escena.

DIFUSA.- la luz llega de una fuente puntual en particular y toca la superficie con una intensidad que depende de la cara hacia la cual llega la luz, este tipo de iluminación es la que mejor define el contorno en los objetos 3D

ESPECULAR.- es la luz emitida desde el objeto de forma distribuida en todas direcciones.


La luz tiene las propiedades de color, posición y dirección. El color que las luces tendrán esta determinado por las tres componentes de color que maneja OpenGL, rojo, verde y azul. El comando utilizado para especificar todas las propiedades de la luz es glLiht(), este comando tiene tres argumentos para identificar la luz que se está utilizando, la propiedad y el valor deseado para la propiedad.

Después de definir las características de las luces se encienden con el comando glEnable(nombre de la fuente de luz a activar). También existe una función para desactivar la iluminación, que es glDisable y desactiva la luz especificada.
Las características de la luz por default para glLight son:
GL_DIFFUSE Y GL_SPECULAR sólo se usan con la primera fuente de luz.
GL_AMBIENT: Define los valores de la luz ambiental. Valor RGBA, su valor por defecto es 0.0,0.0,0.0,1.0)
GL_DIFFUSE: Define los valores de la luz difusa. Valor RGBA. su valor por defecto es (1.0,1.0,1.0,1.0)
GL_SPECULAR: Define los valores de la luz especular. Valor RGBA. Su valor por defecto es (1.0,1.0,1.0,1.0)
GL_POSITION: Posición de la luz, en coordenadas { x, y, z, w }, su valor por defecto es (0.0,0.0,1.0,0.0)
GL_SPOT_DIRECTION: Vector de dirección de la luz, en coordenadas { x, y, z }, su valor por defecto es (0.0,0.0,-1.0)
GL_SPOT_EXPONENT: Representa la concentración de la intensidad de la luz. Valor escalar, por defecto 0.
GL_SPOT_CUTOFF: Ángulo del cono de luz. Valor escalar, por defecto 180.
GL_CONSTANT_ATTENUATION: Atenuación constante a aplicar a la luz según la distancia. Valor escalar, por defecto 1
GL_LINEAR_ATTENUATION: Atenuación lineal a aplicar a la luz según la distancia. Valor escalar, por defecto 0
GL_QUADRATIC_ATTENUATION: Atenuación cuadrática a aplicar a la luz según la distancia. Valor escalar, por defecto 0

La luz es un punto focal el cual ilumina los objetos en un cierto rango, es un punto muy definido y fácil de encontrar, en cambio la iluminación da una intensidad de luz en un rango más amplio dando la sensación de que no hay un punto focal donde la luz es emitida, la iluminación es un tipo de luz la cual no incide directamente en los objetos.

Para habilitar y deshabilitar a uno de los puntos de iluminación se utilizan los comandos glEnable(nombre_iluminación) y glDisable(nombre_iluminación). La fuente de luz es creada con glLightfv (GL_LIGHT0, GL_AMBIENT, luz ambiental);

Dependiendo de las propiedades de los materiales la luz tiene un efecto distinto sobre ellos.
Estas propiedades se definen con glMaterial:
void glMaterial(GLenum cara, GLenum nombre, TYPOparam);
El argumento cara, determina la cara del objeto en la que aplicamos las propiedades, tiene los siguientes valores:
GL_FRONT,GL_BACK,GL_FRONT_AND_BACK.
El siguiente indica la propiedad que va utilizarse para dicha cara, puede ser:
GL_AMBIENT, GL_DIFFUSE, GL_AMBIENT_AND_DIFFUSE, GL_SPECULAR, GL_SHININESS, GL_EMISSION, GL_COLOR_INDEXES.
El ultimo parámetro especifica un puntero al valor o valores que el parámetro nombre tomara.
• GL_AMBIENT .- color ambiente del material, sus valores por defecto son (0.2, 0.2, 0.2, 1.0).
• GL_DIFFUSE .- color difuso del material, sus valores por defecto son (0.8, 0.8, 0.8, 1.0).
• GL_AMBIENT_AND_DIFFUSE .- color ambiente y difuso del material
• GL_SHININESS.- exponente especular, su valor por defecto es 0.
• GL_EMISSION.- el color de emisión del material, sus valores por defecto son (0.0, 0.0, 0.0, 1.0).
• GL_COLOR_INDEXES.- índice de color ambiente, difuso y especular, sus valores por defecto son (0, 1, 1).

lunes, 24 de septiembre de 2007

Previo 6

¿Cómo se dibuja texto con GLUT? ¿Cambia el dibujo de texto con freeGLUT y OpenGLUT? ¿Porque?

El manejo de fuentes de texto es una de las partes débiles de OpenGL. Su implementación es complicada ya que la biblioteca GL sólo proporciona funciones muy primitivas para trazado de bitmaps que obligan a disponer de una librería propia de bitmaps para los caracteres. GLUT va un poco más allá y dispone de unas pocas funciones que permiten renderizar texto en pantalla.
GLUT resuelve un poco el dilema de usar texto en OpenGL. Proporciona glutBitmapCharacter, que traza un único carácter en la posiciçón especificada por glRasterPos. He añadido unas pocas funciones, drawString(), y drawStringBig() que hacen la vida un poco mejor al trazar cadenas de caracteres.

¿Cómo funcionan y cúales son los parámetros de los comandos ?

glutBitmapCharacter(*font vacío, carácter interno);
Traza un único caracter en la posición especificada. Los parámetros son la fuente a usar, y el caracter que va a escribir.

glutStrokeCharacter(*font vacío, carácter interno); Rinde un carácter del movimiento que usa OpenG. Tiene los mismos parámetros que el anterior caso.

Escriba un programa que dibuje su nombre y numero de cuenta en la pantalla

void escribe(char * s)
{

int i;
for(i=0;
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18,s[i]);
}

void disp(void){
glClear(GL_COLOR_BUFFER_BIT);glFlush();
}
int main(int argc, char **argv){

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA GLUT_SINGLE);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);
glutCreateWindow("TEXTO");
glClearColor(0.0,0.0,0.0,0.0);
glutDisplayFunc(disp);
glutMainLoop();
}

Reporte práctica 5

¿Qué es diseño orientado a eventos?

Es un diseño que se basa en la ocurrencia de eventos, es decir, esperar que el usuario realice una acción en la ventana (un click, oprimir una tecla, o el simple movimiento del raton), para que el programa interactue como respuesta a ese evento realizando una acción.



¿Qué utilidad tiene el manejo de eventos en el desarrollo de aplicaciones gráficas?



Los lenguajes visuales orientada al evento y con manejo de componentes dan al usuario que no cuenta con mucha experiencia en desarrollo, la posibilidad de construir sus propias aplicaciones utilizando interfaces gráficas sobre la base de ocurrencia de eventos.Para soportar este tipo de desarrollo interactuan dos tipos de herramientas, una que permite realizar diseños gráficos y , un lenguaje de alto nivel que permite codificar los eventos. Con dichas herramientas es posible desarrollar cualquier tipo de aplicaciones basadas en el entorno.



Escriba un programa en el cual se tomen las coordenadas y se dibuje un punto,
- Cada 2 puntos acumulados dibuje una línea

#include
#include
#include
using namespace std;
int point1[]={10,10};
int point2[]={50,50};
int click=0;

void onMouse(int button, int state, int x, int y)
{
if ( (button == GLUT_LEFT_BUTTON) && (state == GLUT_DOWN) ) {
click++;
if (click==1){
point1[0]=x;
point1[1]=y;
}
if (click==2){
point2[0]=x;
point2[1]=y;
glutPostRedisplay();
}
if (click==3){
point1[0]=x;
point1[1]=y;
click=1; }

if ( (button == GLUT_RIGHT_BUTTON) && (state == GLUT_DOWN) ) {
glClear(GL_COLOR_BUFFER_BIT);
}

}
}

void disp(void){
glutMouseFunc(onMouse);
glClear(GL_COLOR_BUFFER_BIT); // se limpia pantalla
glColor3f(110.0/255.0,191.0/255.0,116.0/255.0);
glBegin(GL_LINES); //para crear líneas
//dibujo de linea entre puntos
glVertex2f(-1.0+((float)point1[0]/250.0),1.0-((float)point1[1]/250.0));
glVertex2f(-1.0+((float)point2[0]/250.0),1.0-((float)point2[1]/250.0));
glEnd();
glFlush();
}

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

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA GLUT_SINGLE);
glutInitWindowSize(500,500);

glutInitWindowPosition(100,100);

glutCreateWindow("LINEAS");

glClearColor(0.0,0.0,0.0,0.0);
glutDisplayFunc(disp);

glutMainLoop();
}

- Cada tres puntos acumulados dibuje un triangulo

#include
#include
#include
using namespace std;
int point1[]={10,10};
int point2[]={50,50};
int point3[]={10,50}
int click=0;

void onMouse(int button, int state, int x, int y)
{
if ( (button == GLUT_LEFT_BUTTON) && (state == GLUT_DOWN) ) {
click++;
if (click==1){
point1[0]=x;
point1[1]=y;
}
if (click==2){
point2[0]=x;
point2[1]=y;
glutPostRedisplay();
}
if(click==3){
point3[0]=x;
point3[1]=1;
glutPostRedisplay();
}

if (click==4){
point1[0]=x;
point1[1]=y;
click=1;
}
if ( (button == GLUT_RIGHT_BUTTON) && (state == GLUT_DOWN) ) {
glClear(GL_COLOR_BUFFER_BIT);
}
}
}

void disp(void){
glutMouseFunc(onMouse);
glClear(GL_COLOR_BUFFER_BIT); // se limpia pantalla
glColor3f(110.0/255.0,191.0/255.0,116.0/255.0);
glBegin(GL_LINES); //para crear líneas
//dibujo de linea entre puntos
glVertex2f(-1.0+((float)point1[0]/250.0),1.0-((float)point1[1]/250.0));
glVertex2f(-1.0+((float)point2[0]/250.0),1.0-((float)point2[1]/250.0));
glvertex2f(-1.0+((float)point3[0]/250.0),1.0-((float)point3[1]/250.0));
glEnd();
glFlush();
}

int main(int argc, char **argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA GLUT_SINGLE);
glutInitWindowSize(500,500);

glutInitWindowPosition(100,100);

glutCreateWindow("LINEAS");

glClearColor(0.0,0.0,0.0,0.0);
glutDisplayFunc(disp);

glutMainLoop();
}