Logo Studenta

Semana9-Generación y carga de modelos con OpenGL

¡Este material tiene más páginas!

Vista previa del material en texto

UNIDAD II
COMPUTACIÓN GRÁFICA II
▪ Texturas
▪ Generación y carga de modelos con OpenGL
Semana 9
Al término de la sesión, el estudiante aprende a texturizar y usar modelos OBJ con OpenGL para
generar una aplicación gráfica que complemente lo aprendido.
Logro de 
Aprendizaje
¿Texturas?
Responder en el foro
Introducción
Las texturas se pueden combinar, también, con color y luz
con buenos resultados.
Las texturas son una parte vital en computación gráfica
para dar mayor realismo a las escenas y a costos
aceptables.
Es una técnica enormemente importante en computación
gráfica moderna.
Introducción
Texturizar una superficie consiste esencialmente en pintar una imagen sobre ella, un proceso que se puede
utilizar con dos grandes ventajas a la hora de programar gráficos:
Autenticidad
• Representación realista de un objeto.
Ilusión de detalles geométricos
• En lugar de recrear fielmente un objeto 
con primitivas geométricas, pintar una 
imagen de ella en una escena puede 
lograr un resultado realista a una 
fracción del costo en el número de 
polígonos.
Introducción
Los píxeles en una textura se llaman texels, cada uno de ellos almacena valores de
color, como RGB de 24 bits o RGBA de 32 bits.
Hay varias formas de aplicar una textura en OpenGl.
La más común: La textura es una matriz rectangular de píxeles y se aplica a una
superficie poligonal.
Introducción
Los píxeles en una textura se llaman texels, cada uno
de ellos almacena valores de color, como RGB de 24
bits o RGBA de 32 bits (Red, Green, Blue y
Alpha/opacidad).
Hay varias formas de aplicar una textura en OpenGl.
La más común: La textura es una matriz rectangular de píxeles y se aplica a una
superficie poligonal.
Introducción
Textura de procedimiento o Sintética: una textura creada en el programa
mismo.
La textura en sí misma puede ser:
Textura Externa: una imagen externa que se importa a un programa OpenGL.
Una vez cargados, no hay diferencia entre las dos.
Texturas en OpenGL
Una textura, desde el punto de vista de su almacenamiento en memoria es un array
de datos.
Podemos rellenar dicho array bien cargando una imagen desde un fichero, o bien
dándole nosotros los valores de color a cada texel.
Cada uno de los valores de este array lo llamamos textel. Este array de datos
representa una imagen, que utilizaremos para mapearla sobre un polígono.
Podemos tener texturas unidimensionales (un solo pixel de alto o de ancho), bidimensionales (imagen de
tamaño m*n) o tridimensional (con volumen), aunque lo habitual será utilizar las bidimensionales.
Texturas en OpenGL
Los pasos necesarios para mapear texturas sobre polígonos son los siguientes:
Cargar el fichero 
de imagen
Indicar los 
parámetros de 
aplicación de la 
textura y activar 
el mapeado de 
texturas
Especificar la 
textura 
Dibujar la escena
Texturas en OpenGL
Para OpenGL las texturas 1D, 2D o 3D son arraysuni, bi o tri - dimensionales
respectivamente.
En los ejemplos de clase utilizaremos unas funciones de la librería RgbImage.h, estas
funciones permiten cargar fichero en formato BMP.
Texturas 1D
Donde:
Son texturas que solo tienen un Texel de altura y/o un Texel de ancho
Texturas 1D
Ejemplo, para activar el mapeo de texturas 1D:
glEnable (GL_TEXTURE_1D)
Para definir los colores de la textura:
#define Violeta_oscuro{ 0x3f, 0x00, 0x3f }
#define Violeta{ 0x7f, 0x00, 0x7f }
#define Malva{ 0xbf, 0x00, 0xbf }
#define Azul{ 0x00, 0x00, 0xff }
#define Verde{ 0x00, 0xff, 0x00 }
#define Amarillo { 0xff, 0xff, 0x00 }
#define Naranja{ 0xff, 0x7f, 0x00 }
#define Rojo{ 0xff, 0x00, 0x00 }
unsigned char ArcoIris[8][3] = {Violeta_oscuro, Violeta,Malva, Azul, Verde, 
Amarillo, Naranja, Rojo};
Coordenadas de la textura
Para hacer corresponder las coordenadas de la textura con las de la superficie del
objeto, se usa:
glBegin(GL_QUADS);
glTexCoord1f (0.0);
glVertex3f (0, 0, 0);
glTexCoord1f (1.0);
glVertex3f (8, 0, 0);
glTexCoord1f (1.0);
glVertex3f (8, 8, 0);
glTexCoord1f (0.0);
glVertex3f (0, 8, 0);
glEnd();
Donde S: las coordenadas de la textura 1D es 0 ó 1
glTexCoord1f (GLfloat S)
Filtrado en una textura 1d
Al mapear la imagen de textura sobre una superficie, los texels no se van a corresponder exactamente con los pixels:
El área del pixel equivale a una región
de la textura mayor que un texel,
cerca del polígono, llamado
MAGnificación
El área del pixel equivale a una
región de la textura menor que
un texel, alejado del polígono,
llamado MINificación.
Filtrado en una textura 1d
Filtrado en una textura 1d
Para indicar el tipo de filtrado en una textura seria con:
Modos de mapeo en una textura 1d
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: 
EJEMPLO 1:
DESARROLLA LA SIGUIENTE 
ESCENA CON TEXTURA 1D 
(PRUEBA EL PARÁMETRO
GL_NEAREST Y GL_LINEAR)
Texturas 2D
Donde:
Para definir la textura 2D:
Texturas 2D
Coordenadas de la textura
Para hacer corresponder las coordenadas de la textura con las de la superficie:
Texturas 2D
Coordenadas de la textura
En el polígono
Texturas 2D
Para activar el mapeo de texturas 2D:
glEnable (GL_TEXTURE_2D)
GLubyte Colores[4][4][3] = {
{{64,0,0}, {128,0,0}, {192,0,0}, {255,0,0}}, // Rojos
{{0,64,0}, {0,128,0}, {0,192,0}, {0,255,0}}, // Verdes
{{0,0,64}, {0,0,128}, {0,0,192}, {0,0,255}}, // Azules
{{64,64,0}, {128,128,0}, {192,192,0}, {255,255,0}} // Amarillos
};
glTexImage2D (GL_TEXTURE_2D, 0, 3, 4, 4, 0,GL_RGB, GL_UNSIGNED_BYTE, Colores);
Ejemplo:
Texturas 2D
Coordenadas de la textura:
Para hacer corresponder las coordenadas de la
textura con las de la superficie:
void glTexCoord2f (GLfloat s, GLfloat t)
glBegin(GL_QUADS);
glTexCoord2f (0.0, 0.0);
glVertex3f (0, 400, 0);
glTexCoord2f (1.0, 0.0);
glVertex3f (400, 400, 0);
glTexCoord2f (1.0, 1.0);
glVertex3f (400, 0, 0);
glTexCoord2f (0.0, 1.0);
glVertex3f (0, 0, 0);
glEnd();
Ejemplo:
Tipos de filtrado 2D
EJEMPLO 2:
DESARROLLA LA 
SIGUIENTE ESCENA 
CON TEXTURA 2D
Coordenadas paramétricas
Leyendo texturas externas
Para ajustar la textura a la geometría se recurre a las 
coordenadas de textura:
• A cada vértice se le hacen corresponder las 
coordenadas deseadas de la textura.
• Este proceso puede ser:
• Manual: para casos muy sencillos a través de un 
programa externo.
• Asistido: para casos muy complejos (mapas y 
atlas de texturas).
• Automático: para figuras muy sencillas o donde 
no importan las deformaciones, este método lo 
aplicaremos en nuestro curso.
Manual:
Asistido:
Automático:
Texturas desde mapas de textura BMP
❑ 1.Usaremos la librería RGBimage para leer texturas en formato *.bmp (copiaremos las imágenes y la 
Liberia a la raíz del proyecto), además incluir la llamada: #include "RgbImage.h"
GLuint texture[5]; // declarar el array para almacenar las texturas
void leerTexturasDesdeArchivo(const char* filename, int index){
RgbImage theTexMap(filename); //lee el mapa de textura bmp como un objeto RgbImage
glGenTextures(1,&texture[index]); //genera una array texturas
glBindTexture(GL_TEXTURE_2D,texture[index]);//Todas las texturas de la array son 2D
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); //Parámetros de envoltura
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);//Opciones de calidad de filtrado
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
// Carga los datos del mapa de texturas en la memoria de OpenGL
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,theTexMap.GetNumCols(), 
theTexMap.GetNumRows(),0,GL_RGB,GL_UNSIGNED_BYTE,theTexMap.ImageData());
}
❑ Metódo para leerlas texturas
void cargarImagenes(){
leerTexturasDesdeArchivo("Tierra.bmp",0);
..
}
❑ 2.Metódo para cargar diferentes texturas:
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,texture[0]);
glBegin(GL_POLYGON);
glTexCoord2f(0,0); glVertex3i(0,0,1);
glTexCoord2f(0,1); glVertex3i(0,1,1);
glTexCoord2f(1,1); glVertex3i(1,1,1);
glTexCoord2f(1,0); glVertex3i(1,0,1);
glEnd();
glDisable(GL_TEXTURE_2D);
❑ 3.Ejemplo de como texturizar un 
polígono:
Pasos
EJEMPLO 3:
DESARROLLA LA SIGUIENTE 
ESCENA CON TEXTURA
Texturas 3D
Leyendo la textura de un fichero *.bmp
Nota:
Cualquier llamada a glTexCoord se ignora Cuando la 
generación de coordenadas de textura está habilitada 
(GL_TEXTURE_GEN_S y GL_TEXTURE_GEN_T ), OpenGL 
calcula las coordenadas de textura para cada vértice por 
usted (usadas en primitivas: teapot, cube, etc):
glPushMatrix();
glEnable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glBindTexture(GL_TEXTURE_2D,texture[0]);
glutSolidTeapot(0.5);
glDisable(GL_TEXTURE_2D);
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
glPopMatrix();
GENERACIÓN Y CARGA DE MODELOS OPENGL
Responder en el foro
MODELOS OPENGL 3D
❑ Son colecciones de puntos conectados en un espacio tridimensional (3D), llamados vértices, que se combinan 
para formar una secuencia de polígonos que se pueden renderizar para representar un objeto en un espacio 
virtual.
❑ Casi todos los objetos 3D que no son primitivas de forma (predefinidos), como los triángulos, pueden 
considerarse modelos OpenGL 3D.
❑ Un modelo completo generalmente incluye texturas, mapas de relieve y para objetos animados, información 
esquelética y pesos de vértices.
❑ Los modelos OpenGL completamente realizados son muy complejos de crear, por lo que casi siempre se 
realizan con un software de modelado con todas las funciones (por ejemplo Blender).
❑ Existen algunas complejidades que pueden surgir al utilizar modelos 3D OpenGL. El más común es el problema de 
leer un archivo, porque no todos los modeladores 3D proporcionan la especificación de cómo se guarda un archivo, 
en ocasiones es suficiente las librerias de Glut, sin embargo otras veces es necesario recurrir a otras librerias.
Formato de archivo .obj
El formato de archivo Wavefront (.obj). es un sencillo formato 
de datos que normalmente representa la geometría 3D de la 
siguiente manera:
❑ La posición de cada vértice X Y Z que se especifican con la 
letra v.
❑ La posición de UV de cada coordenada de textura de vértice, 
que se especifican con las letras vt.
❑ Las normales del vértice, que se especifican con las letras vn 
(Las normales son un vector perpendicular a un polígono, la 
dirección de la normal determina cómo la luz incide en el 
polígono)
❑ Las caras que hacen cada polígono definido como una lista de 
vértices, texturas y normales, que se especifican con la letra f, 
siendo el formato f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3.
Representación .obj
Hablamos de modelo poligonal cuando se utilizan polígonos para describirlo. En general,
el triángulo es la primitiva más utilizada.
Los modelos poligonales representan objetos donde aristas y vértices se comparten
entre diferentes polígonos. A este tipo de modelos se les denomina mallas poligonales.
De esta manera se separa la información de los vértices y la de los triángulos en dos
listas, cada vértice compartido se almacena una única vez y cada triángulo se representa
mediante tres índices a la lista de vértices:
Es importante tener en cuenta esta característica para tratar de reducir el espacio 
de almacenamiento y tiempo de dibujado.
Ejemplos de mallas poligonales
El formato Wavefront OBJ es un formato de archivo utilizado para muchas
aplicaciones de modelado 3D, tales como 3DS Max, Cinema 4D o Maya. Los
modelos producidos y guardados en formato OBJ se componen de polígonos
individuales que se unieron para formar una malla. Estos polígonos son más a
menudo Quads (cuatro lados), pero es preferible tener totalmente polígonos
triangulares. Podemos utilizar Blender, como un conversor a un modelo de
triángulos para luego trabajar en su programa original:
❑ Iniciar la aplicación Blender. Seleccione "Archivo" en el menú
superior y haga clic en "Importar". A partir de las opciones, haga clic
en "Wavefront OBJ." Cargar archivo.
❑ Seleccione "Archivo" en el menú y elegir la opción "Exportar". De
las opciones, elegir la opción "Wavefront OBJ." En la ventana que
aparece, considere hacer check en las siguientes opciones y
finalmente exportar el modelo.
MODELOS OPENGL 3D
Algunos sitios con modelos en formato OBJ y descargas gratuitas:
https://www.turbosquid.com/3d-model
www.cgtrader.com/free-3d-models
https://sketchfab.com/tags/opengl
Modelos free: Link
https://www.turbosquid.com/Search/3D-Models/free?file_type=118%2C119&sort_column=a7&sort_order=desc
MODELOS *OBJ
Ejemplo básico
https://www.turbosquid.com/3d-models/free-orient-stairs-3d-model-1869772#
❑ ¿Qué aprendí?
❑¿Qué necesito reforzar?
¿Preguntas o dudas?
Referencias
Benstead, Luke. (2012) Programación de videojuegos con OpenGL. 
https://upn.vitalsource.com/books/9786074817621.
Bosque, Jose. (2007). Introducción a OpenGL. 
https://elibro-net.eu1.proxy.openathens.net/es/ereader/upnorte/35680?page=2
Donald, Hearn. (2006). Gráficos por computadora con OpenGL: Pearson Educación
https://upn.vitalsource.com/books/9786074817621
https://elibro-net.eu1.proxy.openathens.net/es/ereader/upnorte/35680?page=2

Continuar navegando