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 cocheglPushMatrix();
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();
glTranslatef(rueda4X, rueda4Y, rueda4Z);
glRotatef(anguloRueda4, eje4X, eje4Y, eje4Z);
RenderRueda();
glPopMatrix();
glPopMatrix(); // Recuperamos la transformacion del mundo
No hay comentarios:
Publicar un comentario