← STIB Data Art

Respiration

Le réseau de transport bruxellois comme un organisme lumineux qui respire dans l'espace tridimensionnel.

Concept

Respiration est une installation numérique contemplative qui transforme les données temps réel du réseau STIB en une sculpture lumineuse vivante. Le spectateur flotte au-dessus de Bruxelles, dans le noir absolu. Il n'y a pas de carte, pas de rues, pas de bâtiments — seulement la géométrie pure du réseau, ses lumières, ses mouvements.

Ce qu'on voit, c'est l'invisible rendu visible : la structure sous-jacente qui fait circuler 400 000 personnes par jour à travers la ville. Séparé de tout contexte géographique, le réseau révèle sa propre beauté — ses symétries, ses densités, ses rythmes.

L'œuvre fonctionne comme un aquarium urbain : elle vit seule, on la regarde. La caméra orbite lentement, le réseau respire, les véhicules pulsent. Mais si l'on touche la souris, on peut explorer librement l'espace 3D.

Les trois couches visuelles

Couche 1 Le Squelette — les tracés

Les 89 lignes STIB deviennent des fibres lumineuses suspendues dans le vide. Chaque ligne est un tube 3D (TubeGeometry) qui suit la géométrie réelle de la route. La troisième dimension sépare les types de transport en couches géologiques :

TypeAltitude (Y)ÉpaisseurOpacitéLignes
Métro0 (au fond)0.3590%4
Tram200.1865%18
Bus50 (en altitude)0.0735%67

Vu de côté, ça forme une stratigraphie — un terrain géologique du transport. Vu du dessus, c'est la carte abstraite de Bruxelles. Vu en perspective, c'est une sculpture lumineuse flottante.

Couche 2 Le Sang — les véhicules

Des points de lumière intense glissent le long des fibres. Ce sont les ~600 véhicules STIB en circulation. Chaque point :

Aux heures de pointe, les fibres sont saturées de points lumineux. La nuit, presque rien ne circule — quelques lueurs solitaires. L'œuvre montre le rythme circadien de la ville.

Couche 3 Les Synapses — les arrêts

Les ~2 500 arrêts sont des micro-sphères translucides (InstancedMesh), normalement presque invisibles. Quand un véhicule les traverse :

Les hubs majeurs (De Brouckère, Gare du Midi, Simonis, Arts-Loi…) sont des nœuds plus gros, en activité quasi permanente — les ganglions du réseau nerveux.

Système d'animation — les 4 rythmes

La pièce superpose plusieurs temporalités, comme un organisme vivant a un pouls, une respiration et des cycles circadiens simultanés.

7s
Le Pouls
Calé sur le refresh des données véhicules. Toutes les 7 secondes, les nouvelles positions arrivent de l'API STIB. Les points lumineux glissent vers leurs nouvelles positions avec une interpolation easeInOutCubic sur 2.5 secondes.
8s
La Respiration
Le réseau entier respire. Les fibres s'épaississent de ±8%, les couleurs se saturent légèrement. Cycle sinusoïdal indépendant des données — c'est le battement propre de la sculpture.
~0.2-1s
Les Pulsations
Chaque véhicule pulse à sa propre fréquence, liée à sa distance du prochain arrêt. À l'arrêt : 5 pulsations/seconde. En transit : 0.8 pulsation/seconde. L'amplitude augmente aussi avec la proximité.
24h
Le Cycle circadien
La luminosité globale suit l'activité réelle du réseau. L'aube voit les premières lignes s'allumer. L'heure de pointe sature la scène. La nuit, presque tout s'éteint. Pas de simulation — ce sont les données réelles qui dictent.

La Caméra — le regard

Mode contemplatif (par défaut)

La caméra suit une orbite elliptique lente autour du réseau — rotation complète en ~3 minutes. Le mouvement est assez lent pour être subliminal. Simultanément :

Mode exploration (interaction)

Dès que l'utilisateur touche la souris ou le trackpad, l'orbite automatique s'arrête et OrbitControls prend le relais. Après 8 secondes d'inactivité, la caméra reprend son orbite en douceur (transition lerpée sur ~3 secondes).

Effets visuels

Bloom (UnrealBloomPass)

L'effet le plus important. Tout objet lumineux « bave » dans l'espace environnant, transformant des géométries simples en fibres optiques et étoiles. Paramètres : strength 1.5, radius 0.4, threshold 0.15.

Brume exponentielle

Un FogExp2 noir-bleuté (#000005) fait disparaître progressivement les éléments lointains. Ça évite l'effet « boîte » et crée un espace qui semble infini.

Blending additif (traînées)

Les traînées de véhicules utilisent le AdditiveBlending : quand deux traînées se croisent, leurs couleurs s'additionnent optiquement (rouge + bleu = magenta lumineux). Les traînées n'ajoutent que de la lumière, sans masquer ce qui est derrière.

Tone mapping ACES Filmic

Le tone mapping cinématographique compresse les hautes lumières naturellement, évitant les blancs brûlés et donnant un rendu organique aux zones les plus brillantes.

Les données

L'œuvre se nourrit de données ouvertes fournies par la STIB (Société des Transports Intercommunaux de Bruxelles) via leur API Open Data v2.1.

DonnéeSourceQuantitéRefresh
Tracés de lignesroutes.json89 lignes (~2.5 MB de géométrie)Au démarrage
Arrêtsstops.json2 960 arrêts avec GPSAu démarrage
Couleurs officiellesline-colors.json86 lignesAu démarrage
Positions véhiculesvehicles.json~591 véhicules en circulationToutes les 7 secondes

Projection GPS → 3D

Les coordonnées GPS bruxelloises (latitude ~50.85°N, longitude ~4.39°E) sont projetées dans un espace 3D centré sur l'origine :

x = (longitude - 4.388) × 1200
z = -(latitude - 50.846) × 1200
y = altitude selon le type de transport

Le facteur d'échelle (1200) est calibré pour que le réseau tienne dans un espace d'environ 200 × 80 × 200 unités Three.js.

Pipeline technique

┌─ DONNÉES STATIQUES (chargées une fois) ────────────────────────┐ routes.json ──→ 89 CatmullRomCurve3 ──→ 89 TubeGeometry stops.json ──→ 2960 positions ──→ InstancedMesh (sphères) colors.json ──→ palette couleurs STIB └────────────────────────────────────────────────────────────────┘ ┌─ DONNÉES TEMPS RÉEL (refresh 7s) ──────────────────────────────┐ vehicles.json ──→ ~600 positions ──→ InstancedMesh (sphères) ──→ traînées (LineSegments) ──→ flashes synaptiques └────────────────────────────────────────────────────────────────┘ ┌─ RENDU THREE.JS ──────────────────────────────────────────────┐ EffectComposer → RenderPass → UnrealBloomPass → écran └────────────────────────────────────────────────────────────────┘

Architecture des modules

main.js
Orchestrateur : scène, renderer, bloom, boucle de rendu. Assemble tous les modules.
data-loader.js
Chargement des 4 fichiers JSON, conversion GPS→3D, parsing des véhicules.
fibers.js
Création des 89 TubeGeometry + animation de respiration globale.
nodes.js
InstancedMesh des 2960 arrêts + système de flash synaptique avec décroissance.
vehicles.js
InstancedMesh des véhicules avec couleur par instance, pulsation, interpolation.
auto-camera.js
Orbite contemplative + respiration verticale + retour auto après interaction.
trails.js
Traînées lumineuses derrière les véhicules avec blending additif et fade temporel.

Les moments

Ce qui transforme une visualisation en œuvre d'art, ce sont les moments — les instants où la pièce surprend.

L'Aube

05:00 – 06:00

Les premières lignes de métro s'allument. Les fibres dorées émettent leurs premiers véhicules. Puis les trams se réveillent. Puis les bus. En 30 minutes, le réseau passe du noir quasi total à un organisme illuminé.

L'Heure de pointe

08:00 & 17:00

La densité de véhicules explose. Les fibres sont saturées de points lumineux, les nœuds clignotent sans arrêt, les traînées se chevauchent. Le réseau devient incandescent.

La Synapse en cascade

En continu

Quand un véhicule passe rapidement par plusieurs arrêts consécutifs, les nœuds s'allument en séquence — comme un influx nerveux qui traverse une chaîne de neurones.

Le Croisement

En continu

Quand deux véhicules de lignes différentes se croisent au même nœud, leurs halos se mêlent brièvement. Le blending additif mélange leurs couleurs en un flash plus lumineux.

L'Extinction

00:00 – 01:00

Les derniers véhicules disparaissent un par un. Les fibres deviennent sombres. Seules les lignes Noctis émettent encore quelques lueurs solitaires — les derniers signaux d'un organisme qui s'endort.

Optimisations de performance

TechniqueGain
InstancedMesh pour arrêts (2960)1 draw call au lieu de 2960
InstancedMesh pour véhicules (~600)1 draw call au lieu de ~600
Un seul LineSegments pour toutes les traînées1 draw call pour ~4800 segments
Downsampling des coordonnées de routes200-500 points par ligne au lieu de milliers
Segments radiaux réduits (3-5) sur les tubesMoins de polygones sans perte visible
DynamicDrawUsage sur les matrices d'instanceGPU optimisé pour les mises à jour fréquentes
Delta time cappé à 100msPas de sauts après une tab inactive

Palette de couleurs STIB

Les couleurs sont les couleurs officielles du réseau STIB. Quelques exemples :

Stack technique

TechnologieRôle
Three.js r162Moteur 3D WebGL
ES Module importmapChargement natif sans bundler
UnrealBloomPassPost-processing bloom
OrbitControlsNavigation manuelle
STIB Open Data APIDonnées temps réel
PHP (fetch-vehicles.php)Daemon de cache des positions

Crédits

Données : STIB-MIVB Open Data — données ouvertes sous licence Open Data.
Moteur 3D : Three.js par Ricardo Cabello (Mr.doob) et contributeurs.
Concept et réalisation : STIB Data Art.