# Rendu spectateur et modèles 3D

La direction demandée varie par jeu : fusée inspirée de l’ingénierie lisible de Kerbal Space Program, robots industriels réalistes, course dans une direction Forza Horizon, et machines/fortifications médiévales dans une direction Besiege pour le RTS et la défense. Ces références orientent le travail ; elles ne constituent pas une certification d’équivalence graphique avec ces jeux.

Le rendu spectateur emploie une chaîne Three.js dédiée : environnement HDR précalculé, matériaux avec normales et rugosité, éclairage direct, ombres portées, occlusion ambiante SSAO et bloom. Les textures sont fournies avec le site ; aucune requête à un CDN n'est nécessaire pendant une partie.

La caméra d'action est sélectionnée au démarrage pour les cinq jeux. Les boutons permettent de revenir à une vue d'ensemble ou du dessus et le déplacement manuel reste disponible. RTS et défense proposent aussi le changement de sujet et le plein écran. Le cadrage RTS se rapproche d'un engagement et suit les unités affichées. La course suit une voiture ; sa distance minimale de caméra en diffusion est de 3,2 m, afin de conserver le suivi rapproché. Le duel cadre les deux châssis.

Les déplacements, rotations, destructions et résultats proviennent exclusivement des états enregistrés. Les animations de marche, de tissu, d'armes, de végétation, la rotation des roues, le panache et les étincelles sont des habillages visuels. Les effets utilisent le temps de lecture : pause et retour arrière ne modifient ni les actions acceptées ni la simulation. Les replays et les commentaires français existants restent disponibles.

## Ressources et attributions

- Textures photographiques 2K : **Aerial Grass Rock**, **Rocky Terrain 02**, **Rusty Metal 02**, **Leafy Grass**, **Gravel Road** et environnement HDR **Kloppenheim 06 Pure Sky**, [Poly Haven](https://polyhaven.com), sous [CC0](https://polyhaven.com/license). Sources et empreintes des fichiers : [manifest.json](../assets/spectator/manifest.json).
- Sols photographiques ajoutés pour le lot décors et tout-terrain : [Grass Ground](https://polyhaven.com/a/grass_ground) (`turf`) et [Forrest Ground 01](https://polyhaven.com/a/forrest_ground_01) (`forest`), Poly Haven, CC0. Chaque sol fournit couleur, normales OpenGL et rugosité 2K : six cartes supplémentaires livrées localement. Le téléchargement contrôle le MD5 fourni par le catalogue ; les JPEG portent leur source et leur licence, et le manifest conserve les empreintes SHA-256 des sources et fichiers livrés.
- Finitions de couverture et de route : [Forest Leaves 02](https://polyhaven.com/a/forest_leaves_02) (`cover`), couleur/normales/rugosité 2K, et [Gravelly Sand](https://polyhaven.com/a/gravelly_sand) (`coarse`), couleur/normales/rugosité 4K et hauteur 2K, Poly Haven, CC0. Ces sept cartes sont réencodées en JPEG qualité 94 avec sous-échantillonnage 4:4:4, à leur résolution source, après contrôle MD5 du téléchargement. Provenance embarquée et empreintes source/livraison figurent dans le manifest.
- Béton du pas de tir : [Concrete Layers 02](https://polyhaven.com/a/concrete_layers_02), Rob Tuytel / Poly Haven, CC0. Couleur, normales OpenGL et rugosité 2K sont livrées localement, avec contrôle MD5 de source, réencodage JPEG qualité 94 en 4:4:4, provenance et empreintes dans le manifest. La fondation emploie les trois cartes dans le même repère mondial à l'échelle de 2 m, avec joints et dépôts près de l'ouverture de flamme.
- Personnage principal **Knight (Rigged - Mid Poly)**, **crownjoshua**, [OpenGameArt](https://opengameart.org/content/knight-rigged-mid-poly), CC0. L'armure et le corps de l'artiste sont évalués puis normalisés en mètres : **39 886 triangles, treize maillages, 51 joints dont trente joints de doigts**. Le squelette ne conserve que les déformations utiles ; les poids et articulations des doigts sont préservés. Les matériaux PBR reçoivent des cartes photographiques de métal et de cuir. La visière courbe tessellée, la cape et les poses de présentation sont des ajouts du projet. Les scripts de contrôle et l'animation d'assemblage du fichier source ne sont ni exécutés ni livrés. Préparation : Blender 5.2 et `scripts/prepare-spectator-knight.py`, puis le convertisseur de bibliothèque.
- Personnage de secours **Dude**, [BabylonJS Assets / XNA](https://github.com/BabylonJS/Assets/tree/master/meshes/Dude), sous [CC BY 4.0](https://github.com/BabylonJS/Assets/blob/master/LICENSE). Il reste fourni pour le repli en l'absence de Knight ; il n'est plus le personnage principal de la diffusion. Conversion en glTF, extraction de la marche et adaptation des couleurs et équipements par Agent Arena. Le modèle comporte cinq maillages et un squelette de 58 os. Les images de texture originales sont conservées. Sa recette distincte reste `node scripts/prepare-spectator-character.mjs`.
- Cheval texturé continu : **Rigged Horse**, Lyndon Daniels / ChadM, [OpenGameArt](https://opengameart.org/content/rigged-horse), CC0. Maillage, crinière, queue, yeux et atlas issus de l’adaptation CC0 [DemiEngine](https://github.com/JEAPI-DEV/DemiEngine/tree/main/packages/sources/demi.animals.horse) ; normales issues de l’adaptation CC0 OloEngine. Le squelette a été réattaché dans un repère en mètres, avec épaules/hanches latérales et quatre joints de sabot supplémentaires : **23 joints**, 14 986 triangles. Les anciens clips ont été remplacés par des cycles d’attente, marche et course, calculés par cinématique inverse et enregistrés à 60 Hz (120 Hz pour la course). La robe utilise un matériau non métallique et une intensité de normales réduite à 0,15 ; crinière et yeux conservent des matériaux distincts.
- Véhicule historique **Jeep**, **DJMaesen**, [modèle original](https://sketchfab.com/3d-models/jeep-8dd9a0b3faa84aaa813431b44c716a6d), CC BY 4.0 : 18 415 triangles et neuf textures. Géométrie normalisée en mètres, avant +X, quatre moyeux distincts et pivots de direction avant. Il reste livré dans la bibliothèque et utilisé par l'inspecteur synthétique ; les diffusions tout-terrain utilisent désormais les trois bases décrites ci-dessous. Le modèle n’ajoute aucune pièce physique.
- Décors scannés CC0 **Poly Haven** : Modular Fort 01 (22 modules), Rock Moss Set 01 (six rochers), Large Iron Gate, Wooden Crate 02, Concrete Road Barrier, Fern 02, Pine Sapling Small, Dead Tree Trunk 02 et Gothic Statue. Les fortifications sont ajustées aux empreintes enregistrées ; les accessoires de paysage sont placés hors des trajectoires. Les modèles de périphérie sont simplifiés hors ligne avec leurs UV ; les normales et tangentes sont vérifiées après traitement.
- Herbe photographique **Grass Medium 01**, [Poly Haven](https://polyhaven.com/a/grass_medium_01), CC0 : géométrie simplifiée hors ligne, UV et normales de la source conservés. Le masque alpha officiel, livré séparément par la source, est ajouté au canal de la couleur avant compression dans le GLB. Le matériau utilise `MASK` avec un seuil de 0,45 ; la vérification du fichier livré mesure bien un alpha de 0 à 255. Les variantes sont instanciées dans les scènes, y compris une herbe rase dans le terrain joué, et sur les accotements. Le vent suit le temps du replay ; une compression visuelle tient compte de la proximité d'au plus seize positions archivées. Ces déformations n'ajoutent ni force physique ni zone de collision. L'herbe reste dans le rendu couleur et est exclue du SSAO, dont le matériau de remplacement ne respecte pas le découpage alpha des brins.
- Cuir **Brown Leather** et tissu **Denim Fabric**, [Poly Haven](https://polyhaven.com), CC0 : couleur, normales OpenGL et rugosité photographiques 2K. Le cuir habille les matériaux du nouveau personnage ; le tissu est utilisé sur sa cape. La patine des plaques d'acier conserve les rayures et dépôts photographiques en limitant la teinte orange de la rouille.
- Planches photographiques 2K **Weathered Brown Planks**, [Poly Haven](https://polyhaven.com/a/weathered_brown_planks), CC0. Normales d’eau issues des [exemples Three.js](https://github.com/mrdoob/three.js/tree/dev/examples/textures), MIT ; notice dans `assets/spectator/THREE-LICENSE.txt`. Le pont garde le tracé enregistré et reçoit des planches séparées instanciées, des poteaux, contreventements, ferrures et boulons. Les balises de passage portent un numéro sur une toile plissée fixée à un tube. L’eau possède des normales animées selon le temps du replay. Les accotements emploient des bandes de terre/herbe aux contours irréguliers, avec normales et masque progressif ; des touffes d’herbe instanciées et des groupes de fougères composent le proche plan hors de la chaussée. Les transitions d'accotement excluent ponts, gués et tunnels.
- Fusée originale du projet : l'ancien modèle sans plan conserve réservoir segmenté, capsule avec vitrage et bouclier thermique, joints, rivets, conduites, ailerons fermés et tuyère refroidie pour la compatibilité. Les diffusions avec plan utilisent l'assemblage à cinq emplacements décrit ci-dessous. Le pas de tir conserve ses caillebotis rectangulaires encadrés : fondation en béton photographique, ouverture et conduit de flamme bordés, liaisons vers la tour, deux volées d'escalier avec limons et garde-corps, paliers grillagés et plinthes. Une passerelle latérale de 55 cm de largeur nominale et un palier d'arrivée élargi relient le niveau supérieur ; les protections de rive de la plateforme sont raccourcies à cet accès. Armoires, conduites et bras de service complètent l'installation. Ombilical et pinces gardent leur timing visuel lié à la poussée ; ces décors ne retiennent pas la fusée dans la simulation.
- Robots originaux du projet : l'assemblage détaillé conserve chaque composant et les poses articulées de Rapier ; aucun modèle fixe ne remplace le robot construit. Les châssis ouverts et tôles formées ou ajourées gardent leurs formes. Les faces des plaques reçoivent un émail aux couleurs d'équipe et leurs chants de l'acier exposé ; les structures portent un acier bleui et les pneus un caoutchouc non métallique distinct. Rugosité, vernis et usure localisée différencient ces matières, avec moins de stries et de bruit de bord uniformes. Fourches, paliers, transmission, pneus arrondis à crampons, jantes, rayons, disques, moyeux et fixations restent présents. Moteurs, ailettes, câbles, conduites et ventilation complètent l'habillage. Ces pièces restent attachées aux composants enregistrés et à leur essieu initial.
- Machines de siège originales du projet : charpente ouverte, planchers de planches séparées, quatre roues à rayons, essieux, paliers et boulons ; la rampe est construite en planches sur poteaux et contreventements. Ces géométries utilisent les matériaux photographiques livrés.

Les modèles de la bibliothèque et leurs attributions détaillées sont dans [library/LICENSE.md](../assets/spectator/library/LICENSE.md). [library/index.json](../assets/spectator/library/index.json) indexe treize GLB et donne les dimensions, parties, triangles, joints, licences et empreintes des fichiers livrés. [library/sources.json](../assets/spectator/library/sources.json) conserve les URL et empreintes de 64 fichiers sources, dont le masque alpha séparé de l'herbe. Leurs textures sont incluses dans les GLB au format WebP, sans décodeur de géométrie externe. Le manifest séparé comprend 48 entrées, dont 45 JPEG avec provenance ; le fichier HDR et les deux fichiers glTF/binaire du personnage de secours complètent ce relevé. Ces fichiers restent inchangés dans le lot de modèles configurables, dont les trois GLB supplémentaires sont indexés séparément.

## Modèles liés à la configuration

La diffusion tout-terrain choisit une base d'artiste selon `blueprint.parts.chassis`. Les fichiers livrés et leurs empreintes sont dans [vehicles/index.json](../assets/spectator/vehicles/index.json) ; [vehicles/LICENSE.md](../assets/spectator/vehicles/LICENSE.md) précise les adaptations sous [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/).

| Châssis enregistré | Base et auteur | Triangles livrés |
| --- | --- | ---: |
| `scout` | [Dune Buggy](https://sketchfab.com/3d-models/dune-buggy-0c914465dcfa455b8cff170c6ed75d47), yellingorange | 206 997 |
| `rally` | [Audi Quattro Rally](https://sketchfab.com/3d-models/audi-quattro-rally-10ad6b7608474ec8aac778934723c151), Matthew Hirst | 129 161 |
| `trophy` | [1994 Chevy Silverado K3500 Pre-runner](https://sketchfab.com/3d-models/1994-chevy-silverado-k3500-pre-runner-3d5d22c76dda452f87011b4fcfda93f1), moto man 135 | 405 326 |

La préparation normalise orientation et échelle (+X avant, +Y haut), conserve les UV, sépare les surfaces connectées des roues en quatre pivots concentriques, retire les faces dégénérées et optimise la géométrie. Les rôles explicites peinture, verre, caoutchouc, métal, tissu et feux sont conservés sans dédoublonnage des matériaux. Les textures photographiques existantes fournissent normales, rugosité et détail discret de peinture ; les cartes diffuses d'artiste présentes restent utilisées. La roue de rallye à matériau unique reçoit une séparation radiale caoutchouc/jante sur une copie de géométrie. Les échappements attachés d'origine sont conservés ; les embouts génériques flottants ont été retirés.

Les sept emplacements véhicule — châssis, moteur, pneus, suspension, boîte, différentiel et protection — modifient la géométrie de présentation, avec admissions, ressorts, transmission et protections selon les pièces. Les corps d'artiste remplacent les corps procéduraux après chargement ; ces derniers restent le repli. Les sources téléchargées sont épinglées par URL et SHA-256 dans [vehicles/sources.json](../assets/spectator/vehicles/sources.json). Les nouveaux JPEG sont embarqués dans les GLB, avec provenance EXIF ; les crédits figurent également dans leurs métadonnées. Aucun raster externe supplémentaire n'est ajouté.

Les fusées sont des assemblages 3D paramétriques originaux du projet, sans GLB de fusée importé. Les cinq emplacements changent leur construction : structure légère ou renforcée avec nervures et brides ; réservoir compact ou allongé avec panneaux, raccords et rivets ; moteur efficient à tuyère refroidie, booster à trois tuyères ou chambre ionique à grille ; charge vide à ogive, balise instrumentée ou coiffe cargo avec verrous ; ailerons standard ou larges à faces fermées et biseaux. Les matériaux PBR réutilisent les cartes photographiques et le panache possède un shader dédié. `src/spectator-rocket-configuration.js` et `src/spectator-vehicle-model.js` définissent ces présentations ; les modules de scène leur passent les plans archivés.

Ces variantes conservent position, cap, tangage, braquage et distance de rotation `wheelTravel` du replay. Elles ne modifient ni les racines enregistrées, ni les actions des agents, ni les collisions ou la physique. Les géométries sources chargées restent intactes.

## Décors et tout-terrain

Le terrain combine sol herbeux, litière forestière, roche et couverture photographique de feuilles par des masques communs à la couleur, aux normales et à la rugosité. Chaque couche de paysage emploie les mêmes coordonnées et décalages pour ses trois cartes ; le fondu entre tuiles est limité à leurs bords pour conserver le détail dans leur partie centrale. Les sols herbeux et forestiers utilisent une échelle de 2 m, la couverture de feuilles 3 m et la roche une échelle distincte. La piste reçoit toujours les profils `roadTone` et `roadGrain` interpolés autour des limites de secteurs sur 6,4 m, avec un décalage irrégulier sans déplacer la limite physique. L'ancienne procédure de points ronds est supprimée : le granulat provient désormais du scan Gravelly Sand, échantillonné à une échelle de 2,5 m. Sa hauteur pilote trois itérations de parallaxe visuelle, avec couleur, normales et rugosité au même emplacement échantillonné ; aucun sommet de route n'est déplacé. L'asphalte conserve une réponse compacte et les traces de roues leur modulation locale. Ces mécanismes décrivent le rendu implémenté, pas une validation de richesse environnementale ou de distinction matérielle atteinte.

Le paysage décoratif possède désormais du relief hors de la bande de roulement, avec une atténuation près de la route et des ponts, gués et tunnels. Les nouvelles surfaces de piste sont échantillonnées sur `offroadGroundAt` ; leur décalage visuel de 5,5 cm ne modifie ni la hauteur utilisée par la simulation ni les trajectoires. Le choix de l'ordre des faces repose sur leurs coordonnées XZ, y compris dans les virages serrés. Les accotements continus sont échantillonnés plus finement et raccordés par un masque irrégulier. Le sol jouable des scènes RTS et défense reste plat ; les collines sont des éléments de décor extérieurs. Aucun de ces maillages n'est ajouté aux collisions.

La couverture basse utilise les plantes photographiques existantes. Hors champ joué, `meadowCover` regroupe les placements par cellules de 62 cm et instancie des lits `small_a`/`small_b` de 68–99 cm de largeur, 66–94 cm de profondeur et 19–34 cm de hauteur. Largeur et profondeur sont indépendantes de la hauteur : abaisser une plante ne réduit plus automatiquement son emprise à une touffe étroite. Les hauteurs et normales de ces lits sont échantillonnées sur les triangles du maillage de paysage affiché, avec un traitement du bord immédiat de route ; les lits s'orientent sur la pente. Le champ joué conserve ses petites variantes `tiny` et son sol plat. Les arbres, fougères, rochers et troncs conservent leurs centres de groupes, avec des fragments rocheux près des talus. Placements, vent et compression de proximité restent déterministes au temps du replay. Les touffes découpées par alpha restent exclues du SSAO. Les plantes réutilisent le GLB existant ; les nouvelles cartes de couverture enrichissent la matière du sol.

Les projections tout-terrain utilisent des rubans effilés orientés vers la caméra, avec une largeur géométrique variable et une opacité adoucie sur les bords et la queue. En humide, de petites projections de 2,5 à 9 cm sont complétées par des traînées de brume plus larges de 12 à 27 cm ; leur durée de présentation est de 0,34 s. Les âges sont répartis régulièrement avec une variation déterministe et la dispersion arrière dépend de la vitesse. La poussière sèche reste plus longue et moins opaque. L'émission est absente sous 1 m/s, lorsque `grounded` vaut faux, au-delà de 20 cm au-dessus du sol, et sur bois sec. Les positions sont recalculées au temps du replay : pause et recherche arrière ne dépendent pas d'une intégration persistante. Cela n'ajoute aucun contact physique et ne certifie pas la continuité visuelle ou les performances GPU.

## Robots : raccords, axes et impacts visibles

Les composants sont d'abord placés depuis leurs poses enregistrées. Des arbres, flasques, boîtiers de roue, fourches de support, traverses et entretoises sont ensuite ajoutés côté châssis, jusqu'à l'origine enregistrée de la pièce enfant exprimée dans ce repère. Les pièces ne sont ni déplacées ni réorientées pour rejoindre ces raccords. Une liaison est masquée lorsque l'état marque sa pièce comme arrachée.

Le rotor horizontal utilise l'axe local Y ; roues, autres rotors et bras utilisent Z selon le contrat physique. Les arbres décoratifs des leviers, éjecteurs, marteaux, broyeurs et redresseurs sont recentrés sur l'origine locale, avec paliers concentriques. La scie conserve son arbre secondaire à x=0,32. Les écarts du solveur sont conservés avec les poses. La mesure historique du lot raccords porte sur 39 états, avec un maximum de 0,000778322 rad, soit 0,0445946°. Les images natives des nouveaux films du lot bosses et variantes donnent un maximum attaché de 0,0017309843 rad. Les pièces détachées sont exclues de ces bornes échantillonnées ; aucune correction de pose ni observation continue de toutes les armes et animations n'est affirmée.

La diffusion indexe les impacts enregistrés sur l'ensemble de l'archive disponible, en dédoublonnant temps, position et énergie. Les événements ne comportent pas d'identifiant de composant : l'association visuelle choisit, pour chaque robot, la surface de collision la plus proche à une distance maximale de 18 cm. Cette attribution reste une inférence de présentation. Le point et la normale sont conservés dans le repère de la pièce après interpolation des poses au temps de l'impact.

Les pièces métalliques reçoivent désormais des cratères et rebords soulevés dans une copie de leur maillage visuel, affinée au besoin en conservant groupes de matériaux et UV. Chaque champ d'impact atteint une profondeur de 2 à 55 mm selon l'énergie, un rayon plafonné à 26 cm et sa forme finale en 0,16 s. Les douze impacts métalliques les plus énergétiques par composant sont retenus ; les déplacements cumulés sont plafonnés à 70 mm. Les bords de panneaux et zones de pivot restent fixés, dont l'arbre secondaire de scie ; petites fixations, arbres et supports sont exclus. Le caoutchouc conserve uniquement l'abrasion. Géométries partagées d'origine, racines, poses physiques, collisions et actions restent inchangées : ce relief est un dommage cosmétique, sans simulation de plasticité.

La peinture abrasée et la matière exposée restent des marques projetées et découpées sur les vraies faces, avec six marques récentes au maximum par composant. Elles sont reprojetées lorsque la déformation change. Marques et cratères excluent les impacts futurs, suivent leur pièce et sont reconstruits depuis les données archivées après recherche arrière. Les géométries propres au rendu sont restaurées ou libérées lorsqu'elles sortent de la sélection. Les crampons instanciés sont exclus de la projection, tandis que le corps du pneu reste éligible à l'abrasion ; les couches de marques restent exclues du remplacement de matériau SSAO. Aucun nouveau raster ou GLB n'est ajouté.

Un spectateur rejoignant un direct ne dispose que des impacts reçus depuis son arrivée. Une archive chargée conserve l'index au-delà du court tampon d'événements des images et permet la recherche directe. Les tests couvrent ces reconstructions et la conservation des poses ; ils ne certifient pas l'association de chaque collision ou la fluidité de tous les équipements.

## Variantes de vérification

`node scripts/preview-spectator-variants.mjs` prépare dix replays dans un service distinct en mémoire, sur le port 4321 par défaut, sans utiliser la base de compétition. Deux configurations sont fournies par jeu : Disques et Scies pour les robots, Cavalerie et Archers pour le RTS, Rampes et Ressorts pour la défense, Sprint et Cargo pour la fusée, Piste sèche et Pluie pour le tout-terrain. Le générateur vérifie pour chacune l'égalité entre l'état final simulé et celui reconstruit par le replay. Les politiques existantes peuvent ensuite recruter des unités ou ajouter des constructions ; les plans initiaux ne décrivent pas toute la composition ultérieure.

Le lot historique `.impeccable/review/robot-dents-variants-pass/` a été capturé avant les modèles configurables : Sprint et Cargo partageaient alors une fusée et les deux variantes tout-terrain la Jeep texturée avec des proportions de classe différentes. Ses dix films natifs de 8,88 à 10,04 s, totalisant 1 185 images, dix-huit captures et trente images clés restent conservés. Sa revue indépendante conclut à `ship` pour les déformations cosmétiques et ces variantes ; elle a examiné les captures et les images clés dans l'ordre, sans lecture continue des MP4. Ce constat historique ne décrit pas les modèles actuellement sélectionnés par configuration.

`node scripts/preview-configured-models.mjs` fournit séparément six replays en mémoire sur le port 4331 : Buggy, Rallye, Trophy, Sprint, Cargo et Sonde, avec plans dans `data/configured-models/fixtures.json`. Les six états finaux reconstruits sont égaux aux états simulés, sans ouvrir la base de compétition. Le lot `.impeccable/review/configured-models-pass/` conserve seize captures fixes et six films natifs de 9,04 à 10,08 s, issus de 1 298 images du navigateur et de leurs horodatages réels. Les dix-huit images clés, trois par film, ont été examinées dans l'ordre ; les MP4 n'ont pas été visionnés en continu. `verdict-1.md` conclut à `ship` après résolution des trois constats : séparation des matières de rallye, retrait des embouts flottants et mise à jour du contexte produit. Le verdict porte sur ces modèles et corrections, sans audit global du paysage ou des autres jeux.

`test/spectator-configured-models.test.js` comporte trois tests couvrant toutes les options des sept emplacements véhicule et des cinq emplacements fusée, les trois assets d'artistes et la séparation des matières. Les contrôles portent notamment sur la différence de géométrie, les sommets/normales/UV finis, les faces non dégénérées, les transformations positives, les quatre pivots et la conservation des plans, racines et géométries sources. `data/config-models-targeted.log` rapporte 3/3 réussites et `data/config-models-final-tests.log` 263/263, aucun échec, en 75,06 s ; `build:web` a réussi. `asset-validation.json` donne zéro erreur et zéro avertissement Khronos pour chacun des trois nouveaux GLB, avec informations conservées. Ces preuves échantillonnées ne certifient ni une qualité AAA globale, ni la fluidité continue, ni les performances GPU.

## Articulations, faces et replays

Knight est préparé dans un repère en mètres sans racine à échelle négative. Ses paumes sont repérées à partir des articulations des doigts pour orienter l'équipement ; les cinq doigts de chaque main utilisent leurs trois joints pour la prise. Les prises sont traitées en miroir, avec l'index au-dessus du petit doigt ; 70 % de la torsion calculée est répartie sur l'avant-bras avant l'orientation finale de la main. Le cuir habille les gants ; visière, charnières, rondelles et rivets reprennent le matériau de l'armure. Le bouclier reçoit une poignée et ses supports. Les pieds et les mains reçoivent des cibles de cinématique inverse, sans déplacer la racine enregistrée. Le cavalier suit un point de selle porté par le dos du cheval, et ses chevilles rejoignent les cibles d'étrier. La cape et la respiration suivent le temps de lecture. L'archer ancre la main près de la joue et place la corde au contact du doigt pendant la traction ; la corde revient au repos après le signal de départ, et la flèche tenue n'est visible que durant la préparation du tir. Cette présentation ne calcule pas de trajectoire balistique ou de nouveau contact physique. Le repli Dude conserve sa conversion dans un repère droit, avec positions, normales, squelette et marche réfléchis ensemble.

La cape utilise un maillage évasé préformé, un ourlet courbe, des plis en profondeur et des attaches d'épaule. La couture supérieure reste fixée ; seuls les pans libres sont déformés selon le temps enregistré, l'activité et la phase. Cette présentation ne déplace ni squelette ni racine et ne simule pas de contacts de tissu.

Les contrôles du personnage couvrent les 51 joints, la conservation des longueurs et de la racine, la restitution de la pose après recherche arrière et les cibles d'étrier. L'appui des pieds est échantillonné à la marche et à la course avec une tolérance de dérive de 1 mm. Cent poses à quatre vitesses contrôlent les sommets, avec un seuil d'intersection du sol de 1 mm. Les contrôles de prise couvrent l'orientation des deux mains, un ancrage de tir à moins de 17 cm du joint de tête, un écart corde/doigt inférieur à 1 mm pendant la traction et le retour de corde après le départ. La cape est contrôlée pour sa couture fixe, ses plis non plans, ses faces et la restitution déterministe de sa pose. Ce sont des tests de géométrie sur ces échantillons, pas une validation de toutes les prises, intersections ou poses.

Les étincelles de combat restent de petite taille et prennent pour origine la hauteur du torse du sujet nommé dans l'événement enregistré. Leur lumière ponctuelle est limitée à une intensité de 0,35 et une portée de 1,4 m. Elles ne déterminent ni le destinataire des dégâts ni leur résultat.

La cadence des pas est liée à la distance cumulée dans les images du replay. La longueur du cycle tient compte de la durée d’appui pour éviter le glissement des sabots ; un test fait avancer la racine enregistrée et contrôle la position mondiale de chacun des quatre sabots posés à la marche et à la course. Cette piste de présentation est stockée à part : elle ne modifie ni les états ni les actions. Une recherche arrière restitue le même trajet et la même pose visuelle à la précision numérique du rendu. La pause fige également le cheval, les roues, les particules et l’eau.

Les allures sont mélangées selon une vitesse filtrée de façon déterministe à partir des images archivées : attente → marche → course et retour. Le mélange est continu ; il n’utilise pas l’historique de navigation du spectateur. Une correction des articulations maintient les sabots à plat après le mélange, sans relever ni déplacer la racine du cheval. Les libellés anatomiques sont contrôlés par coordonnées (+Z vers l’avant, gauche +X), indépendamment des anciens noms L/R de la source. Le pas conserve son ordre arrière gauche → avant gauche → arrière droit → avant droit.

Contrôles automatiques locaux : les treize GLB passent le validateur Khronos sans erreur ; leurs positions et poids sont finis, les indices de joints sont valides et les transformations n’ont pas de déterminant négatif. Le rapport conserve dix-huit avertissements `NODE_SKINNED_MESH_NON_ROOT` : cinq pour le cheval et treize pour Knight. Ce résultat n'est donc pas un rapport sans avertissement. Les trois clips du cheval sont échantillonnés sur 85 poses chacun. Le plus bas sommet descend au maximum de 0,6 mm sous le plan de sol et la dérive latérale maximale d’un sabot est de 0,3 mm. Ces tolérances sont mesurées, pas présentées comme une absence absolue d’intersection. Le rapport est généré dans `.impeccable/review/model-validation.json`.

Les balistes, canons et rampes sont aussi contrôlés pour les sommets non finis, triangles dégénérés et transformations négatives : aucun cas dans les géométries livrées.

Le contrôle du rendu final ajoute 244 poses à quatre vitesses incluant les mélanges d’allure et la correction des sabots : aucun sommet sous le sol dans ces échantillons, aucune valeur non finie, racine inchangée. Cela ne constitue pas une vérification de toutes les interactions entre corps, équipement et décor.

La page [Inspection des modèles](../model-review.html) reprend les modèles et animations du spectateur. Elle permet une inspection de face, de profil et de dos, l’affichage du squelette et des arêtes, ainsi que la pause et le choix d’une pose. Les personnages et la Jeep suivent un parcours rectiligne synthétique ; caméra, lumière et sol suivent le sujet, tandis que les textures du sol compensent son déplacement pour examiner les appuis. Le mode Transitions utilise un cycle de six secondes : accélération, course, ralentissement puis arrêt tenu de t=4 à t=6, à vitesse exactement nulle et distance constante de 4,4 m au premier cycle. Les modes Marche et Course conservent leur allure continue. Baliste, canon et rampe restent accessibles isolément. Cet outil n'implique ni match ni agent et ne constitue pas une partie de compétition.

## Reproduire la préparation

Les fichiers livrés fonctionnent sans outils de création. Pour reconstruire la bibliothèque, depuis la racine du dépôt :

```powershell
npm install --prefix data/asset-tools @gltf-transform/core@4.5.1 @gltf-transform/extensions@4.5.1 @gltf-transform/functions@4.5.1 gltf-validator@2.0.0-dev.3.10 meshoptimizer@1.3.0 mikktspace@1.1.1 sharp@0.35.5
node scripts/fetch-spectator-sources.mjs
& 'C:\Program Files\Blender Foundation\Blender 5.2\blender.exe' --background --disable-autoexec data/spectator-assets/source/knight/knight.blend --python scripts/prepare-spectator-knight.py
node scripts/prepare-spectator-library.mjs
node scripts/verify-spectator-assets.mjs
node --test test/spectator-models.test.js
npm run build:web
```

Adapter le chemin de Blender à son installation locale. La recette Knight nécessite Blender 5.2 : ouvrir le fichier avec `--disable-autoexec` avant d'exécuter le script de préparation du projet. Ce script exporte `data/spectator-assets/source/knight/knight-raw.glb`, requis par la préparation de bibliothèque ; il ne lance pas les scripts embarqués du fichier source.

Le téléchargement vérifie les empreintes avant utilisation. Les sources et les outils restent dans `data/`, hors du dépôt. Le convertisseur du personnage de secours est distinct et facultatif pour reconstruire la bibliothèque principale : `node scripts/prepare-spectator-character.mjs`. Les textures JPEG livrées comportent leur provenance dans les métadonnées.

Les trois véhicules configurables ont une recette séparée, avec les mêmes dépendances `data/asset-tools` ci-dessus et les dépendances du projet installées. Elle ne nécessite pas Blender et ne reconstruit pas les treize GLB de bibliothèque :

```powershell
node scripts/fetch-configured-vehicles.mjs
node scripts/prepare-configured-vehicles.mjs
node --test test/spectator-configured-models.test.js
npm run build:web
```

Le téléchargement utilise les copies Objaverse indiquées dans `vehicles/sources.json`, vérifie le SHA-256 avant écriture et refuse une source distante modifiée. La préparation revérifie les sources dans `data/configured-models/sources/`, puis écrit les trois GLB, leur index et leur notice dans `assets/spectator/vehicles/`. Les fusées sont construites par le code de présentation et n'ont pas d'étape d'import d'asset.

## Niveau de qualité et limites

Les chevaux en ellipsoïdes, véhicules en boîtes, personnage principal ancien et principaux décors simplifiés sont remplacés dans la diffusion par ces assets détaillés. **Le terme AAA reste un objectif artistique, pas un résultat certifié par le nombre de polygones ou la présence de bloom.** Dude reste un repli de chargement ; Knight apporte une géométrie d'artiste et un squelette plus adapté, sans constituer une preuve d'absence de pénétration entre armure, cape, mains et équipement. Les contacts visuels entre armes et corps ne sont pas une nouvelle simulation. La course et la fusée gardent la géométrie des pistes et les proportions de présentation nécessaires à la lecture des parties existantes.

L'occlusion ambiante est calculée à demi-résolution et la densité de pixels est plafonnée à 1,5. Les animations de combat sont liées aux signaux enregistrés ; elles ne constituent pas une nouvelle simulation de contacts entre les armes et les corps. La vérification visuelle locale et les mesures de fluidité ne valent pas validation sur toutes les cartes graphiques.

## Correctifs du 31 octobre 2026 : conservation, raccords et vol

Les seize MP4 des deux lots précédents sont conservés dans leurs dossiers d'origine. Les catalogues en mémoire sur 4317, 4321 et 4331 étaient distincts : le dernier ne montrait que six matchs et excluait donc RTS et robots. `scripts/collect-spectator-archives.mjs` a récupéré les 22 archives complètes de ces services, sans renouveler leurs sessions existantes. `npm run spectator:archive` lance le catalogue commun sur [4341](http://127.0.0.1:4341/spectator.html), avec `Spectateur3D` / `spectateur-3d-local`. Les imports sont conservés dans `data/spectator-archive/imports.json` et les comptes/matchs dans `catalog.json`, à l'écart de `data/arena-v2.json`. Un import identique est ignoré ; un export différent du même identifiant reçoit une version distincte. Les replays et plans restent exacts ; les noms publics des participants sont remappés vers des comptes locaux, sans conservation à l'identique des identités sources. Ce catalogue local doit rester la destination de test ; les anciens générateurs restent des services temporaires distincts.

`src/spectator-vehicle-fit.js` remplace les coordonnées fixes des équipements par des ancrages mesurés sur les vrais maillages. Les quatre pieds d'admission et les renforts de toit rejoignent les surfaces ; boîtier de transmission, couvercle de différentiel, protections latérales et combinés sont ajustés à leurs attaches. Un équipement sans surface d'appui est omis. Une carcasse de caoutchouc fermée complète les sculptures originales des pneus : ses arêtes géométriques sont partagées par deux faces et sa couverture radiale est testée sur 360°. Elle suit les mêmes pivots et axes que la roue source, sans ajouter de collision.

La fusée dispose d'un paysage de 800 × 800 unités de rendu, avec collines, crêtes éloignées, textures photographiques et groupes de pins, fougères et roches d'artistes. Le corridor du vol et le pas de tir conservent leur niveau de présentation. Une couche de cumulus discontinue utilise des plans à transparence bruitée répartis en profondeur, avec parallaxe et dérive déterministe au temps du replay ; ce n'est pas un calcul de volumes nuageux par lancer de rayons. Les nuages sont exclus du SSAO pour éviter les rectangles opaques. Ces décors n'agissent pas sur la physique, le vent simulé ou les actions.

Le nouveau lot `.impeccable/review/archive-vehicle-clouds-pass/` ajoute six films (Trophy, Rallye, fusée, RTS, robots, défense) issus de 921 captures natives horodatées, ainsi que les vues de bureau, téléphone et largeur utilisateur. `videos.md` regroupe les liens nouveaux et anciens ; `motion/video-manifest.json` conserve leurs caractéristiques et les images clés. L'encodage ne recadre ni ne redimensionne les captures, hors ajout éventuel d'un pixel pair, et n'ajoute pas de bande-son. Les films ne constituent pas une mesure des performances GPU.

`data/archive-repair-final-tests.log` rapporte 267 tests réussis et aucun échec. Les contrôles de `test/spectator-repair.test.js` couvrent carcasses, contacts d'attache, braquage/rotation, paysage, nuages déterministes et conservation des versions d'archive. `data/archive-repair-preservation.json` consigne 22 replays exacts, seize films présents à taille inchangée, dix-neuf fichiers protégés inchangés et la base principale préservée ; le catalogue est identique après redémarrage, avec authentification et pagination retenues. Le résultat de l'unique détecteur fourni est `[]` dans `data/archive-repair-detector.json`.

La revue finale `review.md` de ce lot conclut à `ship` pour cette réparation après inspection de dix-neuf captures finales et dix-huit images clés ordonnées. `desktop-trophy-moving.jpg` est intermédiaire et exclu des preuves finales. Les MP4 n'ont pas été visionnés en continu ; ni fluidité continue, ni performance GPU, ni qualité AAA globale ne sont certifiées. Cette extension conserve le Moniteur de diffusion existant et ses composants d'interface.
