Un campo de creciente interés, teniendo en cuenta las enormes cantidades de contenido requeridas en los juegos modernos, es la generación de contenido procedural. Esta técnica consiste en reemplazar datos almacenados por datos generados mediante la ejecución de un procedimiento, de ahí el nombre “procedural”. La aplicación de estas técnicas permite ver la enorme cantidad de información que puede almacenarse en solo 96K.
Aprovechando este “fin de semana largo”, estuve explorando la geometría procedural y, en particular, la generación de terrenos mediante la utilización de fractales. Se denomina fractal a una entidad geométrica que presenta la característica de ser “autosimilar” a distintas escalas, o sea que si observamos una pequeña porción del mismo se “parecerá” en un cierto sentido a la entidad en su conjunto.
Un fractal muy utilizado para la creación de terrenos aleatorios es el denomiado como “fractional Brownian motion” (fBm), consistente en la suma de distintas señales de ruido con bandas limitadas y con un factor de escala adecuado (para evitar que las altas frecuencias tengan amplitudes comparables a las bajas frecuencias). En la siguiente imagen puede observarse un terreno generado mediante esta técnica:

Imagen de un terreno fractal (algoritmo fBm).
Sin embargo esta clase de terrenos no resulta visualmente muy atractiva, ya que es simétrico (en cuanto a forma general, no en cuanto a los detalles ya que es aleatorio) respecto al plano “h = 0”, problema que no puede resolverse utilizando fractales del tipo fBM. Una solución, descrita por Ken Musgrave en su tesis doctoral junto a muchas otras, consiste en el uso de multifractales. En mi caso particular, me decidí por el algoritmo descrito por el mismo Ken en la sección 2.3.2.5.1 de su tesis.
El resultado obtenido puede observarse en la siguiente figura:

Imagen de un terreno multifractal.
El código utilizado para crear y navegar en tiempo real sobre este terreno puede obtenerse en mi repositorio en Google Code (se sale con ESC, las flechas giran en torno al punto central, PgUp/PgDn controlan la distancia).
Pueden verse otros terrenos mucho más espectaculares (aunque no generados para renderizarlos realtime) en MojoWorld.
[Nota: Agregué en la home del proyecto los binarios para descargar. Requieren tener instalados “los componentes runtime” del Visual C++ 9, que puede descargarse desde aquí.]