Infografia I: Práctica 4: Transformaciones
Última actualización 3/05/2010En esta práctica se trata todo el tema relacionado con las transformaciones geometricas, cómo posicionar objetos en nuestro entorno y cómo moverlos, rotarlos y escalarlos. Tambien se profundiza en el concepto de sistema de coordenadas.
Para ello se tendrá que hacer uso de las transformaciones mediante matrices. Es importante tener fresca toda la teoría de algebra asociada a matrices (multiplicacion de matrices, propiedades de las matrices, etc).
Esta práctica es clave para moverse con facilidad por entornos 3D.
Material
Requisitos
- Implementar las siguientes partes del framework:
class Matrix33:
void setScale(float sx, float sy);
void setRotation(float ang);
void multiply( const Matrix33& m );
void transform( Point& vector );
void translateLocal(float dx, float dy);
void scaleLocal(float sx, float sy);
void rotateLocal(float ang);
void translateWorld(float dx, float dy);
void scaleWorld(float sx, float sy);
void rotateWorld(float ang);
- Implementar otras figuras aparte del triangulo.
- Moverte con las teclas del cursor. (mirar este enlace para saber como usar el callback para captar teclas especiales como los cursores).
Fallos comunes
- Crear un vector de matrices con todas las transformaciones a aplicar. Las transformaciones tienen que acumularse en la matriz model. Solo tiene que haber una matriz por objeto.
- Acumular los vertices transformados en algun contenedor global. Debeis seguir el ejemplo: se crea el vector de puntos, se transforman, se pintan y se destruyen, para cada frame que pintamos. Solo tiene sentido guardar los puntos si no estan transformados (para tener diferentes figuras).
- Al multiplicar dos matrices o matriz por vector, ir guardando el resultado en el mismo contenedor del que leemos, esto da calculos erroneos, haced una copia siempre que leais y escribais en la misma instancia, p.e. Matrix33 copia = *this;
- Cambiar el prototipo de la funcion multiply o transform para añadirle mas parametros o cambiar el retorno, no hace falta, multiply modifica la propia matriz, y transform modifica el punto que le pasamos por parametro.
- Deshacer transformaciones para aplicar rotaciones. No es necesario si las rotaciones son en el centro del sistema, ya sea el sistema de mundo o el sistema local.
- Tratar de acceder a la variable Model del main desde alguna clase de framework.cpp, no es necesario ni tiene sentido, pensad que las clases del framework son genericas, deberian funcionar en cualquier programa, no necesita conocer lo que hay fuera.