La creación de entornos virtuales exige la modelización de ingentes cantidades de datos para la formación de superficies que recreen diferentes escenarios. La naturaleza fractal de nuestro mundo permite la utilización de funciones matemáticas variadas para la automatización de estas tareas. Árboles, terrenos, nubes, fuego etc. se construyen con diferentes técnicas muchas de ellas basadas en la autosemejanza, base de familias complejas de fractales. Las funciones que generan el denominado “ruido de perlin” son de aplicación en estos casos.
Realizaremos un análisis del concepto aplicado en una dimensión, su generalización a dos dimensiones (terrenos) es inmediata, y no aporta interés didáctico inicial.
Funciones de ruido: “Noise functions (NF)”
Una NF es fundamentalmente un generador de números pseudo aleatorio que tiene la propiedad de generar el mismo número ante un valor de entrada o “semilla” determinado.
Una función cualquiera, como por ejemplo y=cos(x) siempre devuelve el mismo valor de “y” para un valor concreto de “x”.
Si utilizamos dicha función para generar un modelo geométrico, podemos volver a obtener el mismo modelo posteriormente utilizando idénticas variables. Sin embargo la función no puede ser usada en la representación de un perfil de dunas o montañas porque presenta una repetición periódica, un patrón, que le resta naturalidad. Las dunas del desierto se asemejan unas a otras pero no son idénticas.
Un patrón repetitivo resta credibilidad a un escenario. Un modelo pseudo aleatorio puede generar un perfil en el que no se identifican repeticiones. |
Una función aleatoria que no sea controlable no permite restituir o volver a obtener unos valores previos, ya que cada vez devolverá valores diferentes.
Una “función de perlin” permite mezclar la ventaja de la generación aleatoria (ruido) con el control de una función clásica. Además se pueden obtener valores intermedios entre dos valores dados, dotando de continuidad por lo tanto a estas funciones. Si aumentamos la escala de representación necesitaremos obtener estos puntos intermedios para mantener la resolución de las imágenes generadas. Si queremos realizar una representación con diferentes niveles de detalles con técnicas LOD, estos aspectos se encuentran entre los más importantes.
Por último es necesario suavizar la curva obtenida para evitar “picos” y “valles” muy pronunciados en general no deseados y que generalmente no son realistas.
Al obtener imágenes a diferentes escalas es necesario mantener la resolución de las mismas incorporando nuevos puntos. La función debe permitir realizar esta operación para asegurar una calidad razonable en la representación. |
En [1] se propone el uso de un generador de números psudoaleatorio, basado en el uso de números primos, que devuelve un número en el intervalo [-1,1] para cada valor entero que se le suministre.
function Noise (32-bit integer: x) x = (x<<13) ^ x A=15731 B=789221 C=1376312589 return ( 1.0 - ( (x * (x * x * A +B) +C) &7fffffff) / 1073741824.0) end Noise function |
Función “Noise” |
Los tres primeros números son primos. Se puede experimentar con diferentes valores para generar nuevas curvas. La utilización de las tres variables (A, B y C) se ha realizado por claridad de la expresión.
El código tiene dos líneas principales.
Primero “agitamos” el valor de entrada de una forma controlada con el desplazamiento de sus bits con
x = (x<<13) ^ x
Para generar el número en el intervalo citado [-1,1] usamos el valor de su extremo superior (1) y le restamos otro valor entre [0,2].
La obtención del valor a restar se realiza determinando un nuevo valor intermedio con el uso de los números primos mencionados.
x * ( x * x * A + B) + C
El número generado tiene que ser positivo, por lo que se le aplica una máscara lógica que ponga su primer bit a cero (positivo)
&7fffffff
Si dividimos este ultimo resultado por el máximo entero obtendríamos un valor entre cero y uno, por lo que se divide por MaxEntero/2 = 230
Octavas
Para componer la función final se suma la función “Noise” con otras “semejantes” cuyas frecuencias van doblándose correlativamente.
La frecuencia es la inversa de la longitud de onda F=1/L, da noción de la periodicidad de la onda
Mientras que la amplitud nos da el tamaño (altura de nuestra onda)
Cada una de estas funciones que doblan la frecuencia anterior, similarmente a la separación entre dos notas iguales consecutivas en un piano, se denominan “octavas”.
Una función y su primera octava pueden componer una nueva función |
Una función pseudos aleatoria y su octava sumadas |
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
Una función pseudos aleatoria y sus octavas sumadas Es posible añadir los armónicos de la propia función o realizar una mezcla entre funciones semejantes, añadiendo más diversidad en la creación de las curvas. El número de octavas que se incorporen añaden detalles en escala progresiva. A mayor número de octavas mayor complejidad en la curva obtenida, permitiendo simular acantilados escarpados. |
El factor de persistencia indica la incidencia o peso de los armónicos, añadiendo un punto de control sobre la suavidad de la curva.
Valores altos de persistencia añaden mayor cambio a lo largo de la curva.
Al reducir el valor de persistencia, la influencia de las octavas no genera las formas afiladas.
Para una frecuencia dada hay una única amplitud para cada valor de persistencia, que llamamos "Amplitud de cada frecuencia"
Mandelbrot define el ruido, "Noise", como "Alta frecuencia con baja persistencia"
El proceso de cálculo se realiza en varias etapas.
Primero determinamos la función generadora de ruido, como se ha explicado:
Los valores intermedios entre dos puntos se pueden obtener por interpolación lineal, cuadrática, cúbica etc.
A continuación, se "suaviza" la función tras la interpolación:
Y se integra el conjunto, acoplando los armónicos de la función sumando sus componentes:
[1] Página explicativa del ruido de perlin con pseudocódigo. Esta página es la referencia principal de la implementación que se presenta en este trabajo. “http://freespace.virgin.net/hugo.elias/Perlin Noise.htm”
Imagen de síntesis
No hay comentarios:
Publicar un comentario