Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

Programación Gráfica y la Rotación Puesta en Práctica

–Como rotar y orbitar una figura en 3D–

En una entrada anterior se explicó todo lo que había que saber sobre la rotación de imágenes vectoriales. Ahora vamos a ver como se aplica lo ya visto. Para rotar una imagen vectorial un ángulo determinado usando Z como el eje de rotación lo que hacemos es aplicarle a todos los vértices que la componen las fórmulas de rotación:
Nueva_X = Vieja_X * coseno(angulo) – Vieja_Y * seno(angulo)
y
Nueva_Y = Vieja_X*seno(angulo) + Vieja_Y * coseno(angulo).

Y al igual que como sucedió con la traslación y escala, la rotación tiene efecto en el vector que encadena a cada vértice con el origen del sistema coordenado y no directamente con el vértice. Lo que significa que las rotaciones son siempre con respecto al origen.

En la primera imagen vemos la nave rotada sucesivamente en montos de 45 grados sin centrarse en el origen en rojo y la misma nave primero trasladada para que su centro coincidiera en el origen antes de aplicar la misma rotación. De este modo puede apreciarse como los objetos vectoriales siempre rotan con respecto al origen. A veces cuando se desea conseguir el efecto de que algo orbita alrededor de un punto se hace la rotación con origen en el punto sobre el que va a rotar. Pero la mayor parte del tiempo las rotaciones se hacen siempre respecto a un punto interior de la propia figura.

Ahora bien, se han de estar preguntando como se hace para que una figura en cualquier lugar del espacio rote respecto a su propio centro sin que se ponga a dar vueltas como un insecto en torno a una luminaria. La respuesta es que no se puede, al menos no sin involucrar una operación de traslación que primero desplace la figura hasta el origen y otra al final para regresar a la figura al lugar donde se encontraba al principio. De hecho, en programación gráfica, toda la geometría se hace combinando muchas transformaciones geométricas. Por fortuna existe un método para hacer esas transformaciones muy rápido, un método que veremos en la siguiente entrada, pero por ahora sigamos con las rotaciones.

Hay una cosa mas que deben de saber sobre las rotaciones. Que como la precisión de los números de punto flotante influye directamente en la velocidad y el espacio en memoria suelen usarse flotantes de 32 o a lo mucho 64 bits. Esto hace que exista un error que va acumulándose conforme se llevan a cabo las rotaciones. Si a los valores de los vértices de la figura les aplicamos muchas rotaciones va a llegar un momento en el que la figura se va a comenzar a deformar. Para evitar este desagradable efecto lo que se hace es conservar los valores originales de la figura y mostrar la figura ya transformada en pantalla. Voy a tratar de explicarlo: Digamos que ustedes quieren que una figura centrada en el origen se mantenga dando vueltas hasta que el usuario presione algún botón. Si aplicamos tablas precalculadas y grados de 8 bits como se explicó en la nota sobre las rotaciones haríamos un ciclo infinito en el que rotáramos la figura un grado de 8 bits cada vez. Bueno, si hacemos esto la figura comenzará a deformarse luego de unas cuantas vueltas. Ahora veamos como evitarlo. De nuevo hacemos ese mismo ciclo infinito, solo que ahora en lugar de rotar los vértices un grado en cada iteración lo que hacemos es incrementar un contador inicializado en cero y pasárle su contenido como el ángulo en el que la figura va a rotar. En la iteración cero va a rotar 0 grados, en la 1 un grado y así sucesivamente. Para evitar el error acumulado en lugar de actualizar los valores de los vértices usamos los valores devueltos por la rotación para desplegar la figura en pantalla y luego nos olvidamos de ellos.

En general este es el principio de las Coordenadas de Modelado, que es asignarle un espacio propio a los modelos básicos a partir del que se hacen los modelos finales que van a aparecer en el sistema de Coordenadas Mundiales. Para explicarlo piensen en un ejército de miles de robots idénticos cada uno en haciendo sus propios movimientos en su propio lugar. Aunque en el campo de batalla representado en Coordenadas Mundiales parezca que son muchos todos se crean a partir de un mismo modelo de robot creado en su propio espacio independiente al que se le han hecho miles de copias y a cada una se le ha aplicado una transformación geométrica diferente.

Es oportuno que les diga un par de cosas sobre las transformaciones geométricas, sobre todo las de rotación y escala, y es que rara vez se utilizan de la manera en que las acabamos de ver. La mayor parte del tiempo queremos rotar una imagen de modo que se alinea con un vector determinado como un cañon que apunta directo hacia el blanco o un escuadrón de naves espaciales que vuelan en una formacón determinada queremos escalar una pieza de modo que rellene el espacio vacio que dejan otros dos objetos. No caigan en la trampa por ejemplo de querer obtener un ángulo para alinear una figura a partir de funciones trigonométricas inversas, y aunque esta operación es posible en las avanzadas computadoras actuales verán que todo puede arreglarse echando mano de amistosas sumas y multiplicaciones.

Antes de continuar con esta serie de Programación Gráfica usando lapiz y papel, les advierto que a partir de la siguiente entrada vamos a comenzar a hacer cálclos que aunque son sencillos puede que les resulten en extremo tediosos. Si bien es posible llevarlos a cabo a mano o con una calculadora sencilla, les recomiendo que si tienen poca paciencia se consigan una calculadora capaz de hacer cálculos vectoriales (Sharp maneja unas a muy buen precio) o tengan cerca de la libreta una computadora con un programa de hoja de cálclo sencilla. Pues hacer los cálculos a mano va a llevarles casi media hora por cada transformación geométrica con los métodos que pronto vamos a ver.

Anuncios

octubre 21, 2011 - Posted by | Uncategorized | , ,

1 comentario »

  1. Hasta ahora, muy interesante la cosa.

    Comentario por Gorgornold | enero 19, 2012 | Responder


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: