Stage 6. almanac.js: on-focus grimoire card — physical fact sheet, hand-written prose (grimoire voice), MODELBEAST portrait, and LIVE computed facts free from the ephemeris: distance from Sun & Earth, sunlight age, vis-viva orbital speed, day & year length. Earth easter egg → GODSIGH world view (:8137). Real Solar System Scope 2k textures (CC BY, 6.1 MB) now paint every world + the Milky Way skybox; ephem gains semiMajor() for vis-viva. Generated grimoire portraits (FLUX via MODELBEAST, 10 bodies, seed logged in art/PROMPTS.md) are the AESTHETIC layer only — real worlds get real maps (truth boundary). README with layer table + quickstart + verify; docs/hero.jpg. Also lands the Stage-3 planets label fix (obj.visible). Gate: every clickable body has a card; quickstart works from a fresh clone. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
99 lines
5.1 KiB
Markdown
99 lines
5.1 KiB
Markdown
# SOLARGOD ▸ Orrery
|
||
|
||
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.
|
||
|
||

|
||
|
||
## Quickstart
|
||
|
||
```sh
|
||
python3 serve.py # stdlib only — no npm, no build step
|
||
# open http://127.0.0.1:8147
|
||
```
|
||
|
||
`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.
|
||
|
||
## 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.:
|
||
|
||
| 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 |
|
||
| 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 |
|
||
|
||
## Layers
|
||
|
||
| Layer | Source | Default | Notes |
|
||
|-------|--------|:------:|-------|
|
||
| **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 |
|
||
| **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 |
|
||
|
||
## 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.
|
||
- **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 1800–2050 timeline. 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.
|
||
- **Shareable URLs** — the view serializes to the hash
|
||
(`#f=<body>&t=<time>&s=<mega|true>&L=<layers>&cam=…`); 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.
|
||
|
||
```
|
||
index.html · serve.py · verify.html
|
||
css/style.css
|
||
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)
|
||
```
|
||
|
||
The full execution spec is [SOLARGOD_BRIEF.md](SOLARGOD_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`).
|
||
- **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/).
|