¿Cómo se hizo el fuego de DOOM?

El fuego de DOOM se hizo con una paleta de colores y un mecanismo ingenioso se obtenía un resultado espectacular. 

Hace 25 años John Carmack, Tom Hall y John Romero lanzaron DOOM, uno de los videojuegos de disparos en primera persona pioneros en muchos aspectos: gráficos 3D, juego en multijugador en red, soporte para modificaciones de usuarios (MODs), entre otros.

En aquella época hacer un videojuego de este calibre, sin motores gráficos como Unity3DUnreal Engine o Godot Engine, era toda una proeza. Una de las cosas más llamativas de este juego fue la recreación de la animación del fuego en la pantalla de inicio o que aparecía durante el juego.

Simplemente con una paleta de colores y un mecanismo ingenioso se obtenía un resultado espectacular. Es un gran de ejemplo de cómo obtener un gran efecto con pocos recursos.

Mecanismo del fuego de DOOM

El mecanismo del fuego de DOOM (explicado por Fabien Sanglard) se basa en utilizar un mapa de calor. Utilizando un array del tamaño de la pantalla se rellena su contenido con 37 valores desde 0 hasta 36. Cada uno de estos valores estará asociado a un color, desde blanco hasta negro, pasando por amarillo, naranja y rojo. La idea es modelar cómo sube y baja la temperatura de las partículas de fuego.

Inicialmente pintamos nuestra pantalla de color negro (es decir, con valores 0) y colocamos una fila de píxeles blancos abajo del todo. Esta línea será el origen del fuego.

En cada refresco de la pantalla el calor se propaga hacia arriba, por lo que tenemos que calcular un nuevo valor de cada pixel. El valor de cada pixel depende del pixel inmediatamente inferior. En el código que se muestra a continuación, el índice 0 sería la esquina inferior izquierda y el índice FIRE_HEIGHT * FIRE_WIDTH – 1 sería la esquina superior derecha.

codigo fuego de DOOM

Observando el código vemos que la primera línea nunca se actualiza (la iteración de la variable “y” empieza en el índice 1 y no en el 0). La línea rellenada con ceros es la generadora del fuego. Esta simple versión de “enfriamiento lineal” produciría una salida uniforme muy aburrida:

como se hizo el fuego de DOOM

Si modificamos la función spreadFire() un poco para añadir cierta aleatoriedad podemos conseguir un resultado mucho más llamativo. Esta aleatoriedad modifica cómo de rápido se enfría un punto de calor.

codificacion fuego de DOOM

Y produce un resultado mucho más vistoso:

explicando el fuego de DOOM

Si además de propagar esta aleatoriedad de arriba abajo lo hacemos de izquierda a derecha tenemos nuestro efecto:

function fuego de DOOM

fuego de DOOM

ComparteShare on Facebook3Share on Google+0Tweet about this on TwitterShare on LinkedIn0
Carlos Sánchez Cazorla

Carlos Sánchez Cazorla

Carlos Sánchez Cazorla es subdirector del Área de Ingeniería de Loyola Leadership School.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *