Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

Programación Gráfica y el Producto Escalar

Aplicaciones del producto punto en los juegos 3D


Antes de continuar con la explicación del producto escalar y sus aplicaciones en programación gráfica quiero dejar clara la diferencia entre cantidades escalares y vectoriales en el mundo de la programación. Una cantidad escalar no es mas que una sencilla variable de punto flotante (o entera si están usando matemáticas Fixed-Point). Ejemplos de cantidades escalares en los videojuegos son por ejemplo el nivel de vida, la cantidad de combustible, el tiempo restante y cualquier otra cantidad representable por un solo valor numérico. Por contra las cantidades vectoriales se representan por arrays donde cada uno de los elementos del array manejan una dimensión. Ejemplos de cantidades vectoriales en los videojuegos son la dirección en la que un personaje se mueve,la fuerza que recibe un objeto al ser golpeado el comportamiento de las luces y la posición en la que los objetos se encuentran en un instante dado. En el caso de las gráficas por computadora la diferencia es mas sencilla. Las cantidades escalares se representan por rectas unidemensionales y las vectoriales por las tradicionales flechas ancladas en el origen. En esta entrada vamos a ver el Producto Escalar.

Todo comienza cuando tenemos un par de vectores de cualquier dimensión atados como siempre por el origen. Para hacer un producto escalar se multiplican cada una de las componentes de uno de los vectores por las respectivas componentes del otro. Los resultados se suman y se obtiene una sola cantidad final. Digamos que tenemos los vectores U y V y sus respectivas componentes en 3D son Ux, Uy, Uz y Vx, Vy, Vz. El producto escalar, también conocido como producto punto se obtiene así: U.V = Ux*Vx + Uy*Vy + Uz*Vz. Esta operación tan sencilla es soprendentemente util en programación gráfica pero antes de ver todas sus aplicaciones veamos todo lo que esconde el aparentemente inocente producto escalar.

Pues resulta que ese inofensivo numerito que se obtiene de aplicarle a dos vectores el producto escalar es lo mismo que si multiplicáramos las longitudes de ambos vectores por el coseno del ángulo que hay entre ellos. Y eso sin necesidad de raices cuadradas ni operaciones raras para obtener ángulos. En el dibujo no lo puse por distraido pero cuando nos referimos a la magnitud de un vector se escribe la letra o nombre del vector entre dos pares de rayas verticales. Algo así como ||V||. Ahora veamos que es lo que podemos ganar por obtener en una sola cantidad la magnitud (como también se le llama a la longitud) de dos vectores y el coseno de un ángulo entre ellos. En la primera imagen se representan los vectores U y V en negro y azul. El ángulo que los separa en verde y la linea roja es el escalar representado.

El primer uso que tiene el producto punto en los videojuegos 3D es ver si 2 vectores son perpendiculares. De serlo el resultado va a ser cero o muy cercano a cero. Esto puede servir para saber si estamos ante una pared recta o inclinada respecto a nuestro punto de vista, es una de las maneras para determinar si una linea o polígono es o no visible. Sirve para ver que tanto refleja la luz en modelos de sombreado plano o en juegos donde el jugador se mueve por superficies irregulares como las montañas, puede combinarse con las normales del suelo para saber hacia donde se moverá. Otra aplicación directa es ver si el ángulo entre dos vectores es muy cerrado o muy abierto dependiendo del signo. Si el ángulo entre los 2 vectores está entre cero y 90 grados (cero y 0.5*Pi radianes) el signo del resultado va a ser positivo. Si es mayor de 90 y menor de 180 (mayor que 0.5*Pi y Pi radianes) el resultado va a ser negativo. Por cierto, como lo que el producto punto calcula es el ángulo interno, que siempre es el menor, el ángulo no puede nunca ser mayor de Pi radianes o 180 grados. Otra propiedad interesante del producto escalar es que no importa si estamos en el espacio 3D o en el mismísimo hiperespacio de 4 dimensiones. El producto escalar siempre va a ocurrir en el plano que contiene a los vectores.

En la segunda imagen se ve como se comporta el producto escalar conforme el ángulo entre ambos vectores aumenta.

Esas son apenas algunas aplicaciones del producto escalar tal y como está. Pero lo mas interesante es cuando combinamos el producto escalar con los vectores normales. Para los que no saben, un vector normal en el sentido escalar de la palabra es un vector que tiene una longitud igual a una unidad. Lo siguiente solo puedo explicarlo con un ejemplo. Supongamos que queremos rotar un cañón de modo que apunte hacia cierto objetivo pero no conocemos el ángulo al que debemos rotar. De momento no sabemos como vamos a obtener el angulo pero sabemos que cuando lo obtengamos vamos a obtener el seno y el coseno y los vamos a meter en una matriz de rotación. Para resolver este problema necesitamos 3 puntos: El punto que indique el centro de rotación del cañón, un punto en la boca de este y el punto en el objetivo al que va a disparar. Lo siguiente es obtener 2 vectores. Para esto trasladamos tanto el canón como el objetivo de modo que el origen coincida con el centro de rotación del cañon. Ahora la boca del cañon y el objetivo forman 2 vectores amarrados por el origen. Se obtiene su magnitud con el teorema de pitágoras y se calcula el producto escalar. El resultado del producto punto se divide por el producto de las longitudes de ambos vectores y obtenemos como resultado el coseno del ángulo que queremos rotar. Para obtener el seno recurrimos al complemento de ángulos o despejamos de la identidad trigonométrica fundamental de seno cuadrado mas coseno cuadrado de un ángulo cualquera es igual a uno. Esto sería para lograr una rotación lenta y dramática. Existe otro método para orientar una figura en cualquier posición dentro del espacio 3D en un solo paso.

Producto Punto y los Sistemas de Coordenadas

Sin duda lo mas importante que se puede hacer al combinar el producto punto con los vectores normales es expresar un vector en términos de otros vectores. Esto hace posible los cambios de cámara, la correspondencia de textura (texture-mapping), manipulaciones en el modelado de objetos y otras cosas que hacen posible eso que los gamers llaman 3D. En la segunda imagen vemos un vector de longitud 5 construido en un sistema de 3 vectores X,Y,Z. Los 3 vectores que definen nuestro espacio tienen una longitud de uno y el ángulo que los separa es recto. Esto en matemáticas se llama Base Ortonormal. Ahora bien, si hacemos un producto punto entre el vector de color azul y cada uno de los vectores X,Y,Z el resultado es la componente del vector en esos ejes. Lo interesante de esto es que esto también aplica a cualquier otro conjunto de vectores en el espacio. Aunque se obtienen muchas ventajas si se trata de un conjunto de vectores ortonormales. Por cierto, si notaron similitud entre el producto escalar y la multiplicación de matrices no es ninguna coincidencia. De hecho el multiplicar dos matrices de 1 por n y n por 1 siendo n un entero es exactamente lo mismo que hacer un producto escalar.

Una cosa mas, los procesadores de Intel a partir del Pentium 4 son capaces de hacer en una sola instrución máquina un producto escalar con precisión flotante de 64 bits. La instrucción se llama DPPD (Dot Product Packed Double). Pero por ahora sigamos con simple lapiz y papel, y la calculadora que hará las veces de nuestro GPU.

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

1 comentario »

  1. Hola, tengo una duda respecto a la ultima aplicación que explicas del producto escalar:
    Dices que al hacer el producto punto de V*X, obtenemos como resultado el componente X del vector V, y así con los vectores Y y Z. Lo que no entiendo es que sentido tiene esto, si para poder calcular el producto punto de X*V, ya hemos de saber de antemano los componentes vectoriales de V.

    Comentario por Miguel Angel Ruiz Conde | octubre 24, 2014 | 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: