Un logiciel de video-mapping et de VJing en Python/OpenGL : il projette vidéos, images, shaders et animations audio-réactives sur des surfaces réelles (murs, objets, volumes), calibrées au pixel près, et se pilote en live comme un instrument.


Vue d’ensemble

Mapping Animation est parti d’un outil de calage : déformer une vidéo pour qu’elle épouse un mur ou un objet. Il est devenu un logiciel de show complet. Chaque surface se calibre directement devant la projection, en quadrilatère, en grille courbée, en forme libre (cercle, étoile, logo importé en SVG) ou même en objet 3D réel dont l’application recalcule la position du projecteur.

Côté live, il fonctionne comme un logiciel de VJ : grille de clips à la Resolume, chaîne d’effets par surface, transitions entre scènes, tempo et LFO calés sur la musique, titrage animé, contrôle MIDI / OSC / DMX. Un panneau de contrôle web séparé pilote tout ça sur l’écran de l’opérateur, sans jamais quitter la projection des yeux.

Aperçu du projet Mapping Animation (capture d'écran à venir)
Capture d’écran générique, sera remplacée par une vraie capture de calibration en cours.

Fonctionnalités

Calibration et formes

  • Warp perspective en direct : chaque surface se cale en tirant ses points à la souris, avec loupe de précision pendant le drag, magnétisme (bords, centres, espacements égaux), poignées de redimensionnement façon Photoshop et multi-sélection de points.
  • Surfaces courbes et formes libres : grille subdivisée pour plier l’image sur un objet non plan, polygones de 3 à N points, bords en courbes de Bézier et une trentaine de formes prêtes (cercle, arche, cœur, étoile, goutte, flèche…).
  • Formes importées en SVG : un logo ou un mot dessiné dans Illustrator, Inkscape ou Figma devient une surface, avec ses vraies courbes, ses morceaux multiples et ses trous (l’intérieur d’un « O » reste transparent).
  • Objets 3D : pour projeter sur un volume (boîte, colonne, escalier, coin de pièce), on choisit un modèle (ou un .obj exporté de Blender), on cale quelques coins et l’application calcule la position et l’optique du projecteur. Toutes les faces se calent d’un coup, les faces cachées ne reçoivent rien.
  • Alignement par caméra : une webcam filme la scène pendant que le projecteur affiche une série de motifs à rayures. Il suffit ensuite de cliquer sur la photo l’endroit où chaque coin doit tomber, et le point s’y place exactement.
  • Multi-projecteurs : un processus par sortie, transport et tempo synchronisés, edge-blending entre projecteurs qui se chevauchent et calibration colorimétrique (gamma, luminosité, gain RVB) par sortie.

Médias et sources

  • Bibliothèque de médias : vignettes de tout le dossier source (vidéos, photos, animations, shaders), recherche, étiquettes, glisser-déposer sur une surface.
  • Animations et shaders audio-réactifs : des scripts Python génératifs et des shaders GLSL façon Shadertoy (rendus entièrement sur la carte graphique) qui réagissent en direct au niveau et au spectre du micro.
  • Entrées live : webcam ou carte d’acquisition, avec une quinzaine de filtres temps réel (néon, cartoon, slit-scan, ASCII, kaléidoscope, traînées de flux optique…), plus réception Syphon et NDI depuis d’autres logiciels ou machines.
  • Vidéo HAP décodée par le GPU : les blocs compressés partent tels quels à la carte graphique, environ 6 fois moins de travail processeur en 4K. Transparence gérée (HAP Alpha) et outil de conversion fourni.
  • Titrage animé : un nom d’artiste ou un message tapé en direct par-dessus la vidéo, avec n’importe quelle police installée et plusieurs animations.
  • Son des vidéos : bande-son par surface, volume, mute et choix de la sortie audio, avec une option pour que le son suive l’opacité.

Jeu en live

  • Grille de clips : une ligne par surface, une colonne par emplacement, comme dans Resolume. Un clic lance un clip ou une colonne entière, avec enchaînements automatiques (follow actions) et mode autopilot.
  • Chaîne d’effets VJ par surface : flou, kaléidoscope, RGB split, feedback, stroboscope, miroir, pixellisation, luma key… réordonnables, dosables, plus les effets ISF du monde VJ à télécharger.
  • Tempo, LFO et détection du BPM : tap tempo, synchro Ableton Link, tempo détecté sur la musique captée par le micro, et des LFO calés sur le temps pour moduler n’importe quel paramètre.
  • Scènes, transitions et cues : une quinzaine de transitions (fondu, volets, iris, dissolution, glitch…) qui suivent la forme de chaque surface, lancements quantifiés sur le temps ou la mesure, liste de cues façon régie lumière et cues sur timecode MTC.
  • Transport du clip : vitesse, points d’entrée et de sortie, lecture à l’envers, ping-pong et scratch.
  • Modes de fusion et composition : add, screen, multiply, difference, overlay… entre surfaces superposées, et une grande composition découpable en tranches réparties sur plusieurs surfaces.

Régie et intégration

  • Contrôle MIDI, OSC et DMX : n’importe quel contrôleur, client OSC ou console lumière (Art-Net) peut piloter opacité, effets, scènes, cues ou tempo, assigné par simple MIDI learn depuis le panneau.
  • Sortie vers d’autres logiciels : publication de l’image en Syphon (OBS, Resolume, MadMapper sur le même Mac) ou en NDI sur le réseau.
  • Enregistrement de la sortie : capture du rendu final en MP4, d’une touche.
  • Panneau de contrôle web : toute la régie dans le navigateur, avec aperçus des surfaces, presets et sauvegarde automatique.
  • Tient le choc en live : fichier cassé, micro absent, projecteur débranché puis rebranché en plein show, rien ne plante, tout se dégrade proprement et se relance seul.

Sous le capot

Le warp perspective repose sur une homographie 3×3 classique (DLT) qui mappe le carré unité aux quatre coins de sortie. Plutôt que de découper le quadrilatère en deux triangles interpolés (qui provoque le classique artefact de pli diagonal), les coordonnées homogènes issues de l’homographie sont envoyées directement dans le vertex shader : c’est la rasterisation perspective-correcte du GPU lui-même qui fait la déformation, sans aucune couture visible.

Les formes libres sont triangulées par ear-clipping, leurs bords de Bézier échantillonnés en points supplémentaires dont les coordonnées de texture suivent la même courbe que le contour (sans ça, l’image d’un cercle se pincerait en losange). Les formes SVG à plusieurs morceaux ou à trous sont fusionnées en un seul polygone par la technique du « pont » (keyhole), pour partager une vidéo continue.

Pour les objets 3D, chaque coin calé sur l’objet réel devient une contrainte : à partir de quatre ou cinq points l’application résout la pose du projecteur, à partir de six elle estime aussi son optique (focale, décentrement). L’alignement caméra projette une séquence de motifs à rayures pour établir la correspondance pixel par pixel entre la caméra et le projecteur, ce qui permet de placer un point en cliquant simplement sur la photo.

Rien de tout ça ne doit pouvoir faire planter le rendu : chaque callback de rendu, d’entrée et de décodage média est protégé individuellement, un fichier vidéo cassé devient un simple espace réservé, une cellule de maillage mal calibrée est sautée plutôt que de projeter une traînée sur tout l’écran. L’ensemble est couvert par plus de 900 tests automatisés.


Contrôles

ToucheAction
FPlein écran
CMode calibration
Tab / clicChange de surface active
N / SupprAjoute / supprime la surface active
Alt + clicDuplique une surface
G / Maj+GDensifie / allège le maillage (pour courber)
I / XInsère / retire un point de contour
OFait défiler les formes prédéfinies
EBascule un bord en courbe de Bézier
R / Maj+RPivote toute la surface de 90°
TMire de calibration (échiquier / barres)
K / JFiltre webcam / palette du filtre
UMode de fusion de la surface
Y / Maj+YTap tempo / recale le premier temps
D / Maj+DRelance le clip / lecture à l’envers
1-9Déclenche une scène
Entrée / Maj+EntréeAvance / recule d’un cue
EspaceLecture / pause
BBlackout
F8Autopilot de la grille de clips
F9Enregistre la sortie en MP4
Ctrl+Z / Ctrl+LAnnule / verrouille la surface
S / Maj+SSauvegarde / snapshot d’un preset

Stack technique

  • Python 3
  • moderngl / moderngl-window : contexte OpenGL, shaders, fenêtrage GLFW
  • PyAV et OpenCV : décodage vidéo (accélération matérielle VideoToolbox), images et webcam
  • NumPy : homographies, pose du projecteur, maillages, splines et Bézier
  • sounddevice : analyse micro pour l’audio-réactif et mixage du son des vidéos
  • mido / python-rtmidi, python-osc : contrôle MIDI et OSC
  • Ableton Link : synchronisation du tempo avec d’autres logiciels
  • Syphon et NDI (optionnels) : échange vidéo avec d’autres logiciels
  • http.server (stdlib) : panneau de contrôle web auto-hébergé

Cas d’usage

Pensé pour habiller un mur, une façade, un objet ou un décor en volume, en installation comme en soirée : calibrer sur place devant la surface réelle (ou par caméra), puis jouer le visuel en live au rythme de la musique, depuis le clavier, le panneau web ou un contrôleur MIDI, et laisser tourner sans surveillance grâce à la reprise automatique sur erreur.

N’importe quelle surface devient un écran, à condition de savoir la plier au bon endroit.


Projet précédent

Projet suivant

Autres projets