| PRINCIPAL | GRAFICOS 3D | GRAFICOS 2D | MATEMATICAS | TUTORIALES | FRACTALES | FUENTES | LINKS |
PERLIN NOISE
por
Olmo del Corral (olmobrutall@hotmail.com)
Perlin Noise |
Este mapa es probablemente el más útil y famoso
de todos los que hay, tanto es así que creo que su creador, Ken
Perlin, tiene un oscar por ello. El mapa perlin es interesante porque tiene dos propiedades: Completa aleatoriedad y coherencia (es decir, que no hay mucha variación entre dos puntos contiguos, como pasa en White Noise). |
Es muy útil pues hay multitud de efectos naturales que son su fiel reflejo (nubes o montañas son lo más típico), y otra multitud que son pequeñas modificaciones (la madera, o como verás, hasta las sombras del fondo de una piscina hacen uso de ella).
![]() Noise |
La creación del efecto es relativamente sencilla, consiste en hacer una cuadrícula con cuadros de N pixels de lado y, a cada vértice de los cuadrados, asociarle un número aleatorio. Los píxeles que no estén exactamente encima de uno de estos vértices (la mayoría), sino en el interior de algún cuadrado, tomarán el valor de la interpolacion de los numeros aleatorios de los vértives de éste. Con este algoritmo se consiguen imágenes como las de la izquierda (Noise). |
Hay varias fórmulas matemáticas para la interpolación de puntos. En la página de Hugo se ven varias:
Interpolación Linear: Es rápida pero produce visibles picos en los vértices, quedando una imagen de no muy buena calidad. Hace uso de 2 Puntos en 1D, 4 en 2D, 8 en 3D
Interpolación Cosenoidal: No produce picos en los vértices, pero todos ellos tienen derivada 0. luego se ve claramente donde se encuentran. Usa 2 Puntos en 1D, 4 en 2D, 8 en 3D
Interpolación Cúbica: De muy buena calidad, pero tarda bastante en calcular, pues el algoritmo es complejo y hace uso de muchos puntos: 4 en 1D, 16 en 2D, 64 en 3D!!!. Además, puede hacer interpolaciones de puntos en un recorrido ([0...255] por ejemplo) que se salgan un poco de ese recorrido.En mi ejemplo voy a usar una interpolación similar a la cosenoidal pero más rápida. Basada en el polinomio 3x^2-2x^3.
Este polinomio tiene f '(0)=f '(1)=0, f(0)=0 y f(1)=0. Además es el polinomio más pequeño que cumple estas características.
Utilizo este polinomio porque es mucho mas rápido de valuar que el equivalente cosenoidal: 0.5-0.5*cos(x*pi) y tiene una forma muy similar. Este es el código: a y b son dos valores cualesquiera, y x es la proporción de cercanía entre uno y otro: 0 si esta en a, 1 si b.
float InterPol(float a, float b, float x){ //a altura 1a |
Finalmente, algo que creo que Hugo no clarifica es la manera bidimensional
y tridimensional de usar la Interpolación Lineal, Cosenoidal o Polinómica
(con la cúbica seria mas complicado). Esto es lo que hay que hacer para
interpolar el punto en un cuadrado (2D):
int a=InterPol(Punto(0,0),Punto(0,1),frac_x); |
![]() |
Esta es la interpretación geométrica: |
Después de este reto de visión espacial, solo queda decir que variando el tamaño de los cuadrado (periodo) y la amplitud de los valores se consiguen distintas imágenes Noise, superponiendo todas se consigue una imagen pseudo-fractal con distintos niveles de detalle como la que aparece al principio de esta pagina, este efecto se ve claramente en la pagina de Hugo Elias :
Este es el código final de mi mapa Perlin Noise:
float PerlinNoise(float x,float y,int width,int octaves,int seed){ |
| PRINCIPAL | GRAFICOS 3D | GRAFICOS 2D | MATEMATICAS | TUTORIALES | FRACTALES | FUENTES | LINKS |