Está en la página 1de 22

Escenarios 3D en OpenGL

Ivan Olmos Pineda

Introduccin
Qu es OpenGL?
Estndar creado por Silicon Graphics en 1992 para el diseo de librerias 2D/3D

Qu se requiere para programar en OpenGL?


Obtener las bibliotecas
OpenGL: proporciona todo lo necesario para acceder a las funciones de dibujado GLU (OpenGL Utility Library): proporciona acceso a las funciones ms comunes de OpenGL a travs de la ejecucin de comandos GLX: proporciona acceso a OpenGL para interactuar con un sistema de ventanas X Window

OpenGL: Maquina de estados


Todo lo que se realice en OpenGL sigue la ideologa de una mquina de estados
OpenGL se basa en activar desactivar instrucciones o comandos La secuencia de las activaciones desactivaciones es crucial en los resultados que se obtienen

De lo anterior se desprende lo siguiente:


No es lo mismo rotar una imagen y despus trasladarla que trasladar una imagen y rotarla

OpenGL: Maquina de Estados


Esquema general de un programa en OpenGL
1.

2.

3. 4. 5.

Activar todas las opciones que van a ser persistentes en una escena (perspectiva de la cmara de visin, iluminacin global, etc) Activar las opciones que establecen el estado de un objeto especfico (posicin, textura, color, etc) Dibujar el objeto Desactivar las opciones propias de dicho objeto Volver al punto 2 hasta haber dibujado todos los objetos

OpenGL: Representacin de Objetos 3D


OpenGL utiliza una representacin de objetos 3D a partir de un espacio en cuatro dimensiones
El espacio 3D se representa a travs de un sistema 3D ortonormal, donde los ejes son perpendiculares y cada unidad en cada eje esta representado por un vector de mdulo 1 La cuarta coordenada se utiliza para representar la perspectiva

OpenGL: Transformaciones de Objetos


Existen 3 operaciones bsicas para transformar un objeto:
Traslacin: desplazamiento de un objeto en el espacio

Rotacin: rotar un objeto a partir de su centro de giro

Escalado: alterar el tamao de un objeto

OpenGL: transformaciones de objetos


Toda transformacin construye una matriz de cuatro dimensiones, que es multiplicada por la matriz original de coordenadas Por ejemplo, para trasladar un objeto 2 unidades en el eje X

A partir de la matriz anterior, dibujar un punto en las coord (1,0,0) ser:

OpenGL: transformaciones 2D/3D


Todo objeto en OpenGL se representa a travs de una matriz de dimensin 4
Un punto 3D (x, y, z) es representado por el punto (x, y, z, 1.0) Un punto 2D (x, y) es representado por el punto (x, y, 0.0, 1.0)

De lo anterior, un punto homogneo (x, y, z, w) es equivalente al punto 3D (x/w, y/w, z/w)

OpenGL: Funciones bsicas


Activar / desactivar opciones:
glEnable(<option>) glDisable(<option>)

OpenGL maneja dos matrices muy importantes


Matriz de visualizacin/modelado
glMatrixMode(GL_MODELVIEW)

Matriz de proyeccin (matriz que guarda la informacin relativa a la cmara con la cual observaremos al mundo)
glmatrixMode(GL_PROJECTION)

Para almacenar y recuperar los valores de una matriz, se utiliza una estructura tipo pila
glPushMatrix() glPopMatrix()

OpenGL: dibujado de objetos


Para dibujar en OpenGL, es necesario
Habilitar el modo de dibujado Establecer las opciones de dibujado de cada vrtice Dibujar cada uno de ellos Finalizar el modo de dibujado

Algunas formas de dibujado


GL_POINTS: se dibujan vrtices separados GL_LINES: cada par de vrtices definen una linea GL_POLYGON: todos los vrtices definen el contorno de un polgono GL_TRIANGLES: cada triplete de vrtices definen un tringulo GL_QUADS: cada cuarteto de vrtices se interpreta como un cuadriltero

OpenGL: dibujado de objetos


GL_LINE_STRIP: lneas conectadas GL_LINE_LOOP: lneas conectadas, con unin del 1er y ltimo vrtice GL_TRIANGLE_STRIP: dibuja un tringulo y cada nuevo vrtice define un tringulo con el anterior GL_QUAD_STRIP: dibuja cuadrados con en TRIANGLE_STRIP

OpenGL: proyeccin
Existen dos formas de proyectar objetos
Proyeccin ortogrfica: permite visualizar todo lo que se encuentre dentro de un cubo, delimitado por los parmetros de la funcin glOrto

OpenGL: proyeccin
Proyeccin perspectiva
Delimita un volmen de visualizacin dado por un ngulo de cmara y una relacin alto/ancho. La distancia al observador delimitar el tamao con el que un objeto se visualiza

1er Ejemplo
Crear un cdigo que dibuje un tringulo cuyos vrtices tengan un color diferente
void display(void) { glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-1.0,1.0,-1.0,1.0,-1.0,1.0); glMatrixMode(GL_MODELVIEW); glBegin(GL_TRIANGLES); glColor3f(1.0,0.0,0.0); glVertex3f(0.0,0.8,0.0); glColor3f(0.0,1.0,0.0); glVertex3f(-0.6,-0.2,0.0); glColor3f(0.0,0.0,1.0); glVertex3f(0.6,-0.2,0.0); glEnd(); glFlush(); Sleep(10000); exit(0); }

1er Ejemplo: Anlisis


glOrtho(-1,1,-1,1,-1,1)
Define una perspectiva ortonormal: lo que se observe ser una proyeccin paralela en uno de los planos definidos por los ejes Los argumentos definen el volumen de vista: xmin, xmax, ymin, ymax, zmin, zmax (zmin, zmax no son coordenadas, son distancias desde el punto de vista, )

1er Ejemplo: Anlisis


El punto 3D en openGL
glVertex3f(<argumentos>) Los argumentos son desde 2 hasta 4 valores de tipo nmerico

Las primitivas
glBegin(<tipo de primitiva>)
glVertex(); glVertex();

glEnd();

1er Ejercicio: Anlisis


Es importante hacer notar que el orden en el cual se dibujen los vrtices de una figura definen su sentido
glBegin(GL_TRIANGLES); glVertex3f(0,0,0); //v1 glVertex3f(0.5,0.5,0); //v2 glVertex3f(1,0,0); //v3 glEnd(); glBegin(GL_TRIANGLES); glVertex3f(-0.2,0,0); //v4 glVertex3f(-0.7,0.5,0); //v5 glVertex3f(-1,0,0); //v6 glEnd();

Notas sobre el orden de dibujo de un objeto


Cuando un polgono tiene sentido horario, se dice que es positivo; en caso contrario, es negativo En openGL
Figuras con sentido negativo muestran su cara frontal Figuras con sentido positivo, muestran su cara trasera

En openGL, por defecto se muestran las caras frontales y traseras


Sin embargo, en operaciones de renderizado solo se trabajan sobre las caras frontales y no las traseras Para mostrar nicamente las caras frontales se utiliza glEnable(GL_CULL_FACE)

1er Ejercicio

OpenGL: Sombras
En OpenGL es posible manipular la forma en la cual se asigna un color a un objeto
glShadeModel(<parametro>)
GL_FLAT: rellena los polgonos con el color activo al momento GL_SMOOTH: rellenar el polgono interpolando los colores activos en la definicin de cada vrtice

OpenGL: visualizacin de caras ocultas


Cuando se visualicen objetos en OpenGL, algunos pueden estar ms cerca que otros de acuerdo a nuestra perspectiva (plano z)
Sin embargo, cuando se dibujan objetos, OpenGL no hace una comprobacin directa de quien esta ms cerca

Para solucionar este problema se utiliza el siguiente comando


glEnable(GL_DEPTH_TEST); //matriz en la cual se almacena la profundidad en z de los objetos. Con esto se hace una comprobacin antes de pintar los pixeles glDisable(GL_DEPTH_TEST); //desactiva la matriz de profundidad

El uso de esta matriz requiere que se borre la pantalla antes de dibujar cada frame
glClear(GL_COLOR_BUFFER_BIT 1 GL_DEPTH_BUFFER_BIT);

Comandos OpenGL: Manual de Referencia

http://www.opengl.org/sdk/docs/man/