Console rendering
This page explains how the console renders a fleet, for engineers who want to reason about its performance and accuracy characteristics. The operator-facing view of the same machinery is Globe and rendering.
The core problem
A satellite scene has two clocks that disagree. Orbital state comes from SGP4 propagation, which is too expensive to run for thousands of objects at display refresh rate; the display runs at 60 or 120 frames per second and cannot wait for it. Naive designs either propagate per frame (and drop frames as object count grows) or move satellites only on data ticks (and stutter, worse at high playback speed).
Worker-sampled position windows
The console splits the work. A Web Worker owns propagation: it runs SGP4 over every TLE-bearing asset in the registry (operator fleet, catalog constellations, uploads, synthetic assets, all through the same path) and emits sampled ECEF position windows, 30-second steps precomputed in chunks over a sliding window around the playhead. The main thread never propagates during steady-state playback; it consumes windows.
Per frame, the renderer evaluates each satellite's position by cubic Hermite interpolation between the bracketing samples, using the sampled velocities for the tangents. For LEO orbits this stays within roughly 2 km of direct SGP4 evaluation, well under a pixel at operational zoom, while costing a handful of arithmetic operations per satellite per frame.
Consequences worth knowing:
- Playback speed does not change smoothness. Speed changes how fast the clock advances through the window; per-frame interpolation is identical at 1x and 64x. At very high rates the UI work quantum scales with speed so the render loop is never starved.
- Seeks degrade gracefully. A seek outside the precomputed window holds satellites at coarse tick positions (correct, just tick-rate motion) until the worker delivers the new chunk, then full smoothness resumes.
- Epoch handling is sticky. Each TLE propagates relative to its own epoch with a per-record bias anchored consistently into the simulation window, gated to a 14-day validity window; catalog entries more than 90 days behind the newest epoch are dropped as decayed rather than drawn in fictional positions.
- Analytics agree with the picture. Coarse-tick positions used by engines come from the same registry and element sets, so a coverage number never disagrees with what the globe shows.
Layers
Rendering is layered by data character, not by asset origin:
| Layer | Contents | Update cadence |
|---|---|---|
| Fleet layer | Every TLE-propagated satellite, interpolated per frame | Per frame |
| Link layer | Feeder and inter-satellite links, synthesized from geometric feasibility (elevation mask, slant-range caps, angular prefilter) | Per data tick, with per-frame fade envelopes |
| Constellation overlay | High-object-count catalog groups, batched for draw efficiency | Per frame, same interpolation |
| Ground layer | Gateways, ground stations, data centers | Static positions, per-tick state |
| Analysis overlays | Coverage results, elevation masks, optimizer playback, emphasis pulses | On demand, animated |
Catalog batching is a rendering optimization only: selection, search, and detail resolve overlay objects through the same registry as everything else.
Living-scene principles
The rendering contract is that an operator never has to mentally reconstruct what changed:
- Nothing pops. New assets fade in, removed assets fade out, and an asset that returns mid-fade revives smoothly.
- Links do not flicker. Link transitions run on a shared wall-clock fade envelope with horizon hysteresis, and link carriers are retained across data ticks, so a link oscillating at the edge of the elevation mask does not strobe.
- The camera flies, never teleports, and stays still when a selection does not require movement.
- Results animate into the scene. Optimizer runs stage their candidates, dim rejects, and pulse the winner; assistant explanations pulse the assets they name.
- Motion respects the viewer: reduced-motion preferences are honored, and quality tiers (cinematic, balanced, performance) trade imagery and clouds against GPU load, with performance the default on touch devices.
Failure modes to expect
- A blank globe with a healthy scene almost always means the base state is empty (no dataset activated) or every group is toggled off, not a rendering fault.
- Terrain-dependent features (horizon sweeps, elevation masks) fall back to synthetic profiles when no terrain token is configured, and say so.
- If interpolated motion visibly disagrees with expectations, check the TLE epoch age first; stale elements are an ephemeris problem, not a renderer problem.
Related
- Globe and rendering (operator view)
- Uploads and TLE ingestion
- Determinism