Professional Documents
Culture Documents
TRABAJO ENCARGADO
INTEGRANTES:
SEMESTRE VI
1
Índice
1. Resumen............................................................................................................................... 5
2. Introducción ........................................................................................................................ 6
3. Proyección en OpenGL ...................................................................................................... 7
4. Posición de la cámara ......................................................................................................... 7
5. Tipos de proyecciones ......................................................................................................... 8
a) Proyeccion ortogonal o paralela: .................................................................................... 8
b) Proyeccion perspectiva ..................................................................................................... 9
6. Manteniendo la proporción de los objetos ...................................................................... 11
8. Bibliografía ........................................................................................................................ 14
2
DEDICATORIA
3
AGRADECIMIENTO
4
1. Resumen
Antes de presentar los detalles de cómo implementar las transformaciones 3D enOp
enGL, necesitamos dibujar objetos 3D. La librería GLUT ofrece una colección
interesante de objetos 3D. Cada objeto está disponible en dos versiones: alambre (Wire)
y solido(Solid).
La Realidad Aumentada es la tecnología que nos permite superponer elementos gráficos
sobre el mundo real. Para que esta pueda funcionar adecuadamente es necesario conocer con
precisión cuál es la posición de la cámara desde la que vemos el mundo y como se conforman
las imágenes que nos muestra. En este trabajo mostramos como calcular la posición de la
cámara a partir de diferentes marcas tanto naturales como artificiales, vemos cual es la mejor
forma de proyectar sobre estas marcas mediante el estudio del error de calibración,
diseñamos un modo de obtener la matriz de intrínsecos a partir de los para ‘metros físicos de
la cámara (distancia focal y ángulos de visión), elaboramos un modelo de proyección que
permita emplear la matriz de intrínsecos para obtener la matriz de proyección de OpenGL y
por ultimo proyectamos una figura en tres dimensiones (3D) sobre el patrón. Este patrón
será´ un tipo especial de letreros que detectamos empleando una técnica de seguimiento en
el espacio de color.
5
2. Introducción
OpenGL es una librería grafica en la cual utilizaremos en proyecciones para poder relisar las
siguientes proyecciones escritas originalmente en C que permite la manipulaci6n de gráficos
3D a todos los niveles. Esta librería se concibi6 para programar en máquinas nativas Silicon
Graphics bajo el nombre de GL (Graphics Library). Posteriormente se consideró la
posibilidad de extenderla a cualquier tipo de plataforma y asegurar así su portabilidad y
extensibilidad de uso con lo que se legó al termino Open Graphics Library, es decir,
OpenGL. La librería se ejecuta a la par con nuestro programa independientemente de la
capacidad grafica de la máquina que usamos. Esto significa que la ejecuci6n se clara por
software a no ser que contemos con hardware grafico específico en nuestra máquina. Si
contamos con tarjetas aceleradoras de video, tecnología MMX, aceleradoras 3D, pipelines
gráficos implementados en placa, etc. por supuesto gozaremos de una ejecuci6n muchísimo
más rápida en tiempo real.
Así esta librería puede usarse bajo todo tipo de sistemas operativos e incluso
Usando una gran variedad de lenguajes de programaci6n. Podemos encontrar variantes de
OpenGL para Windows 95/NT, Unix, Linux, Iris, Solaris, Delphi, Java e incluso Visual
Basic. No obstante, su uso más extenso suele ser el lenguaje Co C++. Por supuesto no
podemos desligar el mundo de los gráficos de OpenGL y por tanto se intentara que este sea
un curso de "gráficos usando OpenGL", más que una larga menci6n de funciones y constantes
integradas en esta librería. Trabajaremos con C y por tanto nos referiremos siempre a
ejemplos codificados según este lenguaje. Simplemente necesitaremos las librerías
adecuadas y un compilador cualquiera de Ansi C, es decir, el estándar de este lenguaje. Algo
de algebra lineal también hará falta para entender que es lo que ocurre internamente y cómo
podemos operar con nuestra geometría para lograr los efectos deseados.
6
3. Proyección en OpenGL
Una vez definida una escena en coordenadas del mundo, tenemos que “tomar la foto”. Para
esto, tenemos que hacer dos cosas: colocar la cámara en el mundo (o sea, en la escena) y
definir el tipo de proyección que realizará la cámara.
Tras las transformaciones homogéneas para nuestra geometría ya somos capaces de modelar
y situar objetos a lo largo y ancho de nuestra escena virtual. 1, Pero como hacer que aparezcan
en nuestra ventana del Sistema Operativo? La ventana es 2D y en cambio está mostrando
geometría 3D dando sensación de que hay profundidad. Tenemos que proyectar Ia geometría
en un plano de proyección. Como plano es obviamente 2D y suele situarse por convencion
en Z = 0 (plano XY). La idea es proyectar primero para "discretizar" despues. Por discretica
entendemos pasar del mundo real (float o double) al entero (integer) que es el de los pixels
de nuestro monitor.
4. Posición de la cámara
Tenemos que definir no sólo la posición de la cámara (o donde está), sino también hacia
dónde mira y con qué orientación (no es lo mismo mirar con la cara torcida que recta, aunque
veamos lo mismo). Para hacer esto, basta con modificar la matriz ModelView para mover
toda la escena de manera que parezca que hemos movido la cámara. El problema de este
sistema es que tenemos que pensar bastante en las transformaciones a aplicar. Es por ello que
OpenGL proporciona la función gluLookAt. Su sintaxis es la siguiente:
void gluLookAt( eyeX, eyeY, eyeZ, cenX, cenY, cenZ, vp_X, vp_Y, vp_Z);
donde eye corresponde a la posición de la cámara, cen corresponde al punto hacia donde mira
la cámara y vp es un vector que define la orientación de la cámara. No podemos llamar a
gluLookAt en cualquier momento, puesto que tiene postmultiplicar la matriz ModelView
(por tanto, conviene llamarla primero). El vector vp no puede ser paralelo al vector formado
por eye y cen, es más, debería ser perpendicular. Si no, el resultado es impredecible.
figura 01
7
Al mismo tiempo que se define la posición y orientación de la cámara, hay que definir el tipo
de “foto” que se hará como si seleccionáramos el objetivo. Es decir, definir la forma del
volumen de visualización.
La primera elección que tenemos que hacer es si queremos una proyección ortogonal o
perspectiva. Dependiendo del tipo de aplicación, utilizaremos una u otra.
En OpenGL, para definir la proyección, modificaremos la matriz Projection. Para hacer esto,
pues, tendremos que hacer una llamada a glMatrixMode(GL_PROJECTION), para indicarle
que vamos a modificar esta matriz. A partir de ese momento, todas las funciones de
transformación (glRotatef, glTranslatef, glScalef, …etc) y las de la pila (glPushMatrix y
glPopMatrix) se aplican sobre esta matriz.
5. Tipos de proyecciones
En estas se define una direccion de vision (viewing) que va desde el observador hasta el
objeto en cuestion. Esta direccion se establece por medio de proyectores (lineas) que cortan
el plano de proyeccion generando asi Ia imagen 2D que finalmente aparecera en pantalla.
Como primera gran clasificacion de las proyecciones planares podemos hablar de:
Proyecciones planares
1. Paralelas
a) Oblicua
b) Ortografica
2. Perspectiva
a) 1 punto
b) 2 puntos
c) 3 puntos
No comentaremos todas las existentes, no sera necesario. Nos centraremos en las
proyecciones planares
Nosotros nos centraremos en dos de estas proyecc10nes. La ortográfica y la perspectiva de
un solo punto.
8
figura 02
Esto sería equivalente a tener la cámara situada de la siguiente manera:
figura 03
En este caso, la imagen sería la misma, pero near y far serían ambos positivos, puesto que el
volumen se está definiendo por delante de la cámara. Si near y far fueran los valores de la
figura anterior, entonces seguramente sólo aparecería en la imagen el toro, puesto que el
volumen de visualización estaría centrado en la cámara.
b) Proyeccion perspectiva
figura 04
9
Observando la imagen obtenida, el toro tiene una apariencia mucho mayor que la tetera, que
está más lejos. Esta es la principal diferencia con la proyección ortogonal, los rayos
proyectivos no son paralelos.Una manera más simple de definir la proyección perspectiva es
mediante la función gluPerspective(alpha, aspect, near, far). Veamos con detalle cada uno de
estos parámetros:
figura 05
En esta función, alpha corresponde al ángulo de apertura del campo de visión en la dirección
de y, near es la distancia mínima a la que deben estar los objetos para salir en la foto y far
es la distancia máxima (ambas siempre positivas) El parámetro aspect define la relación entre
el ángulo de visión horizontal y vertical (es la anchura/altura), y típicamente debería ser
entre 30 y 35 grados para obtener resultados realistas. La relación entre far/near debería ser
lo más cercana posible a 1.
glMatrixMode(GL_PROJECTION);
glPushMatrix(); /* Guardamos la matriz de proyeccion */
glLoadIdentity(); /* P = I */
gluPerspective(30.0f, anchura / altura, 1.0, 10.0);
glMatrixMode(GL_MODELVIEW);
glPushMatrix(); /* Guardamos la matriz del modelo */
glLoadIdentity(); /* M = I; */
/* Colocamos la camara en el punto deseado */
gluLookAt(0, 5, 5, 0, 0, 0, 0, 1, 0);
/* Dibujamos una tetera roja centrada en (-1, 0, 0) */
glTranslatef(-1.0f, 0.0f, 0.0f);
glColor3f(1.0f, 0.0f, 0.0f);
glutWireTeapot(0.5f);
glPopMatrix(); /* Recuperamos la antigua matriz del modelo */
glMatrixMode(GL_PROJECTION);
glPopMatrix(); /* Recuperamos la antigua matriz de proyeccion */
10
(x, y, cx, cy);
figura 06
figura 07
11
que no ha sufrido ninguna deformación, lo cual es interesante en la mayoría de aplicaciones.
La definición del aspect del volumen de visualización cuando se usa gluPerspective es trivial,
basta con pasarle el parámetro adecuado. Para el caso de las funciones glFrustum y glOrtho
hay que definir los valores left, right, top y bottom teniendo en cuenta que a relación que
tienen que mantener entre ellos tiene que ser la misma que el ancho y alto de nuestro
viewport.
#include <gl/glut.h>
float aspect = 1.0f;
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(20.0f, aspect aspect, 1.0f, 10.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0f, 0.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
glutWireTeapot(0.5);
glFlush();
glutSwapBuffers();
}
void onSize(int sx, int sy)
{
glViewport(0, 0, sx, sy); aspect = (float) sx / (float) sy;
}
void main(void)
{
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowSize(400, 400);
glutInitWindowPosition(100, 100);
glutCreateWindow("Ejemplo de proporcion");
glutDisplayFunc(display);
glutReshapeFunc(onSize);
glutMainLoop();
}
12
7. Conclusión:
13
8. Bibliografía
Angel, E., Shreiner, D., Interactive Computer Graphics: A top-down approach with
shader-based OpenGL, Addison Wesley, 6th. Ed., 2011
Blinn, J., Jim Blinn's Corner: A Trip Down The Graphics Pipeline, Morgan Kaufmann
Publishers, Inc., San Francisco, 1996
Blinn, J., Jim Blinn's Corner: Dirty Pixels, Morgan Kaufmann Publishers, Inc., San
Francisco, 1998
Foley, J., Van Dam, A., Fundamentals of Interactive Computers Graphics, Addison-
Wesley, Reading, Massachussetts, 2nd Edition, 1992
Hearn, D. Jr., Baker, M.P., Computer Graphics C versionL, 3rd Edition, Prentice Hall,
2003
Hill, F. Jr., Kelley, S., Computer Graphics using OpenGL, 3rd Edition, Prentice Hall,
2006
Mandelbrot, B., The Fractal Geometry of Nature, W.H.Freeman, New York, 1983
Mc Reynolds , T., Blythe, D., Advanced Graphics Programming Using OpenGL, Morgan
Kaufmann, 2005
Parent, R., Computer Animation. Algorithms and Techniques, 2nd. Edition, Morgan
Kaufman, 2007
14