jueves, 10 de octubre de 2013

Secuencia de las tranformaciones y Pilas

Secuencia de Tranformaciones:

El orden en que se aplican las transformaciones en OpenGL es al contrario de lo que parece intuitivo a primera vista. Por ejemplo:


glLoadIdentity();glTranslatef(0.5, 0.5, 1.0);
glRotatef(45.0, 1.0, 1.0, 1.0)

glBegin(GL_TRIANGLE);
glVertex3f(0.0, 0.0, 0.0);glVertex3f(1.0, 0.0, 0.0);
glVertex3f(0.0, 1.0, 0.0)
;
glEnd();

Primero carga la matriz identidad, luego multiplica por una matriz de translacion y por ultimo una de rotación. El resultado es que primero rota el triangulo y posteriormente lo traslada, esto es debido a que las multiplicaciones las realiza por el lado derecho:

La lectura se realiza de abajo arriba, hasta encontrar una funcion glLoadIdentity o glLoadMatrix. Las transformaciones que haya despues de la primitiva de dibujado glBegin - glEnd no se tienen en cuenta porque la primtiva ya ha sido renderizada.


Pila de Matrices
Una pila es un almacén con funcionamiento LIFO, el último en entrar es el primero en
salir, por lo que suele comparar a una pila de platos en la que sólo se puede dejar uno encima
de la pila o coger el superior que es el último depositado. La pila de matrices tiene el mismo
funcionamiento sustituyendo los platos por matrices. La matriz superior de la pila es sobre la
que se aplican las distintas transformaciones, multiplicándola por la matriz que generan las
disntintas funciones.
 
Para poder guardar una determinada matriz y posteriormente recuperarla OpenGL
dispone de las dos funciones comentadas: glPushMatrix() y glPopMatrix().
 
La función glPushMatrix() realiza una copia de la matriz superior y la pone encima de
la pila, de tal forma que las dos matrices superiores son iguales. Las siguientes transformaciones que se realizan se aplican sólo a la matriz superior de la pila, quedando la anterior con los valores que tenía en el momento de llamar a la función glPushMatrix().
 
La función glPopMatrix() elimina la matriz superior, quedando en la parte superior de
la pila la matriz que estaba en el momento de llamar a la función glPushMatrix().
Figura 1 PushMatrix y PopMatrix
 
En la función display() al llamar a la función glPushMatrix() se realiza una copia de la
matriz actual. La traslación en el eje Z se realiza en la matriz superior de la pila, es decir, en la
copia de la matriz, de tal forma que al llamar a la función glPopMatrix().

 Ejemplo:
glPushMatrix(); // Guardamos la transformacion del mundo
glTranslatef(cocheX, cocheY, cocheZ);
glRotatef(angulo, ejeX, ejeY, ejeZ);
RenderCarroceria();

glPushMatrix(); // Guardamos la transformacion del coche
glTranslatef(rueda1X, rueda1Y, rueda1Z);
glRotatef(anguloRueda1, eje1X, eje1Y, eje1Z);
RenderRueda();
glPopMatrix(); // Recuperamos la transformacion del coche

glPushMatrix();
glTranslatef(rueda2X, rueda2Y, rueda2Z);
glRotatef(anguloRueda2, eje2X, eje2Y, eje2Z);
RenderRueda();
glPopMatrix();

glPushMatrix();
glTranslatef(rueda3X, rueda3Y, rueda3Z);
glRotatef(anguloRueda3, eje3X, eje4Y, eje3Z);
RenderRueda();
glPopMatrix();

glPushMatrix();
glTranslatef(rueda4X, rueda4Y, rueda4Z);
glRotatef(anguloRueda4, eje4X, eje4Y, eje4Z);
RenderRueda();
glPopMatrix();

glPopMatrix(); // Recuperamos la transformacion del mundo

No hay comentarios:

Publicar un comentario