Infografia I: Práctica 4: Transformaciones - Javi Agenjo at UPF

Infografia I: Práctica 4: Transformaciones

Última actualización 3/05/2010

En 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);
    
  • Se tienen que poder aplicar las transformaciones de forma interactiva (teclas, menu) (tanto rotaciones, como translaciones como escalados).
  • Poder aplicar tanto transformaciones locales como transformaciones a nivel de mundo, es decir, transformaciones con respecto al centro de coordenadas del objeto o con respecto al centro de coordenadas del mundo.
  • Pintar el mismo objeto a la vez en diferentes posiciones.
  • Suggeriments opcionals:
    • 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.

Enlaces útiles