Generación procedural: Perlin noise

En el contexto de los videojuegos, seguramente alguna vez habréis oído el término generación procedural. Hablamos de generación procedural al referirnos a juegos cuyos escenarios no han sido diseñados por personas, sino que se generan de forma aleatoria. Un ejemplo de esto es Minecraft.

Si lo deseas, puedes ver directamente el resultado de aplicar esta técnica para generar mapas: World generator.

Captura de Minecraft

Para construir estos escenarios, es necesario utilizar alguna función que permita obtener números aleatorios con los que generar nuestro mundo, una función que genere ruido, pero no todo el ruido es igual.

Es importante que este ruido parezca natural. En la siguiente imagen puedes ver ruido completamente aleatorio, a la izquierda, y ruido tipo Perlin a la derecha.

Comparación de ruido aleatorio (izquierda) y ruido Perlin (derecha).

Aunque el ruido aleatorio tiene muchos usos, es demasiado rugoso como para parecer natural.

Al observar la naturaleza, es fácil darse cuenta de que muchas cosas tienen un aspecto fractal. El ejemplo más común es la altura de las montañas. Estas tienen grandes variaciones en altura (las montañas), variaciones medianas (colinas), variaciones pequeñas (rocas), variaciones minúsculas (piedras)... y podríamos seguir. Este mismo fenómeno ocurre en muchos otros casos: las olas en el mar, las ramas de los árboles, los movimientos de las hormigas, los patrones del mármol...

Siempre se observa el mismo patrón de grandes y pequeñas variaciones. Ken Perlin se dió cuenta de este fenómeno y decidió crear una función de ruido que lo recreara. El ruido Perlin consiste en sumar una gran cantidad de funciones de ruido de diferentes escalas.

Octavas Perlin

Una función de ruido aleatorio no es más que una función que devuelve números aleatorios, que después son interpolados para hacer una función continua.

Interpolación de ruido

Ahora, al tomar varias de estas funciones, con varias frecuencias y amplitudes, y sumarlas, se obtiene ruido Perlin.

También se puede hacer lo mismo en 2 dimensiones, interpolando una función de ruido 2D. Así, se genera un mapa de alturas. En la imagen de abajo se muestra un mismo mapa coloreado de 4 formas distintas.

Ejemplo de coloreado de Perlin 2D (small)

Este mapa tiene muchas aplicaciones, como generar terrenos, mapas de calor, nubes o imágenes psicodélicas. Puedes ver un ejemplo de mapa de alturas interactivo que hice hace algún tiempo: World generator.

Puedes saber más sobre perlin noise en la página de Hugo Elías, de donde he sacado un par de figuras. Y si te ha gustado, ¡ya puedes trastear!

Sé el primero en comentar!