ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Galaxy: interactive real-time 3D solar system in the browser. Real NASA/JPL Horizons ephemerides, true-scale exploration mode, time travel, interstellar objects, spacecraft missions and scientific asteroid shape models. TypeScript + Three.js.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Visualisateur interactif du système solaire en temps réel, développé en TypeScript avec Three.js. Deux modes d'affichage : Éducatif (distances compressées en √, tout visible d'un coup) et Exploration (vraie échelle astronomique). Les positions viennent de fichiers NASA/JPL Horizons, d'astronomy-engine et d'éléments képlériens, chacune mesurée contre Horizons : méthode et précision sur /methodology. Le mode Exploration est actif avec l'expérience « Voyage spatial » : suivi caméra, distances réelles, temps-lumière et marqueurs projetés.README 전문 보기 ↗
🌍 Démo en ligne → galaxy.adrianguichard.dev
Visualisateur interactif du système solaire en temps réel, développé en TypeScript avec Three.js. Deux modes d'affichage : Éducatif (distances compressées en √, tout visible d'un coup) et Exploration (vraie échelle astronomique). Les positions viennent de fichiers NASA/JPL Horizons, d'astronomy-engine et d'éléments képlériens, chacune mesurée contre Horizons : méthode et précision sur /methodology. Le mode Exploration est actif avec l'expérience « Voyage spatial » : suivi caméra, distances réelles, temps-lumière et marqueurs projetés.
Permaliens partageables, événements astronomiques, zoom optique et visite guidée au premier démarrage complètent les contrôles de navigation, de temps et les deux modes d'échelle.
| Lib | Version | Rôle |
|---|---|---|
| Three.js | 0.176 | Rendu WebGL 3D |
| astronomy-engine | 2.1.19 | Éphéméride : positions planétaires réelles |
| @tweenjs/tween.js | 25.0 | Animations caméra fluides |
| Vite | 6.3 | Bundler + dev server |
| TypeScript | 6.0 | Typage strict |
# Cloner le dépôt
git clone https://github.com/Addey34/galaxy-3d.git
cd galaxy-3d
# Installer les dépendances (pnpm recommandé)
pnpm install
# Lancer le serveur de développement
pnpm dev
Ouvrir http://localhost:5173 dans le navigateur.
pnpm dev # Serveur de dev avec hot reload
pnpm build # tsc --noEmit (vérification de types) puis build de production → dist/
pnpm preview # Servir le build de production localement
pnpm typecheck # tsc --noEmit seul : vérification stricte des types, sans build
pnpm test # vitest run : tests unitaires des modules mathématiques purs
pnpm test:e2e # playwright test : tests navigateur sur le port dédié 5273
pnpm ephemeris:generate # régénérer les vecteurs précis depuis NASA/JPL Horizons
pnpm textures:resize # generate missing derived texture resolutions
pnpm format # Formater les fichiers TypeScript/CSS avec Prettier
pnpm format:check # Vérifier le formatage sans réécrire
pnpm lint # eslint . (flat config) ; pnpm lint:fix pour corriger
pnpm verify # tsc --noEmit && eslint . && format:check && vitest run (gate local rapide)
pnpm verify:all # verify + build + test:e2e (validation exhaustive)
pnpm budget:startup # après un build : ce que le démarrage exécute de JavaScript, confronté à son plafond
pnpm budget:measure # le démarrage mesuré par famille dans un vrai navigateur (la méthode derrière les nombres)
Les textures sont incluses dans le dépôt, sous public/assets/textures/, organisées par corps céleste :
public/assets/textures/
├── stars/
│ └── stars_surface_8k.jpg (+ _4k, _2k, _1k)
├── sun/
│ └── sun_surface_4k.jpg (+ _2k, _1k)
├── earth/
│ ├── earth_surface_8k.jpg (+ _4k, _2k, _1k)
│ ├── earth_normal_map_8k.jpg
│ ├── earth_clouds_8k.jpg
│ ├── earth_spec_8k.jpg
│ └── earth_lights_8k.jpg (lueurs nocturnes)
├── mars/
│ └── mars_surface_8k.jpg (+ _4k, _2k, _1k)
├── venus/
│ ├── venus_surface_8k.jpg (+ _4k, _2k, _1k)
│ └── venus_atmosphere_4k.jpg (+ _2k, _1k)
├── saturn/
│ ├── saturn_surface_4k.jpg (+ _2k, _1k)
│ └── saturn_ring_8k.jpg (bande radiale, ratio conservé)
├── callisto/
│ └── callisto_surface_8k.jpg (+ _4k, _2k, _1k)
└── … (un dossier par corps du catalogue)
Pattern de nom : {corps}/{corps}_{couche}_{résolution}.jpg (snake_case).
Le chemin est dérivé de la clé du corps (src/config/catalog.ts → texturePath) : aucun
chemin n'est écrit à la main dans le catalogue. Couches : surface, clouds, atmosphere,
lights, normal_map, spec, ring. Résolutions : 1k, 2k, 4k, 8k (la plus haute
selon le corps ; voir src/config/engine.ts pour les seuils de LOD).
Jusqu'où un corps monte n'est pas un choix libre : il livre les paliers que sa source
publiée porte réellement, et un palier ne se livre que s'il montre ce que le palier du
dessous ne montre pas. La règle est dans src/core/textureLadder.ts, le relevé mesuré dans
src/config/textureLadder.json (pnpm textures:ladder), et le contrat complet dans
docs/ARCHITECTURE.md § « L'échelle de résolutions d'une texture ». Un corps servi en 2k
n'est donc pas un corps négligé, c'est un corps dont la carte publiée s'arrête là.
| Mode | Distances | Tailles | Positions |
|---|---|---|---|
Éducatif (educ) | Compressées (√AU × 35) | Visuelles | Angle réel, rayon visuellement comprimé |
Exploration (explo) | Réelles (AU × 35) | Physiques (km) | Vecteurs réels à l'échelle linéaire |
Les lignes d'orbite sont disponibles dans les deux modes, pour tous les corps et après chaque changement de date. Elles servent de repère global. Les deux modes utilisent le même vecteur astronomique instantané ; seule la transformation d'échelle diffère.
Basculer avec les boutons Éduc. / Explo. dans l'interface. En Exploration, la caméra cible la Terre par défaut ; le HUD « Voyage spatial » affiche la cible, sa distance réelle et son temps-lumière. Les marqueurs projetés permettent de repérer les autres corps.
Le mode Exploration respecte strictement les rayons, distances et tailles angulaires physiques. Un corps lointain peut donc être invisible à l'œil nu : les labels sont des instruments de navigation, pas un agrandissement du rendu. Un éventuel zoom optique devra modifier le champ de vision de la caméra, jamais l'échelle des objets.
src/ui/speedSlider.ts.)MeshStandardMaterial PBR avec normal map et specular mapsrc/
├── MainSolarSystemApp.ts # Racine de composition : démarre l'app et les modules UI
├── SolarSystemApp.ts # Façade : coordonne l'initialisation dans l'ordre
├── types.ts # Interfaces TypeScript partagées
│
├── core/
│ ├── EphemerisService.ts # Wrapper astronomy-engine → positions en UA (prend des enums Body)
│ ├── frames.ts # ⓟ Repères : équatorial J2000 → écliptique → Three.js
│ ├── kepler.ts # ⓟ Éléments orbitaux → position écliptique (ellipse et hyperbole)
│ ├── twoBodyPropagation.ts # ⓟ Propagation d'un état (position + vitesse) sur sa conique
│ ├── SimulationClock.ts # Horloge simulée avec time travel et vitesse variable
│ ├── ScaleService.ts # Conversion UA → unités Three.js (modes educ/explo)
│ ├── eclipse.ts # ⓟ Occultation et ombre portée (cuivrée derrière une atmosphère)
│ ├── overlayScale.ts # ⓟ Échelle des couches 2D pendant la transition Éduc ↔ Explo
│ ├── labelSpace.ts # ⓟ Place occupée commune à toutes les couches de libellés
│ ├── viewAngles.ts # ⓟ Angles de caméra pour regarder une cible depuis une direction
│ └── OrbitalMechanics.ts # Pilote les positions planétaires chaque frame
│ # ⓟ = module pur sans état, testé unitairement (*.test.ts)
│
├── components/
│ ├── systems/
│ │ ├── AnimationSystem.ts # Boucle requestAnimationFrame, frustum culling, LOD
│ │ ├── CameraSystem.ts # OrbitControls + suivi de cible + tweens
│ │ ├── SceneSystem.ts # Scène Three.js, renderer, hiérarchie des corps
│ │ ├── GlowPass.ts # Halo lumineux (qualité haute) : sélection, flou par mips, composition
│ │ ├── glowSelection.ts # Qui brille et combien : markGlowSource / markGlowOccluder
│ │ ├── LightingSystem.ts # AmbientLight + PointLight solaire
│ │ └── TextureSystem.ts # Cache singleton + LOD textures
│ └── celestial/
│ ├── CelestialObject.ts # Une planète (meshes, couches, shader, LOD textures)
│ ├── CelestialObjectFactory.ts # Crée tous les corps depuis la config
│ └── Starfield.ts # Skybox étoilée
│
├── config/
│ ├── bodies.ts # CELESTIAL_CONFIG : dérivé du registre (code seul, plus de donnée)
│ ├── engine.ts # Réglages moteur : rendu, perf/LOD, caméra, éclairage, shaders, textures
│ # (imports via l'alias @/ → src/ ; ex. @/config/engine, @/core/frames)
│ ├── catalog.ts # Itération/résolution du catalogue (forEachBody, flattenBodies)
│ └── layerConfig.ts # Géométries et matériaux Three.js
│
│ # Le catalogue lui-même est de la donnée : une fiche JSON par corps dans
│ # src/registry/entities/ (ordre dans order.json), reconstruit par src/registry/load.ts.
│
├── ui/
│ ├── planetNav.ts, modeSwitcher.ts # Navigation et modes
│ ├── playback.ts, timePanel.ts # Lecture et voyage temporel
│ ├── exploHud.ts # HUD et labels « Voyage spatial »
│ ├── spacecraftOverlay.ts, interstellarOverlay.ts, smallBodyOverlay.ts
│ │ # Couches instrument 2D (sondes, 1I/2I/3I, petits corps)
│ ├── bodyInfo.ts # Fiche documentaire, crédit du modèle de forme inclus
│ └── loader.ts, fullscreen.ts # Contrôles transverses
│
├── shaders/
│ └── NightLightsShader.ts # GLSL vertex + fragment shader pour les lueurs nocturnes
│
└── utils/
├── Logger.ts # Logs colorés (silencieux en production sauf erreurs)
└── FPSCounter.ts # Compteur FPS overlay
index.html
└── MainSolarSystemApp.ts (racine de composition async)
├── SolarSystemApp.init(progressCallback)
├── TextureSystem.preloadCriticalTextures() 0 → 40%
├── SceneSystem.init() 45%
├── LightingSystem.setup() 60%
├── CelestialObjectFactory.createAll() 75%
├── SceneSystem.setupCelestialBodies() 85%
├── CameraSystem.init()
├── EphemerisService + SimulationClock
├── OrbitalMechanics (hook onOrbitsChanged)
├── _recomputeOrbits() 95%
│ └── AnimationSystem.run()
│ → boucle infinie
└── setup*Controls() + ExploHud
requestAnimationFrame
├── tweenGroup.update() Animations caméra
├── OrbitalMechanics.update()
│ ├── SimulationClock.syncToRealTime()
│ └── EphemerisService → body.group.position (positions Kepler)
├── Frustum culling (une passe pour tous les objets)
├── CelestialObject.update() × N
│ ├── Rotation du mesh + nuages
│ └── Shader uniforms (position du soleil)
├── CameraSystem.update() Suivi de la planète cible
├── ExploHud.update() HUD + labels projetés (si Explo)
└── renderer.render(scene, camera)
Mode Éducatif : position = √(distanceAU) × 35 (compression visuelle)
Mode Exploration : position = distanceAU × 35 (vraie proportionnalité)
Pour un satellite parent-relative, le mode Éducatif applique en plus un facteur commun
au groupe de satellites afin de garder chaque lune hors du parent tout en conservant
l’ordre de distance réel. Le mode Exploration n’applique aucun facteur visuel.
Terre (1 AU) → 35 unités dans les deux modes (point de calibration commun)
astronomy-engine retourne des vecteurs en équatorial J2000 (UA)
↓
Rotation de l'obliquité J2000 ε = 84 381,448″ (IAU 1976, celle qui définit
l'écliptique des fichiers Horizons ; `OBLIQUITY_RAD` dans src/core/frames.ts)
↓
Écliptique (x, y, z) → Three.js, plan XZ = écliptique, +Y = nord écliptique
ex = X
ey = Y × cos(ε) + Z × sin(ε)
ez = -Y × sin(ε) + Z × cos(ε) (≈ 0 pour les planètes)
Three.X = ex, Three.Y = ez, Three.Z = -ey (rotation propre, pas un miroir)
Le catalogue est le registre src/registry/entities/ (une fiche JSON par corps, ordre dans
order.json) : src/registry/load.ts en dérive le CelestialConfig que lit toute
l'application, et boutons de navigation, préchargement des textures, éphéméride et hiérarchie de
scène s'en dérivent automatiquement. La marche à suivre complète (fiche, formes déclarées, faits
sourcés, régénération des artefacts) vit dans CONTRIBUTING.md ; corps
d'épreuve livré : 16 Psyché, ajoutée sans toucher une ligne de TypeScript.
Les fichiers binaires de public/assets/ephemerides/ contiennent des états JPL en écliptique
J2000 (positions en UA, vitesses en UA/jour), héliocentriques pour les planètes, les planètes
naines, les astéroïdes, la comète de Halley et les sondes, relatifs à leur corps parent pour les lunes (Charon et les petites lunes
de Pluton compris). Centre, pas et couverture de
chaque fichier sont déclarés dans manifest.json et publiés sur
/sources.
HorizonsEphemerisService choisit son interpolation selon ce que le pas résout : une cubique de
Hermite à partir de MIN_SAMPLES_PER_ORBIT_FOR_HERMITE échantillons par révolution, sinon les
deux états qui encadrent la date sont propagés le long de leur conique puis fondus, ce qui garde
les échantillons exacts comme ancres. Hors couverture, ou si une valeur échoue au test de
plausibilité, les planètes retombent sur astronomy-engine, les lunes et petits corps sur leurs
éléments képlériens, et une sonde n'est simplement pas dessinée. Le contrat complet est dans docs/ARCHITECTURE.md § « Position d'un corps ».
SpkKernel lit les kernels DAF/SPK en types 2 et 3 (Chebyshev), SpkWorkerEphemerisProvider convertit le J2000 equatorial en repere Galaxy, et SpkKernelWorkerClient deplace le chargement et le parsing hors du thread principal ; avec une URL configuree, le Worker lit d abord les tables DAF puis les segments requis par HTTP Range. L'application utilise les fichiers Horizons par défaut ; quand un noyau SPK est configuré, il passe AVANT eux.
Pour activer le chemin SPK optionnel, definir VITE_SPK_KERNEL_URL vers un kernel same-origin avant le demarrage Vite. Le provider Worker se charge en tache de fond, utilise les vitesses pour une extrapolation courte et revient a Horizons ou Kepler en cas de manque.
Le mode de publication du gros kernel SAT441 et sa vérification HTTP Range sont détaillés dans docs/SPK_DEPLOYMENT.md.
Pour actualiser les solutions orbitales après une mise à jour JPL :
pnpm ephemeris:generate
Le moteur depend du contrat PreciseEphemerisProvider : Horizons reste la source embarquee par defaut ; quand le SPK est configure, FallbackPreciseEphemerisProvider interroge d abord le provider Worker et retombe sur Horizons pour tout corps ou toute date qu il ne couvre pas encore.
Réglages moteur dans src/config/engine.ts, catalogue des corps dans src/registry/entities/ (fiches JSON, assemblées par src/registry/load.ts en le CelestialConfig que src/config/bodies.ts expose) :
| Constante | Fichier | Rôle |
|---|---|---|
APP_SETTINGS.performance.targetFPS | engine | FPS cible (défaut 60) |
APP_SETTINGS.performance.textureQuality | engine | Seuils de distance LOD par qualité |
LIGHTING_SETTINGS | engine | Intensité lumière ambiante et solaire |
SHADER_SETTINGS.nightLights | engine | Intensité / seuil / douceur des lueurs nocturnes |
CAMERA_SETTINGS.defaultBodyDistance | engine | Distance caméra fallback |
CELESTIAL_CONFIG.bodies[*].cameraDistance | bodies | Distance de visite par corps { educ, explo } |
MAX_SIMULATION_SCALE | ui/speedSlider | Vitesse maximale du curseur : un an simulé par seconde réelle (31 557 600), sur un curseur exponentiel bidirectionnel dont le centre est le temps réel. Corrigé le 2026-09-26 : cette ligne annonçait une liste de vitesses discrètes [1, 3600, 10800, 21600], SUPERSEDED depuis le 2026-09-23 |
tsconfig.json) : Vite sert/compile le TS via esbuild (pas de vérification de types en dev) ; pnpm typecheck ou pnpm build (qui lance tsc --noEmit) valide réellement les typessrc/**/*.test.ts) ; pnpm verify = types + lint + formatage + testseslint.config.js (flat config, typescript-eslint recommended non-type-checked) ; pnpm lint / pnpm lint:fix, intégré à pnpm verify.prettierrc, commandes pnpm format et pnpm format:check ; l'arbre entier est conformee2e/ (boot, navigation, i18n, accessibilité, WebXR, météo, etc. ; voir pnpm exec playwright test --list pour le compte à jour) ; le serveur Vite de test utilise le port réservé 5273pnpm verify passe (types + lint + formatage + tests unitaires) ; voir pnpm test pour le compte à jour, ces chiffres évoluent trop souvent pour rester figés ici ;pnpm build passe : three, astronomy-engine et tween sont séparés du chunk applicatif. Les poids ne sont pas recopiés ici, ils sont MESURÉS par une garde : pnpm budget:startup imprime ce que le démarrage exécute de JavaScript, morceau par morceau, et le confronte à son plafond (corrigé le 2026-09-26 : cette ligne annonçait 107 kB gzippés pour 166, et 345 kB bruts pour 551 458 octets).IS_MOBILE reste figé pour les réglages créés à l'initialisation (anticrénelage, ombres, textures) ; seul le plafond de pixel ratio est recalculé au resize.frame: 'parentRelative' calcule helio(corps) − helio(parent). La Lune, Io et Europe viennent d'Astronomy Engine, mesuré plus précis que leurs fichiers ; les autres satellites viennent des binaires NASA/JPL Horizons livrés (relativeEphemeris.kind: 'horizonsParentRelative'), avec un repli képlérien. Le noyau SPK SAT441 est un chemin OPTIONNEL (VITE_SPK_KERNEL_URL) qui prime sur ces binaires seulement quand il est configuré : cf. docs/ARCHITECTURE.md § « Position d'un corps ». Corrigé le 2026-09-28 : cette ligne présentait SAT441 comme la source des lunes saturniennes livrées..gitattributes normalise les fichiers texte en LF ; pnpm format:check passe sur tout l'arbre.En résumé : d'abord rendre le projet visible (déploiement public, CI, SEO) et instructif (fiches d'information par corps, interface et contenu en quatre langues, transition animée Éducatif→Exploration), ensuite donner des raisons de revenir, enfin en faire une référence.
Les trois étapes sont livrées : permaliens, événements astronomiques, zoom optique FOV, visite guidée, lunes majeures sur éphémérides réelles, mode hors-ligne (PWA ; les positions précises se préparent à la demande, par le réglage « Utilisation hors ligne »), tours guidés scriptés, missions spatiales, filtres de petits corps, mode capture, WebXR, une page indexable par corps avec sa propre vignette de partage, une page par éclipse de 2024 à 2035, et les trois objets interstellaires connus (1I/ʻOumuamua, 2I/Borisov, 3I/ATLAS) sur leur vraie trajectoire hyperbolique. Ce qui reste demande du matériel ou un humain : confirmer le vol libre WebXR sur un vrai casque, une passe lecteur d'écran (NVDA/VoiceOver) et une mesure FPS sur GPU physique.
docs/ARCHITECTURE.md : frontières, cycle de vie et invariantsdocs/TESTING.md : stratégie et commandes de validationdocs/PERMALINK_GALLERY.md : vues remarquables partageables par URLCONTRIBUTING.md : règles de contribution, ajout d'un corps, workflow de PRVoir CONTRIBUTING.md, en particulier la marche à suivre pour ajouter un
corps céleste (catalogue + textures + vérification), le workflow de PR et les gabarits d'issues
(.github/ISSUE_TEMPLATE/).
Le site public est servi sur galaxy.adrianguichard.dev par Cloudflare Pages (projet galaxy-3d, déploiement direct). Depuis le 2026-10-26 le site ne passe plus par Firebase Hosting : son quota gratuit de transfert avait coupé le site. Les textures et les modèles sont servis par un Worker Cloudflare (galaxy-static), les éphémérides par le service de données galaxy-data (voir services/galaxy-data/README.md). Chaque push sur main est vérifié par la CI GitHub (pnpm verify, audit des dépendances, build) puis déployé automatiquement sur Pages.
Le build émet, en plus du bundle, une page statique indexable par corps (dist/jupiter/index.html),
une page par éclipse solaire ou lunaire de 2024 à 2035 (dist/eclipse/2026-08-12/index.html, qui
ouvre l'application au pic de l'éclipse), les pages /methodology et /sources en anglais et en français, le sitemap complet et une vignette de partage par corps
(dist/social/jupiter.jpg, rendue depuis la texture déjà versionnée du corps). Tout cela est dérivé du catalogue et régénéré à chaque
build : rien n'est committé. Voir docs/ARCHITECTURE.md § « Pages d'atterrissage par corps ».
Le déploiement se fait par la CI. Pour le rejouer à la main, il faut les deux origines des gros fichiers :
VITE_ASSET_ORIGIN=https://galaxy-data.adrianguichard.dev \nVITE_STATIC_ORIGIN=https://galaxy-static.galaxy-3d.workers.dev pnpm build
node scripts/check-asset-origin.mjs
node scripts/prepare-pages.mjs
npx wrangler pages deploy dist-pages --project-name galaxy-3d --branch main
Galaxy est archivé sur Zenodo et porte un identifiant pérenne. Le DOI ci-dessous est le DOI de concept : il désigne l'œuvre et résout toujours vers la version la plus récente, de sorte qu'une référence écrite aujourd'hui ne pourrira pas à la prochaine publication.
Guichard, A. (2026). Galaxy: 3D Solar System (version 0.10.0) [Software]. Zenodo. https://doi.org/10.5281/zenodo.22985614
Le DOI n'est écrit qu'à un seul endroit du dépôt, CITATION.cff, que GitHub et la
plupart des gestionnaires de références lisent directement ; les pages
/methodology et
/sources le LISENT au lieu de le répéter, et un test
(src/config/citationMetadata.test.ts) confronte la valeur ci-dessus à ce fichier. Le DOI de la
version 0.10.0 elle-même, si l'on veut désigner cet état précis plutôt que l'œuvre, est
10.5281/zenodo.22985615.
Code sous PolyForm Noncommercial License 1.0.0 : consultation, étude et usage
non commercial autorisés ; l'usage commercial est réservé à l'auteur. Voir
LICENSE.md. Les textures, modèles de forme, éphémérides et données météo restent
soumis à leurs licences d'origine (notamment NASA, USGS, NOAA, JAXA, Solar System Scope en
CC BY 4.0, Open-Meteo en CC BY 4.0, ERA5 / Copernicus), de même que les événements
terrestres (catalogue USGS dans le domaine public des États-Unis, NASA EONET). Le détail
fait foi dans
THIRD_PARTY_NOTICES.md et, corps par corps, sur
/sources.
Le catalogue (src/registry/entities/, fiche JSON par corps) couvre le Soleil, les planètes, leurs
principales lunes, des planètes naines, des astéroïdes et des comètes. La liste ne se recopie
pas ici : elle périmerait. Chaque corps a sa page (/{corps}/), et
/sources donne, lu dans le dépôt au build, la
provenance de chaque texture et modèle, la source de position de chaque corps et son erreur
mesurée. Les textures suivent le schéma public/assets/textures/{body}/{body}_{layer}_{quality}.jpg
(snake_case, chemin dérivé de la clé du corps) ; le repli coloré reste disponible si un asset
manque au chargement. Les provenances sont tracées dans src/registry/products/textures/
(une fiche par couche).
Bennu, Éros, Itokawa, Ryugu et Ida portent leur vrai modèle de forme de mission, décimé pour le
web, à l'échelle de leur volume réel.
Les trois objets interstellaires (1I/ʻOumuamua, 2I/Borisov, 3I/ATLAS) sont traces en couche
instrument 2D, en Educatif comme en Exploration, sur leur trajectoire hyperbolique : elements
JPL Horizons a l'epoque de chaque solution (pnpm ephemeris:interstellar), positions verifiees
contre les vecteurs Horizons sur ±20 ans autour du perihelie.
La feuille de route complete distingue :
Les spheres naturelles utilisent les geometries Three.js et des couches texturees. Les modeles GLB, les missions et le ciel profond attendent un contrat de referentiel, licence, LOD, proprietaire GPU et fallback. Voir docs/UNIVERSE_CATALOG.md avant tout nouvel asset.
pnpm textures:audit verifie que chaque texture declaree dans le catalogue possede ses LOD sur disque et controle les dimensions/projections JPEG avec Sharp. Une resolution 8k generee par upscale n'est jamais consideree comme une source native : le catalogue est plafonne a la meilleure resolution reelle disponible.
Les avertissements de largeur non canonique sont conserves volontairement pour les sources historiques (par exemple Halley 3674 px et le bump lunaire 4000 px) ; ils signalent une approximation documentee, pas une texture manquante.