Muchos de nuestros objetos del universo 3D serán estáticos, como
paredes, terrenos y objetos de decoración, pero otros objetos requerirán
movimiento. En 3D existen tres tipos de movimientos básicos que combinados
conforman todas las alternativas necesarias. Estos movimientos se denominan
transformaciones, dado que consisten en transformaciones lineales de
coordenadas y son los siguientes:
·
Traslación (translation): consiste en mover cada punto por una
distancia constante, en una dirección específica.
·
Rotación (rotation): movimiento de un objeto
siguiendo una ruta circular
·
Escalado (scaling): incrementa o disminuye
el tamaño de un objeto, por un factor de escalar.
Transformation Matrix
Para aplicar cada uno de los tres movimientos a una
malla compuesta por triángulos, sería necesario desplazar cada uno de los
vértices de la misma al lugar correspondiente. Esta operación es engorrosa para
objetos de mucha complejidad y se torna aún más complicado cuando se quieren
acumular movimientos, por ejemplo: trasladarse, luego rotar y luego volver a trasladarse.
Es por ello que las APIs gráficas cuentan con una herramienta
destinada a facilitar el movimiento de objetos denominada Transformation
Matrix. Esta matriz tiene una estructura de 4x4:
La matriz es utilizada para representar todas las
transformaciones necesarias para mover un objeto 3D en el universo. Los valores
contenidos en la matriz son utilizados para mover, rotar y escalar objetos.
Cada fila de la matriz representa la coordenada en el universo de cada eje. La primer
fila contiene la posición del eje X, la segunda del eje Y y la tercera del eje
Z. Cada elemento de la matriz representa una porción de la transformación. La
matriz es inicialmente cargada con la matriz identidad.
La ventaja de almacenar los movimientos de los objetos 3D con
esta matriz y no con vectores sueltos es que todos los movimientos, rotaciones
y escalados a hacer a un objeto en un cuadro de animación pueden almacenarse en
una sola matriz. Esto es gracias a la multiplicación de matrices.
Si queremos mover un objeto, después rotarlo y luego volverlo a
mover podemos crear las matrices necesarias para cada movimiento y luego
multiplicarlas todas, y así obtener una sola matriz resultante que engloba todo
el movimiento completo.
De esta forma, la API gráfica solo recibe una única matriz que
representa el movimiento total de un objeto 3D en un momento determinado, y se
reduce el almacenamiento de memoria requerido.
No hay comentarios.:
Publicar un comentario