solargod/README.md
monsterrobotparty 1f9664a6f9 📖 almanac: knowing — info panel, live facts, grimoire art, real textures, README (opus)
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>
2026-07-16 00:56:41 +10:00

99 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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.
![SOLARGOD](docs/hero.jpg)
## 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 18002050 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/).