Body Scan Render Process (Decathlon DX × Treedy's)
Conception d'un pipeline de rendu automatisé transformant le scan corporel d'un visiteur en un souvenir visuel animé : une boucle vidéo de son propre nuage de points, dans une esthétique synthwave héritée de la vague cyberpunk de l'époque.
Vision & Concept
Decathlon a intégré, dans Decathlon DX (son magasin-laboratoire réservé aux adhérents où l'enseigne teste en conditions réelles les innovations retail avant un éventuel déploiement plus large), un scanner corporel signé Treedy's, technologie assistée par IA permettant d'obtenir les mesures exactes d'une personne habillée pour de l'aide à la vente vêtement.
- Au-delà de la mesure : l'idée était de transformer un scan purement utilitaire (prise de mesure pour la taille de vêtement) en une expérience mémorable, en offrant au visiteur un "souvenir" numérique de son passage.
- Direction artistique : le nuage de points brut issu du scan est mis en scène dans une esthétique synthwave/cyberpunk, en phase avec la vague visuelle qui dominait à cette période, avec une silhouette lumineuse qui se dessine progressivement dans le noir.
Contexte & Enjeux de Production
- Un scan, un souvenir, par visiteur : chaque passage au scanner devait générer un rendu individuel, sans intervention manuelle et sans ralentir le flux du magasin.
- Un rendu de qualité, mais pas de budget temps réel live : produire une animation fluide et léchée par visiteur excluait un rendu interactif classique, il fallait une solution capable de produire beaucoup de frames très vite, en autonomie.
- Livraison au client : le rendu final (vidéo qui loop) était transmis à Treedy's par email, à charge pour eux de le restituer côté Decathlon.
Breakdown du Pipeline Technique
Scan (CSV) → Position Map → Particules → Vidéo
La position map générée par le script : chaque pixel encode une position XYZ, d'où le bruit RGB (normal, ce n'est pas une texture couleur classique).
Extrait de code : BuildPositionMap(), le twist du pas premier
// The point count never fills a perfect square exactly, so there are // always leftover pixels at the end of the texture. Rather than leaving // them empty or naively duplicating the last points (visible clump of // overlapping particles on screen), we loop back over the point cloud // with a prime step. Coprime with the array size, it spreads the // duplicates pseudo-randomly across the whole texture instead of // stacking them in one spot. Texture2D BuildPositionMap(List<Vector3> positions) { int pointCount = positions.Count; int width = Mathf.CeilToInt(Mathf.Sqrt(pointCount)); Texture2D positionMap = new Texture2D(width, width, TextureFormat.RGBAHalf, false); positionMap.filterMode = FilterMode.Point; int sequentialIndex = 0; int wrapIndex = 0; const int primeStep = 132049; // prime step for (int y = 0; y < width; y++) { for (int x = 0; x < width; x++) { int index = sequentialIndex < pointCount ? sequentialIndex : wrapIndex % pointCount; Vector3 p = positions[index]; positionMap.SetPixel(x, y, new Color(p.x, p.y, p.z)); sequentialIndex++; wrapIndex += primeStep; } } positionMap.Apply(false, true); return positionMap; }
Contexte : Une Collaboration de Longue Date avec Treedy's
Ce projet s'inscrit dans une relation continue avec Treedy's, pour qui j'étais déjà intervenu sur deux volets de R&D en amont :
- Moteur de simulation pour données d'entraînement : développement sous Unity et Houdini d'un moteur de génération d'images synthétiques, utilisé pour entraîner leur modèle d'IA de reconnaissance corporelle.
- Simulation vêtement (R&D avec la VUB) : en partenariat avec un chercheur de la VUB, génération de données synthétiques de simulation de vêtement pour extraire la silhouette corporelle sous les habits, la base R&D de ce que Treedy's a depuis industrialisé sous le nom de "naked-net".