Está en la página 1de 10

3.- Vista Tridimensional.

3.1.3.2.3.3.3.4.3.5.3.6.-

Proceso de vista 3D Comandos de transformaciones de propsito general Transformaciones de modelo y vista Transformaciones de proyeccin Transformaciones de ventana Manejar la pila de matrices

En este tema veremos como ubicar los objetos y el punto de vista del observador dentro de un espacio tridimensional, para obtener la vista de la escena que deseemos. Para crear una imagen plana es decir bidimensional sobre la pantalla del ordenador, a partir de una descripcin tridimensional de la escena, tenemos que realizar una serie de operaciones, que incluyen la proyeccin y el recorte de los objetos sobre un volumen de vista especfico. Basndose en OpenGL estas operaciones son las siguientes: Transformaciones, que se utilizan para operaciones de modelado, vista y proyeccin. Recorte de objetos o porciones de objetos no visibles. Correspondencia entre coordenadas 2D y pixeles de la pantalla. En este captulo veremos las funciones de OpenGL que nos facilitan estas operaciones.

Informtica grfica.

3.- Vista tridimensional. Pgina: 22

3.1.- PROCESO DE VISTA.


El proceso de vista de una escena lleva asociados una serie de pasos. En primer lugar tenemos que realizar una transformaciones, que son las siguientes: Transformaciones de vista, para ubicar al observador en el lugar preciso desde el que se quiere observar la escena. Transformaciones de modelo para componer la escena a partir de los objetos definidos en sus propios sistemas de coordenadas, por medio de traslaciones, rotaciones y escalados de los mismos. Transformaciones de proyeccin, para ajustar el zoom, es decir el ngulo de vista del observador. Se define la forma y orientacin del volumen de vista. Transformaciones de viewport para determinar el tamao final de la ventana en la que se visualiza la imagen. Para las tres primeras operaciones se generan matrices de transformacin 4x4 y se multiplican por todos los vrtices de los objetos. Cuando se han definido todas las transformaciones necesarias, se puede dibujar la escena. Para eso OpenGL transforma cada vrtice de todos los objetos en la escena, por medio de las matrices de transformacin tanto de modelo como de vista. De esta forma cada vrtice se proyecta y se recorta si queda fuera del volumen de vista. Finalmente los vrtices pertenecientes a la escena se transforman a coordenadas de ventana.

3.2.- COMANDOS DE TRANSFORMACIN DE PROPSITO GENERAL.


En este apartado introduciremos los comandos de transformacin ms generales, basados todos en multiplicaciones de matrices.

ESCET- UNIVERSIDAD REY JUAN CARLOS DE MADRID

Informtica grfica.

3.- Vista tridimensional. Pgina: 23

void glMatrixMode (GLenum mode) Especifica cual de las matrices se va a modificar segn el argumento mode. Las matrices que se pueden modificar son la matriz de modelo y vista combinadas, la matriz de proyeccin y la matriz de textura, que no utilizaremos en este curso. Los parmetros que se utilizan para cada caso se reflejan en la tabla 3.1.
Tabla 3.1.

Argumento GL_MODELVIEW GL_PROJECTION GL_TEXTURE

Matriz Matriz de modelo y vista. Matriz de proyeccin Matriz de textura.

Los siguientes comandos de transformacin afectan a la matriz especificada por esta funcin. Slo puede modificarse una matriz en cada operacin, y estar activa la ltima indicada por la funcin anterior. Por defecto se modifica la matriz de modelo y vista (ModelView). Al comienzo todas las matrices estn inicializadas a la matriz identidad.

void glLoadIdentity (void) Inicializa la matriz actual, con los valores de la matriz identidad de 4x4. Se utiliza para limpiar la matriz actual, al comienzo o bien para volver a la posicin inicial del objeto. void glLoadMatrix{fd} (const TYPE *m) Especifica una matriz a partir del puntero para cargarla en la matriz actual. El m argumento m es un vector de 16 (4x4) componentes. Si definimos una matriz en lenguaje C como m[4][4], entonces en OpenGL el elemento m[i][j] es la columna i y la fila j. Esto es la notacin contraria a la que normalmente se utiliza, por lo tanto para evitar problemas es ms fcil definir siempre vectores de 16 componentes es decir m[16]. void glMultMatrix{fd} (const TYPE *m) Multiplica la matriz actual por la matriz de 4x4 especificada por el parmetro m. El orden de la multiplicacin es matriz actual C por matriz especificada M, es decir el resultado es C * M.

ESCET- UNIVERSIDAD REY JUAN CARLOS DE MADRID

Informtica grfica.

3.- Vista tridimensional. Pgina: 24

3.3.- TRANSFORMACIONES DE MODELO Y VISTA.


Como ya vimos estos dos tipos de transformaciones hacen referencia a la ubicacin de los objetos dentro de la escena, y a la ubicacin del observador en la posicin deseada para observar la escena. En OpenGL estas dos matrices se combinan en una nica matriz llamada ModelView. Para todas las transformaciones que veremos a continuacin se ha de activar como matriz actual la matriz de Modelo/Vista, ejecutando primero la funcin: glMatrixMode (GL_MODELVEW);

3.3.1.- Transformaciones de Modelo.


Estas operaciones sirven para transformar la posicin, orientacin y tamao del modelo o modelos que forman la escena. Las operaciones bsicas que tenemos son las ya vistas en clase como: Trasladar. Rotar. Escalar. Las funciones de OpenGL para realizar estas operaciones son las siguientes. void glTraslate{fd} (TYPE x, TYPE y, TYPE z) Multiplica la matriz actual por una matriz de traslacin, que desplaza un objeto por las distancias de traslacin x, y, z. Este desplazamiento se realiza desde la posicin actual del objeto hasta alcanzar la posicin final, es decir utiliza desplazamientos relativos. void glRotate{fd} (TYPE angle, TYPE x, TYPE y, TYPE z) Multiplica la matriz actual por una matriz de rotacin que gira el objeto en el sentido contrario al del giro de las agujas del reloj, sobre el eje que va desde el origen de coordenadas al punto (x, y, z) especificado como parmetro, un ngulo igual al especificado como argumento. void glScale{fd} (TYPE x, TYPE y, TYPE z) Multiplica la matriz actual por un matriz de escalado, que escala el objeto en los tres ejes de coordenadas X, Y, Z, por los factores de escala x, y, z. Cada coordenada de un punto (x, y, z) se multiplica por los factores de escala especificados como parmetros.

ESCET- UNIVERSIDAD REY JUAN CARLOS DE MADRID

Informtica grfica.

3.- Vista tridimensional. Pgina: 25

Escalar por valores mayores que 1.0 estira un objeto y con valores menores de 1.0 encoge el objeto.

3.3.2.- Transformaciones de Vista.


Las transformaciones de vista cambian la posicin y orientacin del punto de vista del observador. En general se componen de operaciones bsicas de transformacin, sobre todo traslaciones y rotaciones. Las transformaciones de vista deben realizarse antes de cualquier transformacin de modelo. La ubicacin por defecto del observador es el origen de coordenadas, y orientado hacia el eje Z negativo, es decir mira hacia el interior de la pantalla. Existen varias formas de ubicar la posicin final del observador en un programa realizado con OpenGL. A continuacin sealamos algunas de ellas: Utilizando las rutinas d traslacin y rotacin. De esta forma a partir de la e posicin inicial ya descrita podemos mover la cmara a la posicin adecuada por medio de estas rutinas. Utilizar la rutina gluLookAt () que pertenece a las libreras auxiliares de OpenGL, para indicar hacia donde mira la cmara. Crear rutinas de utilidad propias, que calculen todos los movimientos necesarios, segn los parmetros que queramos darles. A continuacin veremos las dos primeras de estas formas, pues la ltima queda para aplicaciones avanzadas.

3.3.2.1.- Utilizacin de las Rutinas glTraslate() y glRotate().


Para utilizar este tipo de funciones tenemos que tener en mente que mover el punto de vista del observador, equivale a desplazar todos los objetos de la escena en el sentido contrario. Como ya hemos mencionado la cmara est inicialmente colocada en el origen de coordenadas, mirando hacia el eje Z -negativo. El caso ms simple es el de moverla hacia atrs, es decir alejarla, de los objetos que componen la escena. Para esto se utiliza la llamada a la funcin glTraslate (). As por ejemplo, si como en el caso del cubo, queremos mover al observador cinco unidades hacia atrs, para alejarse de los objetos, esto es lo mismo que mover todos los objetos -5.0 unidades en el eje Z. As pues, la funcin: glTraslate (0.0, 0.0, -5.0)
ESCET- UNIVERSIDAD REY JUAN CARLOS DE MADRID

Informtica grfica.

3.- Vista tridimensional. Pgina: 26

aplicada al principio de todo tiene el mismo efecto que desplazar el punto de vista a la posicin (0.0, 0.0, 5.0):

Figura 3.1: Desplazamiento de los objetos que componen la escena.

Por otro lado, para ver la escena desde un lado se pueden rotar estos, o bien la posicin del observador. As pues, con la secuencia de pasos: glTraslate (0.0, 0.0, -5.0) glRotate (90.0, 0.0, 1.0, 0.0) obtenemos una vista lateral del objeto, ya que primero me alejo y despus lo roto 90, en el sentido positivo del eje Y.

3.3.2.2.- Utilizacin de la Rutina gluLookAt ().


void gluLookAt (GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centrox, GLdouble centroy, GLdouble centroz, GLdouble upx, GLdouble upy, GLdouble upz) Define una matriz de vista y la postmultiplica por la matriz actual. La ubicacin viene indicada por los puntos eyex, eyey, eyez. Los parmetros centrox, centroy, centroz, determinan el punto al cual mira la cmara, que en general es el centro de la escena. Los ltimo los argumentos upx, upy, upz indican la direccin de abajo arriba del volumen de vista. Esta funcin engloba varias rutinas bsicas de OpenGL, sobre todo rutinas de traslacin y rotacin.

3.4.- TRANSFORMACIONES DE PROYECCIN.


ESCET- UNIVERSIDAD REY JUAN CARLOS DE MADRID

Informtica grfica.

3.- Vista tridimensional. Pgina: 27

Especificar los parmetros de proyeccin es lo mismo que seleccionar el objetivo de una cmara. Es decir los factores que se ven afectados por estos parmetros son al ngulo de vista y la forma de proyectar. Antes de especificar ninguno de estos parmetros tenemos que activar la matriz de proyeccin como matriz actual e inicializarla con la matriz identidad. Para esto se utiliza la secuencia de funciones siguiente: glMatrixMode (GL_PROJECTION); glLoadIdentity (); El propsito de estas transformaciones es seleccionar el volumen de vista. Este volumen se usa para: Determinar cmo se proyectan los objetos en la pantalla, es decir si se utiliza proyeccin perspectiva o paralela. Definir qu objetos o porciones de los objetos sern visibles en la imagen final. Si bien OpenGL permite los dos tipos de proyecciones, tanto perspectiva como paralela slo se presentan aqu las funciones para la proyeccin perspectiva, pues es la que se utilizar en estas prcticas.

3.4.1.- Proyeccin Perspectiva.


Como ya hemos visto en teora el volumen de vista generado por una proyeccin perspectiva es una pirmide truncada como puede verse en la figura 3.2. Este mtodo de proyeccin se utiliza en aplicaciones de simulacin y en cualquier otra aplicacin que requiera realismo, ya que la imagen es similar a la que capta el ojo humano.

Figura 3.2: Volumen de vista en perspectiva especificado por glFrustum().

ESCET- UNIVERSIDAD REY JUAN CARLOS DE MADRID

Informtica grfica.

3.- Vista tridimensional. Pgina: 28

La funcin que define la pirmide es la siguiente: void glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far) Crea una matriz para una vista en perspectiva y la multiplica por la matriz actual. No requiere que el volumen de vista sea regular. Este volumen se define por los parmetros: (left, bottom, near) - (right, top, near) que definen las coordenadas (x, y, z) de las esquinas inferior-izquierda, y superiorderecha del plano de recorte de cerca, near y far definen las distancias desde el punto de vista del observador a los planos de recorte de cerca y lejos, como se puede ver en la figura anterior. Todos estos valores deben ser positivos. La pirmide tiene una orientacin por defecto en el espacio tridimensional. Pero se puede trasladar y rotar la matriz de proyeccin para alterar esta situacin, y hacer trucos con la imagen. En lugar de esto se puede utilizar la funcin auxiliar siguiente: void gluPerspective (GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar)

Esta funcin crea una matriz de proyeccin que define una vista simtrica y la multiplica por la matriz actual. El argumento fovy determina el ngulo del campo de vista, en el plano X-Z y su rango es [0.0, 180.0]. El parmetro aspect es el cociente entre el ancho de la pirmide dividido por el alto de la base de la pirmide. Los valores zNear y zFar son las distancias desde el punto de vista a los planos de recorte. Deben ser siempre positivos. Se debe dar un valor adecuado para el campo de vista, pues sino la imagen aparecer distorsionada. Hay que hacer algunos clculos entre el ancho de la pantalla, el ngulo de visin y la distancia del observador a la pantalla, como se ha visto en la parte de teora.

3.5.- TRANSFORMACIONES DE VENTANA.


La ventana es la regin rectangular sobre la que se proyecta la imagen. Puede coincidir con la pantalla del ordenador completa o no. Estas transformaciones sirven para adaptar la escena al tamao de la ventana. Las coordenadas de la ventana se miden, en funcin del nmero de pixeles, relativas e principio, a la esquina inferior izquierda de la n misma. Sea cual sea el tamao de la ventana final ya no se realizan ms recortes, sino que se representan todos los puntos que estn dentro del volumen de vista definido antes, y lo que puede variar es el tamao de la representacin.
ESCET- UNIVERSIDAD REY JUAN CARLOS DE MADRID

Informtica grfica.

3.- Vista tridimensional. Pgina: 29

3.5.1.- Definicin de la Ventana.


Dado que OpenGL no proporciona rutinas de gestin de ventanas es el propio gestor de ventanas (window manager) que se selecciona el encargado de abrir la ventana. En nuestro caso utilizaremos las libreras auxiliares que se encargan de eso. Una vez abierta la ventana tenemos que definir su marco, para lo que se utiliza la siguiente funcin. void glViewPort (GLint x, GLint y, GLsizei width, GLsizei height) Define un rectngulo de pixeles dentro de una ventana en el cual se dibuja la imagen final. Los parmetros x, y definen la esquina inferior izquierda de la ventana. Los parmetros width, height definen el ancho y el alto, es decir el tamao de la ventana. Por defecto la ventana ocupa toda la pantalla. El ratio, es decir la relacin ancho/alto de la ventana debe ser igual a la del volumen de vista, pues sino la imagen se desvirta.

3.6.- MANEJAR LA PILA DE MATRICES.


Las matrices que hemos estudiado en este tema son slo la parte visible de una pila de matrices, una por cada tipo de operacin, que OpenGL nos permite gestionar de forma eficiente. Este mecanismo nos ayuda a construir modelos complejos a partir de otros ms sencillos, a posicionar los objetos definidos en un sistema de coordenadas local en una posicin concreta de la pantalla, etc..., todo ello de forma rpida y eficiente. Con OpenGL se puede controlar qu matriz es la primera de la pila y de esta forma componer como queramos las transformaciones, haciendo y deshaciendo en cada momento la transformacin. void glPushMatrix (void) Aade una matriz a la pila actual ponindola en la cabeza de esa pila, desplazando las anteriores un puesto hacia abajo. La pila actual se define con la funcin glMatrixMode (). Si se aaden demasiadas matrices se produce un error. Copiando la matriz actual en la cabeza de la pila sirve para recordar donde estoy en este momento, y por lo tanto se puede hacer una transformacin para colocar otro objeto en su posicin y volver al punto actual slo con recuperar la matriz. void glPopMatrix (void)

ESCET- UNIVERSIDAD REY JUAN CARLOS DE MADRID

Informtica grfica.

3.- Vista tridimensional. Pgina: 30

Descarta la primera matriz de la pila, dejando la segunda como cabeza de la misma. La matriz que se extrae de la pila se destruye. La matriz actual sobre la que se va a trabajar se activa con la funcin glMatrixMode (). Esta funcin sirve para deshacer un paso de transformacin, es decir volver un paso atrs y situarme en el punto donde estaba antes de hacer la ltima transformacin.

3.6.1.- Pila de Matrices ModelView.


Esta pila almacena al menos 32 matrices 4x4 que corresponde a las 32 ultimas transformaciones de modelo y vista que se han realizado. Inicialmente la cabeza de la pila contiene la matriz identidad.

3.6.2.- Pila de Matrices de Proyeccin.


Contiene una matriz en la que se almacenan las transformaciones de proyeccin que definen el volumen de vista. En cada ventana slo existir una matriz de proyeccin y por lo tanto esta pila slo tendr dos niveles. As pues, antes de modificar la matriz de proyeccin se debe cargar la matriz identidad.

ESCET- UNIVERSIDAD REY JUAN CARLOS DE MADRID

También podría gustarte