The Paris Catacombs: Recreating the Labyrinth of Six Million Skeletons in CityEngine

Published on January 06, 2026 | Translated from Spanish
Vista de CityEngine mostrando la generación procedural de las Catacumbas de París, con el editor de reglas CGA abierto y la vista 3D de túneles laberínticos y paredes de huesos generadas automáticamente.

Las catacumbas de parís: recreando el laberinto de seis millones de esqueletos en cityengine

Bajo el suelo de la Ciudad de la Luz se extiende uno de los mayores osarios del mundo: las Catacumbas de París. Esta vasta red subterránea, que originalmente fueron canteras de piedra caliza, fue transformada entre 1786 y 1814 en el último reposo para seis millones de parisinos, cuyos restos fueron trasladados desde cementerios abarrotados. Lo que comenzó como una solución de saneamiento urbano se convirtió en un laberinto mortal que ha capturado la imaginación popular y atrae a valientes exploradores urbanos. 💀

El laberinto donde la ciudad se encuentra con la muerte

El verdadero misterio de las Catacumbas no son solo los millones de cráneos y fémures que adornan sus paredes, sino la escala laberíntica de su diseño. Con más de 300 kilómetros de túneles que serpentean bajo París, solo una pequeña fracción está abierta al público oficialmente. A lo largo de los años, numerosos exploradores se han perdido en esta oscura red, algunos permanentemente. La abrumadora presencia de la muerte se manifiesta no solo visualmente, sino a través de una atmósfera opresiva que ha generado incontables relatos de fenómenos paranormales y encuentros fantasmales. 🌫️

Características únicas de las Catacumbas:
  • Paredes compuestas por patrones geométricos de cráneos y huesos largos
  • Túneles que se extienden 300+ km bajo París
  • Atmósfera constante de 14°C con 95% de humedad
Una red subterránea donde los visitantes se han perdido irremediablemente, rodeados por la densidad de la muerte

Configuración inicial del proyecto en cityengine

Para recrear las Catacumbas en CityEngine, comenzamos creando un nuevo proyecto con un terrain plano que represente el nivel del suelo de París. Establecemos el sistema de coordenadas en metros y definimos un área de trabajo de 2000x2000 metros para cubrir la extensión aproximada de las catacumbas. En el Inspector de Escena, configuramos las unidades en metros y activamos el sistema de snapping para un diseño preciso de los túneles. 🗺️

Configuración base del proyecto:
  • Área de trabajo: 2000x2000 metros
  • Unidades: Métricas (metros)
  • Sistema de coordenadas: Y-up para consistencia

Diseño del grafo de calles laberíntico

El corazón de la generación procedural en CityEngine es el grafo de calles. Creamos un patrón de calles orgánico usando la herramienta Street Growth con parámetros de angle variation alto (45-90°) y length variation medio. Aplicamos múltiples seed points distribuidos aleatoriamente para generar un laberinto naturalista que imite el crecimiento orgánico de las antiguas canteras. Los nodos de intersección deben tener radio mínimo para crear esquinas cerradas. 🕸️

Parámetros del grafo de calles:
  • Angle Variation: 45°-90° para patrones irregulares
  • Street Length: 10-50 metros variación
  • Segment Curvature: 0.3 para curvas suaves

Reglas CGA para generación de túneles

Las reglas CGA (Computer Generated Architecture) son el alma de CityEngine. Creamos una regla llamada CatacombTunnel.cga que comienza con:

@StartRule
Tunnel -->
   offset(-0.5)
   comp(f) { side : Wall | top : Ceiling | bottom : Floor }

Esta regla básica extruye la forma del túnel y separa las caras para aplicar diferentes texturas y geometrías a paredes, techo y suelo. El offset negativo crea el volumen excavado del túnel. 🏗️

Estructura básica de reglas:
  • @StartRule: Punto de entrada de la generación
  • comp(f): Descompone la forma en caras
  • offset: Crea el volumen del túnel

Generación procedural de paredes de huesos

Para las icónicas paredes de huesos, desarrollamos reglas CGA complejas:

Wall -->
   setupProjection(0, scope.xy, 1.5, 1.5)
   texture("stone_base.jpg")
   split(x) { ~1 : BonePattern }*
   
BonePattern -->
   case geometry.area > 0.5: 
      split(y) { ~0.3: SkullRow | ~0.7: BoneRow }*
   else: 
      texture("stone_dark.jpg")

Este sistema divide las paredes en patrones regulares y alterna filas de cráneos y huesos largos basándose en el área disponible. Las condiciones case permiten variación según el contexto geométrico. 💀

Componentes del sistema óseo:
  • SkullRow: Fila de cráneos organizados
  • BoneRow: Fila de fémures y tibias
  • Stone sections: Áreas de piedra natural

Sistema de iluminación y atmósfera

La iluminación es crucial para la atmósfera opresiva. En CityEngine, configuramos luces puntuales estratégicas que simulen iluminación artificial antigua:

LightFixture -->
   s('0.2, '0.2, '0.5)
   t(0, 0, 2.5)
   i("light_point_01.obj")
   set(material.light.emissive, 0.8)
   set(material.light.color, [1.0, 0.8, 0.6])

Estas luces se distribuyen proceduralmente cada 20-30 metros a lo largo de los túneles principales, creando zonas de penumbra intercaladas con oscuridad profunda. La temperatura de color cálida replica lámparas de aceite históricas. 💡

Parámetros de iluminación:
  • Color: Cálido #ffcc99 para antorchas
  • Intensidad: 0.5-0.8 para efecto tenue
  • Distribución: Cada 20-30 metros

Variación y aleatoriedad controlada

Para evitar repeticiones evidentes, implementamos variación procedural usando funciones de ruido y condiciones contextuales:

SkullRow -->
   case rand(0.0, 1.0) < 0.7:
      split(x) { ~0.25: Skull | ~0.1: Gap }*
   else:
      split(x) { ~0.2: Skull | ~0.15: Gap }*
      
Skull -->
   case rand(0.0, 1.0) < 0.3:
      i("skull_broken.obj")
   else:
      i("skull_intact.obj")

Este sistema crea patrones únicos pero coherentes, con variaciones en densidad y estado de conservación de los huesos que reflejan la realidad histórica. 🎲

Elementos de variación:
  • Densidad de huesos: 60-80% cobertura
  • Estados de conservación: Intacto, erosionado, roto
  • Patrones: Regular, agrupado, disperso

Exportación para motores de juego

Una vez generadas las catacumbas, las exportamos a formatos estándar usando el CityEngine Exporter. Para Unity, exportamos como FBX con LOD groups. Para Unreal Engine, usamos Datasmith format que preserva los materiales y la organización de la escena. Las reglas CGA se compilan en geometría estática optimizada para real-time rendering. 📤

Opciones de exportación:
  • FBX: Para Unity y otros motores
  • glTF: Para aplicaciones web y móviles
  • OBJ: Como formato universal de respaldo

Aplicaciones del modelo generado

El modelo de las Catacumbas generado en CityEngine tiene múltiples aplicaciones: desde entornos para videojuegos de terror hasta herramientas educativas de realidad virtual que permiten explorar este sitio histórico sin riesgos. La naturaleza parametrica del modelo permite generar variaciones infinitas para diferentes propósitos, manteniendo siempre la esencia laberíntica y opresiva del original. 🎮

El futuro del patrimonio cultural procedural

La recreación de las Catacumbas de París en CityEngine representa la vanguardia en preservación digital. Al capturar no solo la geometría, sino las reglas subyacentes de su construcción, creamos un modelo vivo que puede evolucionar y adaptarse a diferentes necesidades. Este enfoque democratiza el acceso a sitios históricos peligrosos o inaccesibles, permitiendo a estudiantes, investigadores y artistas experimentar estos espacios de manera segura mientras se preserva su legado para las generaciones futuras. ✨