Sie sind auf Seite 1von 11

Grficas Computacionales

Transformaciones con OpenGL

ITESM-CEM

Departamento de Ciencias Computacionales

Material elaborado por:


Isaac Rudomn
rudomin@itesm.mx

Erik Milln
emillan@itesm.mx

Ma.Elena Meln
mmelon@itesm.mx

Expositor:
Jos Luis Gordillo
JLGordillo@itesm.mx

Contenido
Realizar transformaciones utilizando las funciones ya existentes en OpenGL:
Traslacin, Rotacin y Escala

Introduccin a los modos de matrices usados en OpenGL


Model-View y Projection

Mecanismo push & pop de matrices

Recordatorio de Transformaciones
Traslacin

Rotacin

Escala

Problema Concreto
Por definicin (default), la cmara est situada en el origen El vector que apunta hacia arriba es (0,1,0) Los valores negativos de Y corren hacia abajo Hay objetos a los 2 lados de la cmara, a diferentes profundidades.

Cmo podra lograrse ver todo lo que hay en la escena?

Posibles Soluciones
1. Alejar la cmara (moverla hacia atrs) 2. Alejar todos los objetos (moverlos hacia el frente)

Transformaciones en OpenGL
En OpenGL las transformaciones pueden aplicarse a:
Los lentes de cmaras Las posiciones de objetos

Existen 2 matrices separadas guardadas en OpenGL que determinan el estado de transformacin actual:
Una para el lente de la cmara Una para las posiciones de los objetos

Modos de Matrices
Modo Model-View Projection ID de OpenGL GL_MODEL_VIEW GL_PROJECTION Cambia Posiciones de objetos Volumen visto por la cmara

Se utiliza el mismo conjunto de funciones para los dos modos Se debe especificar con qu modo de matrices trabajar invocando a la funcin:
glMatrixMode(GL_MODEL_VIEW); glMatrixMode(GL_PROJECTION);

Modo Matricial Model-View


Modo Model-View ID de OpenGL GL_MODEL_VIEW Cambia Posiciones de objetos

Se debe especificar con qu modo de matrices trabajar invocando a la funcin: glMatrixMode(GL_MODEL_VIEW);

Modo Matricial Model-View


Este modo utiliza una matriz de coordenadas homogneas 3-D (4x4) que afecta a las posiciones de los vrtices en escena Esta matriz: Es parte del estado de OpenGL Se aplica a todos los vrtices al momento en que son dibujados Inicialmente es la matriz identidad (no tiene efecto en las posiciones)

Model-View?
Se conoce con este nombre porque transformar todos los objetos (modelos) en una escena o transformar la cmara (vista) son operaciones similares

Operaciones Matriciales
La matriz actual, A, puede ser alterada:
Cargando una nueva transformacin (A=T) Post-Multiplicando por la matriz ya existente (A=MT)

donde:
A es la matriz actual M es el estado previo de la matriz T es la transformacin que se quiere aplicar

Operaciones de Matrices
Carga de una matriz nueva:
1. 2. 3. 4. 5. Carga de la matriz identidad Carga de una matriz de traslacin Carga de una matriz de rotacin Carga de una matriz de escala Carga de una matriz arbitraria

Matriz Identidad
Antes de cualquier transformacin la matriz actual debe inicializarse en la matriz identidad ejecutando: glLoadIdentity( ); Si no se limpia la matriz actual con la matriz identidad, se combinarn transformaciones previas (dependiendo de la situacin a veces s se quiere hacer eso y a veces no)

Matriz de Traslacin
Se carga una matriz de traslacin cargando primero a la matriz identidad: glLoadIdentity(); Despus se llama:

glTranslatef(dx, dy, dz);


Que post-multiplicar a la matriz actual causando un desplazamiento en las direcciones (dx, dy, dz)

Matriz de Rotacin
Se carga una matriz de rotacin, cargando primero a la matriz identidad: glLoadIdentity(); Despus se llama:

glRotatef(theta, vx, vy, vz);


Que post-multiplicar a la matriz actual causando una rotacin de grados alrededor del eje de rotacin (vx, vy, vz)

Matriz de Escala
Se carga una matriz de escala cargando primero a la matriz identidad: glLoadIdentity(); Despus se llama:

glScalef(sx, sy, sz);


Que post-multiplicar a la matriz actual causando una escala de (sx, sy, sz) en las direcciones x, y, z respectivamente

Una Matriz Arbitraria


Alternativamente podemos cargar matrices que creemos nosotros mismos con: glLoadMatrixf(m); La matriz m es un arreglo de una dimensin con 16 elementos que corresponden a las columnas de la matriz homognea de transformacin de 4x4

Modificacin de una Matriz


En lugar de cargar una nueva matriz es probable que se requiera alterar la matriz ya existente:
1. 2. 3. 4. Post-multiplicar por una matriz de traslacin Post-multiplicar por una matriz de rotacin Post-multiplicar por una matriz de escala Post-multiplicar por una matriz arbitraria

Modificacin de una Matriz


Para modificar una matriz ya existente se ejecutan las mismas operaciones que en las lminas anteriores, con excepcin de la carga de la matriz identidad (esa operacin NO debe realizarse)

Orden de las Operaciones


Hay que recordar el orden en que las operaciones matriciales son aplicadas:

C = SRTp = S ( R ( T p ) )
En OpenGL se escribira:
glScalef(sx, sy, sz); glRotatef(theta, vx, vy, vz); glTranslatef(dx, dy, dz); glVertex3f(px, py, pz); La ltima operacin es la primera en ejecutarse!

Ejemplo Rotacin alrededor de un pivote


1. Comenzar con la matriz identidad : C I 2. Mover: C CT 3. Rotar : C CR 4. Mover: C CT-1

Resultado : C = TRT-1, As : p = TRT-1p Nota: Cada operacin corresponde a una llamada de una funcin el programa

Ejemplo Rotacin alrededor de un pivote


Rotar 30 grados alrededor de Z tomando como pivote el punto (1.0,2.0,3.0)
glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(1.0, 2.0, 3.0); glRotatef(30.0, 0.0, 0.0, 1.0); glTranslatef(-1.0, -2.0, -3.0); glBegin(GL_POINTS); glVertex3f(px, py, pz);

El Ratn
El ratn puede ser utilizado para rotar, trasladar y escalar objetos. La funcin utilizada para manejar los eventos del ratn seguira siendo til, lo mismo que la funcin de registro Los botones del ratn podran ser utilizados para los diferentes ejes, por ejemplo:
GLUT_LEFT_BUTTON selects the x-axis GLUT_MIDDLE_BUTTON selects the y-axis GLUT_RIGHT_BUTTON selects the z-axis

Retomando: la Cmara
Para que la cmara vea una escena completa normalmente tiene que trasladarse hacia atrs ( +Z) Para mayor flexibilidad se puede:
Apuntar a algo Orientarse en cualquier direccin

Lo cual se complica

La Funcin gluLookAt
Esta funcin provee una manera ms fcil de controlar la cmara La funcin gluLookAt construye la funcin adecuada para colocar la escena con respecto a la cmara Para usarla se debe:
Inicializar la matriz Tomar la posicin de la cmara Tomar la posicin de la vista Tomar la cul es la direccin hacia arriba Despus se pueden usar las transformaciones

La Funcin gluLookAt

La Funcin gluLookAt
Por ejemplo: glMatrixMode(GL_MODEL_VIEW); glLoadIdentity(); gluLookAt(1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
Posicin de la cmara

Objetivo al que se apunta

Direccin hacia arriba

Animacin de la Cmara
La cmara se puede animar utilizando la funcin gluLookAt Manejando intervalos de descanso puede lograrse la sensacin de movimiento gradual de la cmara El ratn o el teclado pueden servir para controlar el movimiento de la misma

Pilas de Matrices
En muchas ocasiones se quieren guardar las matrices de transformacin para uso posterior OpenGL mantiene pilas para cada tipo de matrices Se puede manipular cada pila con las operaciones:
agregar a la pila

glPushMatrix( ) glPopMatrix( )
sacar de la pila

Pilas de Matrices
Las transformaciones hechas entre un push y un pop no tienen efecto en ningn otro lado (similar al mbito de las variables locales) Por ejemplo:
Agrega matriz a la pila glPushMatrix(); // do transformations, ie. R(S(Tp)) // draw something Saca la matriz de la pila. Las transformaciones glPopMatrix() R(S(Tp)) se borran de la pila

Animacin de Transformaciones
Al igual que se puede animar la cmara, se puede animar la transformacin de los objetos dentro del escenario Para modificar diferentes objetos de manera independiente, separada, es necesario utilizar los mtodos push y pop de matrices

Das könnte Ihnen auch gefallen