📖 closer: README refresh — wave 2 state (opus)

Was wave-1: CDN importmap, "schematic ring" NEOs, 13 gates. Now: vendored offline
Three.js, real NEO orbits, 22 gates, Epoch (deep-time) toggle, Sky-events layer +
event band, textured/tidally-locked/colourised moons, decade-century rates. Updated
intro, verify table, layer table, controls, architecture, credits.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
monsterrobotparty 2026-07-16 13:26:14 +10:00
parent bcb05f051e
commit 1092e2f0f8

View File

@ -3,11 +3,13 @@
A standalone, browser-based 3D solar-system explorer — the interplanetary sibling
of [GODSIGH](../GODSIGH), which watches Earth. Float above a compressed-scale
("MEGA") solar system with every world visible at once, moving on **real JPL
ephemerides**; scrub a time bar across centuries; fly the camera into orbit around
any planet, its moons circling; toggle **TRUE scale** and watch the system animate
out into its real, humbling emptiness. Live layers plot where Voyager 1, JWST and
Parker Solar Probe are *right now*, plus real asteroids, comets and Earth
close-approaches. Everything is client-side, free, and keyless.
ephemerides**; scrub a time bar across **six thousand years**; fly the camera into
orbit around any planet, its moons circling, textured and tidally locked; toggle
**TRUE scale** and watch the system animate out into its real, humbling emptiness.
Live layers plot where Voyager 1, JWST and Parker Solar Probe are *right now*, real
main-belt asteroids, comets, and near-Earth close-approaches on their **true
orbits** — and a computed almanac of oppositions and elongations on the time bar.
Everything is client-side, free, keyless, and runs **fully offline**.
![SOLARGOD](docs/hero.jpg)
@ -20,24 +22,29 @@ python3 serve.py # stdlib only — no npm, no build step
`serve.py` statically serves the app and proxies the JPL feeds a browser can't call
directly (Horizons / SBDB / CAD — no CORS), with a disk cache in `cache/`. Three.js
loads from a pinned CDN importmap. The deterministic core (Sun, planets, moons,
orbits, time travel) runs with **zero network calls** — positions are computed
locally from Keplerian elements; network layers are additive and fail soft.
is **vendored** under `vendor/three/`, so the app runs with no CDN. The
deterministic core (Sun, planets, moons, orbits, sky events, time travel) runs with
**zero network calls** — positions are computed locally from Keplerian elements;
network layers (spacecraft, asteroids, comets, close-approaches) are additive and
fail soft.
## Verify
Open **http://127.0.0.1:8147/verify.html** — an in-browser gate runner that checks
the ephemeris against **JPL Horizons ground truth** (hard-coded checkpoints + live
queries through the proxy). All 13 gates should read PASS, e.g.:
queries through the proxy). All **22 gates** should read PASS, e.g.:
| Gate | Result |
|------|--------|
| Mars / Jupiter / Earth @ 2026-07-15 (heliocentric ecliptic AU) | Δ ≤ 3.3e-4 / 2.9e-3 / 3.9e-5 AU |
| Kepler solver converges at e=0.97 · orbitPath closes · frame round-trips | exact |
| MEGA→TRUE preserves direction (unit dot ≈ 1) | 1.000000000000 |
| Kepler @ e=0.97 · orbitPath closes · frame round-trips · MEGA→TRUE keeps direction | exact |
| Mars @ J2000 · Jupiter @ 1900 vs **live** Horizons | Δ 4.8e-5 / 2.0e-3 AU |
| Main belt between Mars & Jupiter · Halley aphelion beyond Neptune | pass |
| Voyager 1 @ 2026-07-15 = (32.07, 136.21, +98.55) AU · JWST hugs Earth | Δ 0.002 / 0.011 AU |
| **NEO** propagated miss vs CAD (real orbit) | ≤ 25% (median ~0.6%) |
| **Sky events** — Mars opposition ±2 d of 2027-02-19 · Venus elongation cadence · nextEvent | pass |
| **Deep time** — Jupiter @ 1000 BC · Mercury @ 2500 vs live Horizons (Table 2a/2b) | Δ 0.004 / 3.3e-5 AU |
| **Event band** maps the ±2 yr window to full width | pass |
## Layers
@ -45,54 +52,60 @@ queries through the proxy). All 13 gates should read PASS, e.g.:
|-------|--------|:------:|-------|
| **Planets & orbits** | JPL SSD approximate elements (Standish) | on | 8 planets + Pluto, textured, MEGA-compressed orbit paths |
| **Body labels** | — | on | names; the focused body's children also get distance labels |
| **Moons** | JPL satellite data | on | 21 moons, per-parent local compression, retrograde Triton |
| **Moons** | NASA/USGS mosaics | on | 21 moons, per-parent compression, retrograde Triton; 8 with real surfaces, **tidally locked**; grayscale mosaics directorially tinted (Titan orange, Europa tan…) |
| **Rings** | true km, scaled to parent | on | Saturn (textured annulus) · Uranus (schematic) |
| **Spacecraft** | JPL **Horizons** (proxy) | on | Voyager 1/2, New Horizons, JWST, Parker, Juno, Lucy, Psyche — live distance + one-way light-time |
| **Main belt** | JPL **SBDB** (proxy) | off | ~1500 main-belt asteroids, shared Kepler core |
| **Comets** | JPL **SBDB** (proxy) | on | 1P/Halley, 2P/Encke, 67P, 96P — full orbits + anti-sunward 1/r² tail |
| **Close approaches** | JPL **CAD** (proxy) | off | ±30-day NEO radar around Earth, miss distance in lunar distances |
| **Close approaches** | JPL **CAD + SBDB** (proxy) | off | ±30-day NEOs at their **true propagated positions** with real orbits (per-object fail-soft to a schematic ring); miss distance in lunar distances |
| **Sky events** | computed (no network) | on | oppositions, conjunctions & greatest elongations as diamonds on the timeline's **event band**; click one to jump the clock |
## Controls
- **Focus** — click any body (or use the Focus menu) → the camera flies into orbit
around it; breadcrumb `SOL ▸ JUPITER ▸ EUROPA`; `Esc` steps out one level.
- **MEGA / TRUE** — toggle the scale mode; the transition animates over ~2.5 s.
- **Epoch**`18002050` / `3000 BC 3000 AD`: switch to the extended
Table 2a/2b range (reloads the session, carried in the hash as `&e=1`).
- **Body scale** — 1× / 100× / 1200× radius exaggeration.
- **Time bar** — NOW, play/pause, reverse, rate presets (`1× · 1 min/s … 1 yr/s`),
and a scrubbable 18002050 timeline. A **LIVE / SCRUBBED** chip mirrors GODSIGH.
- **Time bar** — NOW, play/pause, reverse, rate presets (`1× · 1 min/s … 1 yr/s`,
plus `1 decade/s · 1 century/s` for deep time), a scrubbable timeline, and an
**event band** below it mapping the computed ±2 yr window to full width (a bracket
on the main strip marks its extent). A **LIVE / SCRUBBED** chip mirrors GODSIGH.
- **Info panel** — appears on focus: a grimoire card with a physical fact sheet,
hand-written prose, a stylized portrait, and **live computed** facts (distance
from Sun & Earth, sunlight age, orbital speed, day & year length). Focusing Earth
reveals a link to the GODSIGH world view.
from Sun & Earth, sunlight age, orbital speed, day & year length, and the next
opposition/elongation). Focusing Earth reveals a link to the GODSIGH world view.
- **Shareable URLs** — the view serializes to the hash
(`#f=<body>&t=<time>&s=<mega|true>&L=<layers>&cam=…`); paste one to reproduce a view.
(`#f=<body>&t=<time>&s=<mega|true>&L=<layers>&cam=…&e=<0|1>`); paste one to reproduce a view.
- **`?debug=1`** — frame-rate / scale readout.
## Architecture
No build step, no framework, plain ES modules. One module owns the truth→view
transform (`scale.js`); every position is computed in real heliocentric J2000
ecliptic AU first (`ephem.js`) then compressed. A **floating origin** subtracts the
focused body's position in float64 before writing to the scene graph, so a focused
planet never jitters at close zoom.
No build step, no framework, plain ES modules; Three.js vendored offline. One
module owns the truth→view transform (`scale.js`); every position is computed in
real heliocentric J2000 ecliptic AU first (`ephem.js`) then compressed. A
**floating origin** subtracts the focused body's position in float64 before writing
to the scene graph, so a focused planet never jitters at close zoom.
```
index.html · serve.py · verify.html
css/style.css
css/style.css · vendor/three/ (vendored, MIT)
js/ config lib ephem bodies scale ui main
js/layers/ planets moons rings spacecraft asteroids comets neos almanac
assets/textures/ (CC BY) · assets/art/grimoire/ (generated)
js/layers/ planets moons rings spacecraft asteroids comets neos events almanac
assets/textures/ (CC BY + NASA/USGS public domain) · assets/art/grimoire/ (generated)
```
The full execution spec is [SOLARGOD_BRIEF.md](SOLARGOD_BRIEF.md).
The full execution spec is [SOLARGOD_BRIEF.md](SOLARGOD_BRIEF.md); wave-2 polish is
[PERIHELION_BRIEF.md](PERIHELION_BRIEF.md).
## Credits
- **Positions** — [JPL SSD](https://ssd.jpl.nasa.gov/planets/approx_pos.html)
approximate elements; live feeds via **JPL Horizons / SBDB / CAD**.
- **Textures** — [Solar System Scope](https://www.solarsystemscope.com/textures/),
CC BY 4.0 (see `assets/textures/CREDITS.md`).
- **Planet/Sun/ring/sky textures** — [Solar System Scope](https://www.solarsystemscope.com/textures/), CC BY 4.0.
- **Moon surfaces** — NASA/USGS Astrogeology mosaics (public domain); grayscale ones
directorially colour-tinted. See `assets/textures/CREDITS.md`.
- **Grimoire art** — generated locally with MODELBEAST / FLUX (see
`assets/art/PROMPTS.md`); the *aesthetic* layer only — real worlds get real data
textures.
- Built on [Three.js](https://threejs.org/).
`assets/art/PROMPTS.md`); the *aesthetic* layer only — real worlds get real data.
- Built on [Three.js](https://threejs.org/) (r170, vendored, MIT).