Texturas mediante fórmulas matemáticas

Texto: Miquel Barceló


Cuando empezamos a hablar de las texturas ya adelantamos que se trataba de un tema mucho más complejo que el "poner un dibujo encima de un objeto". En este artículo haremos hincapié en usos menos comunes de las texturas. Paradójicamente, quizás sea por eso mismo que estas técnicas gocen de bastante popularidad en la demoscene, donde la inventiva y la originalidad se valoran incluso más que la técnica. Pero antes, completaremos un tema que dejamos pendiente el mes pasado.

 

Coordenadas de mapeado esféricas

Como en el caso del cilindro, las coordenadas de mapeado de una esfera se obtienen a partir de un cambio de sistema de coordenadas. En este caso, el cambio se realiza entre el sistema de coordenadas cartesianas (el más utilizado, en el que un punto se expresa a partir de sus coordenadas X, Y y Z) al sistema de coordenadas esféricas, en el que la posición de un punto se expresa en función de la distancia al origen (r) y dos ángulos (q y j).

Las ecuaciones que gobiernan el cambio de coordenadas de un sistema al otro son:

X=r*sin(j)*cos(q)

Y=r*sin(j)*sin(q)

Z=r*cos(j)

Y las inversas:

r = raíz (X2+Y2+Z2)

q = atan (Y/X)

j = acos(Z/raíz (X^2+Y^2+Z^2))

donde:

- "atan()" es la arcotangente, es decir, la inversa de la tangente.

- "acos()" es el arcocoseno, el inverso del coseno.

- "raíz()" es la raíz cuadrada.

"En coordenadas esféricas la posición de un punto se representa a partir de la distancia al origen y dos ángulos"

De forma análoga a lo que sucedía en el caso del cilindro, si utilizamos las coordenadas de mapeado esféricas sobre una esfera, el valor de ‘r’ será constante en toda la superficie de la esfera (que al fin y al cabo, es lo que cuenta). Esto es así porqué ‘r’ se corresponde con el radio de la esfera. En consecuencia, ‘r’ se suele utilizar tan sólo en mapeado 3D, nosotros utilizaremos q como coordenada U de la textura y j como coordenada V. Puesto que sabemos el valor del radio de la esfera, podemos utilizar:

V= acos(Z/r)

Algo que nos ahorra hacer unas cuantas multiplicaciones y una raíz. Pero aún quedan unos cuantos detalles que ya comentamos con el mapeado plano y el cilíndrico:

- Establecer la posición de la esfera (Pos) como origen de coordenadas.

- Utilizar los ejes del objeto (EjeX, EjeY y EjeZ) para orientar correctamente la textura.

- "Normalizar" las coordenadas de mapeado.

con lo que las fórmulas quedan como:

U= atan[(EjeX·(P-Pos))/ (EjeY·(P-Pos))]/2p

V= acos[EjeZ·(P-Pos)/r]/p

"Aparte de los tres métodos clásicos de obtener las coordenadas de mapeado de un objeto, se pueden utilizar muchos otros según convenga"

Haciendo esto, obtendremos las coordenadas con valores entre 0 y 1. Ahora sólo queda adaptar las coordenadas al tamaño de la textura:

U’=frac(U*factor_u)*ancho_textura

V’=frac(V*factor_v)*alto_textura

Recordemos que "factor_u" y "factor_v" eran unos parámetros que nos permitían modificar el tamaño aparente de la imagen sobre el objeto. En el caso de las esferas, indican cuántas veces se repetirá la textura en la dirección horizontal y la vertical.

Representación de las coordenadas esféricas.
El vector azul es (P-Pos) y los rojos su proyección sobre los ejes. Lo normal es que sólo se utilicen los ángulos para definir el mapeado.

Coordenadas de mapeado alternativas para el plano.
En lugar de utilizar directamente las proyecciones sobre los ejes, se calcula el ángulo q y el radio 'r', que se utilizan como coordenadas U y V, respectivamente.

El programa de ejemplo mostrando un par de objetos con textura.
Parece que todo funciona correctamente.
  Siguiente