martes, 8 de mayo de 2007

Previo - Práctica 8

1. Investigar como crear y definir una fuente de luz con OpenGL

- Creación de la luz

- Cuantas luces se pueden definir

- Parámetros de la fuente de luz

- Tipos de luces

- Color de la luces

- Habilitación, deshabilitación de luces.

- Luz por default y características por default

Para la iluminación de una escena se debe hacer lo siguiente:

- Definir los vectores normales para todos los vértices de los objetos.

- Colocar las fuentes de luz.

- Elegir el tipo de luz.

- Escoger el tipo de material de cada objeto.

Primero se ejecuta el comando glEnable( GL_LIGHTING ): con esto se activan los cálculos de iluminación necesarios. En la definición estándar, hay 8 fuentes de luz, desde LIGHT0 a LIGHT7.

En OpenGL se pueden definir tres formas de luz distintas; éstas 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 tienen está 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(); Éste 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, glDisable () y desactiva la luz especificada.

Las características de la luz por default para glLight son: GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, GL_POSITION, GL_SPOT_DIRECTION, GL_SPOT_EXPONENT, GL_SPOT_CUTOFF, GL_CONSTANT_ATTENUATION, GL_LINEAR_ATTENUATION, GL_QUADRATIC_ATTENUATION.

  • GL_DIFFUSE Y GL_ESPECULAR 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.

2. Investigue la diferencia entre luz e iluminación (light/lighting)

- Habilitacion/Deshabilitacion de la ilumnacion (¿Cómo?)

- ¿Para que hay que habilitar y desabilitar la iluminación?

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; 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).

3.- Investigue la definición de propiedades de material a una superficie

- Características de los materiales (difuso, especular, brillantez, emisividad, etc)

- ¿Como se definen?

- Sobre que cara(s) de un poligono se aplican los materiales

Dependiendo de las propiedades de los materiales la luz tiene un efecto distinto sobre ellos.

Éstas 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 último 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).

4.- Investigar acerca del mapeo de texturas con OpenGL

- Carga, definición del bitmap.

- Transformaciones de la textura.

- Modos de Aplicación de una textura (repeat, wrap, etc.).

- Mapeo de la textura a una superficie.

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 hacemos referencia a esa textura. Si se quiere tener más, se debe crear un arreglo de GLuint. El 1 significa que sólo generamos una textura.

· Hacemos referencia a 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 textura 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 texturas 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.

Para la generación de la imagen TGA en memoria. El TGA debe cumplir las siguientes características:

  • Ser de 24 bits
  • Canal ALPHA. (32 bits) y SIN COMPRIMIR
  • El tamaño debe ser cuadrado (x=y) y 32x32 o 64x64 o 128x128 o 256x256

Si se cumple todo lo anterior, devuelve un puntero a la imagen y el tamaño de la imagen

Para texturas ID

•Para definir la textura:

void glTexImage1D (GLenum objetivo, GLint nivel, GLint componentes, GLsizei ancho, GLint borde, GLenum formato, GLenum tipo, const GLvoid *pixels)

donde:

objetivo vale siempre GL_TEXTURE_1D

nivel indica el nivel de detalle (0 para texturas individuales)

componentes vale 1 (modo índice), 3 (RGB) ó 4 (RGBA)

ancho indica el ancho en pixel del mapa de textura (debe ser potencia de 2)

borde indica el número de pixels que forman el borde de la textura (0, 1 ó 2)

formato indica el formato de los pixels: GL_RED, GL_RGB, GL_LUMINANCE

tipo indica el tipo de dato de los pixels: GL_UNSIGNED_INT, GL_FLOAT

pixels es un puntero a los pixels de la textura

Mapeo para texturas 2D

•Para definir la textura:

void glTexImage2D (GLenum objetivo, GLint nivel, GLint componentes, GLsizei ancho, GLsizei alto, GLint borde, GLenum formato, GLenum tipo, const GLvoid *pixels)

donde:

objetivo vale siempre GL_TEXTURE_2D

nivel indica el nivel de detalle (0 para texturas individuales)

componentes vale 1 (modo índice o luminancia), 3 (RGB) ó 4 (RGBA)

ancho indica el ancho en pixels del mapa de textura (debe ser potencia de 2)

alto indica el alto en pixels del mapa de textura (debe ser potencia de 2)

borde indica el número de pixels que forman el borde de la textura (0, 1 ó 2)

formato indica el formato de los pixels: GL_RED, GL_RGB, GL_LUMINANCE

tipo indica el tipo de dato de los pixels: GL_UNSIGNED_INT, GL_FLOAT

pixels es un puntero a los pixels de la textura

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

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])

Gl texture wraps

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 wrapt

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.

5.- Escriba un programa que:

- Defina dos luces de características distintas.

- Dibuje un cubo en el que cada cara tenga distintas propiedades de material aplicadas.

- Dibuje otro cubo para el cual en cada cara se aplique una textura distinta. Una de ellas debe ser la foto del alumno.

- Al apretar el botón izquierdo del mouse prende/apaga la primera luz.

- Al apretar el botón derecho del mouse prende/apaga la segunda luz.

- Al usar las teclas de dirección del teclado cambia la posición de la primera luz.

Código:

#include

#include

#include

#include "bitmap.h"

BITMAPINFO *TexInfo; /* Texture bitmap information */

GLubyte *TexBits; /* Texture bitmap pixel bits */

static int giraenx = 0; //Variable para rotar la luz en x.

static int giraeny = 0; //Variable para rotar la luz en y.

static int int1 = 1;

static int int2 = 1;

static int ry, rx, rz; //Variables para rotar el cubo de materiales.

static int rotarx, rotary, rotarz; //Variables para rotar el cubo de texturas.

/* Inicializa las prpiedaes de material, fuente de luz y el z buffer*/

void init(void)

{

glClearColor (0.0, 0.0, 0.0, 0.0);

glShadeModel (GL_SMOOTH);

glEnable(GL_LIGHTING);

glEnable(GL_LIGHT0);

glEnable(GL_LIGHT1);

glEnable(GL_DEPTH_TEST);

}

void display(void)

{

//Matrices para los atributos de la luz.

GLfloat position[] = { 0.0, 0.0, 2.5, 0.0 };

GLfloat position2[] = { 0.0, 3.0, 3.0, 0.0 };

GLfloat light_ambient[]={0.4, 0.4, 0.4, 1.0};

GLfloat light_diffuse[]={0.4, 0.4, 0.4, 1.0};

GLfloat light_specular[]={0.8, 0.8, 0.8, 1.0};

//Matrices los atributos de los materiales.

GLfloat no_mat[] = {0.0,0.0,0.0,1.0};

GLfloat mat_ambient[] = {0.7,0.7,0.7,1.0};

GLfloat mat_ambient_color[] = {0.8,0.8,0.2,1.0};

GLfloat mat_diffuse[] = {0.1,0.5,0.8,1.0};

GLfloat mat_specular[] = {1.0,1.0,1.0,1.0};

GLfloat no_shininess[] = {0.0};

GLfloat low_shininess[] = {5.0};

GLfloat high_shininess[] = {100.0};

GLfloat mat_emission[] = {0.3,0.2,0.2,1.0};

GLfloat mat_amb_diff[] = {0.1, 0.5, 0.8, 1.0};

GLfloat mat_amb_diff2[] = {1.0, 0.1, 0.1, 1.0};

GLfloat mat_emission1[] = {0.3,0.8,0.2,1.0};

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glPushMatrix ();

gluLookAt (5.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

//Primera luz

glPushMatrix ();

glRotated ((GLdouble) giraenx, 1.0, 0.0, 0.0);

glRotated ((GLdouble) giraeny, 0.0, 1.0, 0.0);

glLightfv (GL_LIGHT0, GL_POSITION, position);

glTranslated (0.0, 0.0,2.5 );

glDisable (GL_LIGHTING);

glColor3f (1.0, 1.0, 1.0);

glutWireCube (0.1);

glEnable (GL_LIGHTING);

glPopMatrix ();

//Fin primera luz

//Segunda luz

glPushMatrix ();

glLightfv (GL_LIGHT1, GL_POSITION, position2);

glLightfv (GL_LIGHT1, GL_AMBIENT, light_ambient);

glLightfv (GL_LIGHT1, GL_DIFFUSE, light_diffuse);

glLightfv (GL_LIGHT1, GL_SPECULAR, light_specular);

glTranslated (0.0,2.5,2.5);

glDisable (GL_LIGHTING);

glColor3f (1.0, 1.0, 1.0);

glutWireCube (0.1);

glEnable (GL_LIGHTING);

glPopMatrix ();

//Fin segunda luz

//Inicia módulo de cubo de materiales.

glPushMatrix ();

glScalef(1.0,1.0,1.0);

glRotatef(rx,1.0,0.0,0.0);

glRotatef(ry,0.0,1.0,0.0);

glRotatef(rz,0.0,0.0,1.0);

glTranslatef(0.0,0.0,0.0);

glPushMatrix ();

/*Solo con difuso*/

glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);

glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);

glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);

glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);

glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);

glBegin(GL_QUADS);

glNormal3f(0.0,0.0,1.0);

glVertex3f(0.5,0.5,0.5);

glVertex3f(-0.5,0.5,0.5);

glVertex3f(-0.5,-0.5,0.5);

glVertex3f(0.5,-0.5,0.5);

glEnd();

glPopMatrix ();

glPushMatrix ();

/*difusa y especular, poco brillo*/

glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);

glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);

glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);

glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);

glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);

glBegin(GL_QUADS);

glNormal3f(0.0,0.0,-1.0);

glVertex3f(-0.5,0.5,-0.5);

glVertex3f(0.5,0.5,-0.5);

glVertex3f(0.5,-0.5,-0.5);

glVertex3f(-0.5,-0.5,-0.5);

glEnd();

glPopMatrix ();

glPushMatrix ();

/*difusa, con reflejo especular y alto brillo */

glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);

glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);

glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);

glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);

glBegin(GL_QUADS);

glNormal3f(-1.0,0.0,0.0);

glVertex3f(-0.5,0.5,0.5);

glVertex3f(-0.5,0.5,-0.5);

glVertex3f(-0.5,-0.5,-0.5);

glVertex3f(-0.5,-0.5,0.5);

glEnd();

glPopMatrix ();

glPushMatrix ();

/*ambiente , difuso y con emision*/

glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);

glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);

glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);

glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);

glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);

glBegin(GL_QUADS);

glNormal3f(1.0,0.0,0.0);

glVertex3f(0.5,0.5,0.5);

glVertex3f(0.5,-0.5,0.5);

glVertex3f(0.5,-0.5,-0.5);

glVertex3f(0.5,0.5,-0.5);

glEnd();

glPopMatrix ();

glPushMatrix ();

/*color de ambiente, difuso, refleccion especular y poco brillo*/

glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);

glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);

glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);

glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);

glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);

glBegin(GL_QUADS);

glNormal3f(0.0,1.0,0.0);

glVertex3f(-0.5,0.5,-0.5);

glVertex3f(-0.5,0.5,0.5);

glVertex3f(0.5,0.5,0.5);

glVertex3f( 0.5,0.5,-0.5);

glEnd();

glPopMatrix ();

glPushMatrix ();

/*color de ambiente, difuso, refleccion especular y alto brillo*/

glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);

glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);

glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);

glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);

glBegin(GL_QUADS);

glNormal3f(0.0,-1.0,0.0);

glVertex3f(0.5,-0.5,-0.5);

glVertex3f(-0.5,-0.5,-0.5);

glVertex3f(-0.5,-0.5,0.5);

glVertex3f(0.5,-0.5,0.5);

glEnd();

glPopMatrix ();

glPopMatrix ();

//Fin cubo de materiales

//Fin módulo de cubo de materiales y luces.

//Inicia módulo de cubo de texturas.

glPopMatrix ();

glFlush();

glLoadIdentity ();

glPushMatrix();

glColor3f(1.0, 1.0, 1.0);

glTranslatef(1.0,0.0,-5.0);

glRotatef(rotarx,1.0,0.0,0.0);

glRotatef(rotary,0.0,1.0,0.0);

glRotatef(rotarz,0.0,0.0,1.0);

glPushMatrix();

glScalef(0.75,0.75,0.75);

//Cargar imagen 1.

TexBits = LoadDIBitmap("Yof.bmp", &TexInfo);

glTexImage2D(GL_TEXTURE_2D, 0, 3, TexInfo->bmiHeader.biWidth,

TexInfo->bmiHeader.biHeight, 0, GL_BGR_EXT,

GL_UNSIGNED_BYTE, TexBits);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glEnable(GL_TEXTURE_2D);

glBegin(GL_QUADS);

glNormal3f(0.0,0.0,1.0);

glTexCoord2f(1.0,1.0); glVertex3f(0.5,0.5,0.5);

glTexCoord2f(0.0,1.0); glVertex3f(-0.5,0.5,0.5);

glTexCoord2f(0.0,0.0); glVertex3f(-0.5,-0.5,0.5);

glTexCoord2f(1.0,0.0); glVertex3f(0.5,-0.5,0.5);

glEnd();

glDisable(GL_TEXTURE_2D);

//Cargar imagen 2.

TexBits = LoadDIBitmap("Aerisf.bmp", &TexInfo);

glTexImage2D(GL_TEXTURE_2D, 0, 3, TexInfo->bmiHeader.biWidth,

TexInfo->bmiHeader.biHeight, 0, GL_BGR_EXT,

GL_UNSIGNED_BYTE, TexBits);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glEnable(GL_TEXTURE_2D);

glBegin(GL_QUADS);

glNormal3f(0.0,0.0,-1.0);

glTexCoord2f(1.0,1.0); glVertex3f(-0.5,0.5,-0.5);

glTexCoord2f(0.0,1.0); glVertex3f( 0.5,0.5,-0.5);

glTexCoord2f(0.0,0.0); glVertex3f(0.5,-0.5,-0.5);

glTexCoord2f(1.0,0.0); glVertex3f(-0.5,-0.5,-0.5);

glEnd();

glDisable(GL_TEXTURE_2D);

//Cargar imagen 3.

TexBits = LoadDIBitmap("Baikenf.bmp", &TexInfo);

glTexImage2D(GL_TEXTURE_2D, 0, 3, TexInfo->bmiHeader.biWidth,

TexInfo->bmiHeader.biHeight, 0, GL_BGR_EXT,

GL_UNSIGNED_BYTE, TexBits);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glEnable(GL_TEXTURE_2D);

glBegin(GL_QUADS);

glNormal3f(-1.0,0.0,0.0);

glTexCoord2f(1.0,1.0); glVertex3f(-0.5,0.5,0.5);

glTexCoord2f(0.0,1.0); glVertex3f(-0.5,0.5,-0.5);

glTexCoord2f(0.0,0.0); glVertex3f(-0.5,-0.5,-0.5);

glTexCoord2f(1.0,0.0); glVertex3f(-0.5,-0.5,0.5);

glEnd();

glDisable(GL_TEXTURE_2D);

//Cargar imagen 4.

TexBits = LoadDIBitmap("Jamf.bmp", &TexInfo);

glTexImage2D(GL_TEXTURE_2D, 0, 3, TexInfo->bmiHeader.biWidth,

TexInfo->bmiHeader.biHeight, 0, GL_BGR_EXT,

GL_UNSIGNED_BYTE, TexBits);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glEnable(GL_TEXTURE_2D);

glBegin(GL_QUADS);

glNormal3f(1.0,0.0,0.0);

glTexCoord2f(0.0,1.0); glVertex3f(0.5,0.5,0.5);

glTexCoord2f(0.0,0.0); glVertex3f(0.5,-0.5,0.5);

glTexCoord2f(1.0,0.0); glVertex3f(0.5,-0.5,-0.5);

glTexCoord2f(1.0,1.0); glVertex3f(0.5,0.5,-0.5);

glEnd();

glDisable(GL_TEXTURE_2D);

//Cargar imagen 5.

TexBits = LoadDIBitmap("Ukyof.bmp", &TexInfo);

glTexImage2D(GL_TEXTURE_2D, 0, 3, TexInfo->bmiHeader.biWidth,

TexInfo->bmiHeader.biHeight, 0, GL_BGR_EXT,

GL_UNSIGNED_BYTE, TexBits);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glEnable(GL_TEXTURE_2D);

glBegin(GL_QUADS);

glNormal3f(0.0,1.0,0.0);

glTexCoord2f(0.0,1.0); glVertex3f(-0.5,0.5,-0.5);

glTexCoord2f(0.0,0.0); glVertex3f(-0.5,0.5,0.5);

glTexCoord2f(1.0,0.0); glVertex3f(0.5,0.5,0.5);

glTexCoord2f(1.0,1.0); glVertex3f( 0.5,0.5,-0.5);

glEnd();

glDisable(GL_TEXTURE_2D);

//Cargar imagen 6.

TexBits = LoadDIBitmap("Feliciaf.bmp", &TexInfo);

glTexImage2D(GL_TEXTURE_2D, 0, 3, TexInfo->bmiHeader.biWidth,

TexInfo->bmiHeader.biHeight, 0, GL_BGR_EXT,

GL_UNSIGNED_BYTE, TexBits);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glEnable(GL_TEXTURE_2D);

glBegin(GL_QUADS);

glNormal3f(0.0,-1.0,0.0);

glTexCoord2f(0.0,0.0); glVertex3f(0.5,-0.5,-0.5);

glTexCoord2f(1.0,0.0); glVertex3f(-0.5,-0.5,-0.5);

glTexCoord2f(1.0,1.0); glVertex3f(-0.5,-0.5,0.5);

glTexCoord2f(0.0,1.0); glVertex3f(0.5,-0.5,0.5);

glEnd();

glDisable(GL_TEXTURE_2D);

glPopMatrix();

glPopMatrix();

glutSwapBuffers();

glFlush ();

}

void reshape (int w, int h)

{

glViewport (0, 0, (GLsizei) w, (GLsizei) h);

glMatrixMode (GL_PROJECTION);

glLoadIdentity();

gluPerspective(40.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

}

/* ARGSUSED2 */

void mouse(int button, int state, int x, int y)

{

switch (button) {

case GLUT_LEFT_BUTTON:

if (state == GLUT_DOWN) {

if (int1 == 1)

{

glDisable(GL_LIGHT0);

int1 = 0;

glutPostRedisplay();

}

else

{

glEnable(GL_LIGHT0);

int1 = 1;

glutPostRedisplay();

}

}

break;

case GLUT_RIGHT_BUTTON:

if (state == GLUT_DOWN) {

if (int2 == 1)

{

glDisable(GL_LIGHT1);

int2 = 0;

glutPostRedisplay();

}

else

{

glEnable(GL_LIGHT1);

int2 = 1;

glutPostRedisplay();

}

}

break;

default:

break;

}

}

void special(int key, int x, int y)

{

switch (key)

{

case GLUT_KEY_RIGHT:

giraeny = (giraeny + 3) % 360;

glutPostRedisplay();

break;

case GLUT_KEY_LEFT:

giraeny = (giraeny - 3) % 360;

glutPostRedisplay();

break;

case GLUT_KEY_UP:

giraenx = (giraenx - 3) % 360;

glutPostRedisplay();

break;

case GLUT_KEY_DOWN:

giraenx = (giraenx + 3) % 360;

glutPostRedisplay();

break;

default:

break;

}

}

void keyboard(unsigned char key, int x, int y)

{

switch (key) {

case 27:

exit(0);

break;

case 'a':

ry = (ry + 3)%360;

glutPostRedisplay();

break;

case 's':

rx = (rx + 3)%360;

glutPostRedisplay();

break;

case 'd':

rz = (rz + 3)%360;

glutPostRedisplay();

break;

case 'p':

giraenx = 0;

giraeny = 0;

rx = 0;

rz = 0;

ry = 0;

glEnable(GL_LIGHT0);

glEnable(GL_LIGHT1);

glutPostRedisplay();

break;

case 'y':

rotary = (rotary + 20)%360;

glutPostRedisplay();

break;

case 'x':

rotarx = (rotarx + 20)%360;

glutPostRedisplay();

break;

case 'z':

rotarz = (rotarz + 20)%360;

glutPostRedisplay();

break;

case 'r':

rotarx = 0;

rotary = 0;

rotarz = 0;

glutPostRedisplay();

break;

}

}

int main(int argc, char** argv)

{

glutInit(&argc, argv);

glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);

glutInitWindowSize (500, 500);

glutInitWindowPosition (100, 100);

glutCreateWindow ("These are my bitches");

init ();

glutDisplayFunc(display);

glutReshapeFunc(reshape);

glutMouseFunc(mouse);

glutKeyboardFunc(keyboard);

glutSpecialFunc(special);

glutMainLoop();

return 0;

}

No hay comentarios.: