Earth from a Space Station
See Earth as astronauts do — a WebXR experience from the International Space Station (ISS) or the Chinese Space Station (CSS/Tiangong), orbiting in real time.
Available as an app on the Meta Horizon Store for Meta Quest 3, or directly through Meta Quest Browser.
Description
Look down at Earth from the International Space Station or the Chinese Space Station as they orbit in real time. High-resolution NASA imagery shows daylit terrain and city lights on the night side, with a realistic atmosphere visible at the horizon. The Moon, five naked-eye planets, and thousands of stars are in their correct positions. You can also observe a close flyby of the other station, visible as a bright point of light — just as it would appear to the naked eye at orbital distances.
Two camera views are available: forward and straight down. Points of interest — cities, mountains, lakes, rivers, deserts, islands and more — are labeled on the surface ahead of the station. Country borders, names, and flags are shown for all 195 countries (193 UN member states and 2 observer states). A time offset lets you rewind the simulation to see where the station was in the recent past. A heads-up display shows latitude, longitude, altitude, speed, and the country or sea below.
Controls
All controls use the right Quest 3 controller.
| Action | Quest Controller |
|---|---|
| Help | B button |
| Switch station | A button |
| Cycle camera view | Right stick up |
| Toggle night | Right stick down |
| Toggle POI labels | Right stick left |
| Toggle countries | Right stick right |
| Toggle debug panel | Grip + B button |
| Time offset* +1 min | Grip + Right stick up |
| Time offset* −1 min | Grip + Right stick down |
* Time offset can only be negative, up to −5h59m.
Heads-Up Display
The HUD panel (right side in VR) shows the following information, updated in real time. The text color is white for the ISS and red for the CSS.
| Line | Description |
|---|---|
| ISS / CSS | Active station name and NORAD catalog number. |
| UTC | Current time in UTC. |
| LAT | Sub-satellite latitude (degrees N/S). |
| LON | Sub-satellite longitude (degrees E/W). |
| ALT | Altitude above the WGS-84 ellipsoid in km. |
| SPD | Orbital speed in km/h. |
| LOC | Country or sea name below the station, with local time if over land. |
| CSS / ISS | Distance to the other station along the orbital arc in km. |
Points of Interest
POI labels appear on the surface ahead of the station, showing capital cities and geographic features within range.
| Type | Color | Count |
|---|---|---|
| Capital cities | █ Orange | 214 (193 + 2 observers + 2 non-members + 17 NSGT) |
| Mountains | █ Red-orange | 47 |
| Lakes | █ Blue | 83 |
| Seas & gulfs | █ Blue | 35 |
| Straits | █ Blue | 13 |
| Rivers | █ Medium blue | 34 |
| Deserts | █ Yellow | 20 |
| Islands | █ Green | 64 |
| Reefs | █ Teal | 5 |
Technical Information
Station orbital positions are computed using the SGP4 algorithm from OMM (Orbit Mean-Elements Message) data sourced from Space-Track.org. A Cloudflare Worker fetches the OMM data every 2 hours and caches it in an R2 bucket; the application loads the cached OMM on page load and refreshes it when the page becomes visible again (e.g. when removing and re-wearing the VR headset). SGP4 propagation runs every frame, producing smooth orbital movement without polling any position API.
NASA provides 8 source GeoTIFF tiles (4 columns x 2 rows, each 21600x21600 pixels) that together form the full 86400x43200 Earth image at 500m/pixel resolution. Each source tile is split into 8 smaller tiles (2 columns x 4 rows) of 10800x5400, then downsampled to 5400x2700 (1000m/pixel), producing a final 8x8 grid of 64 tiles. There are 12 monthly day tile sets (Blue Marble Topography and Bathymetry) plus 1 night tile set (Black Marble city lights), for a total of 832 tiles (13 x 64). All tiles are stored as GPU-compressed KTX2 textures (UASTC format, transcoded to ASTC 4x4 on device). Each tile covers 45° longitude x 22.5° latitude, so a few tiles cover the entire visible hemisphere from orbital altitude. Low-resolution (2048x1024) equirectangular day and night KTX2 textures provide an instant recognizable Earth while high-resolution tiles load on demand. Tiles are loaded based on the station position with omnidirectional sampling, with an LRU cache and boundary preloading for seamless transitions. Custom GLSL shaders handle day/night blending at the terminator and additive city light rendering on the dark side.
The atmosphere uses a ray-sphere intersection test to distinguish the limb band (over space) from the overlay (over Earth surface). An exponential density falloff provides realistic thinning with altitude, and a Gaussian terminator function adds warm orange coloring at sunrise/sunset.
The coordinate system uses ECI (Earth-Centered Inertial) for station positioning. Earth textures are rotated by GMST (Greenwich Mean Sidereal Time) each frame to correctly align surface features. The sun direction is computed from the current date using astronomical formulas for solar declination and hour angle. The Moon position is computed using simplified Meeus lunar theory, and five naked-eye planets (Mercury, Venus, Mars, Jupiter, Saturn) use Keplerian orbital elements with secular perturbation rates — all from pure analytical formulas with the date as the only input. The starfield contains 5,070 stars from the HYG catalog with accurate positions and magnitude-based brightness.
Scale: 1 Three.js unit = 1 km. Earth radius = 6,371 units. ISS orbital altitude ~408 km, CSS orbital altitude ~390 km.
Contact
Please send an email to: info at metebalci dot com
License
© 2026 Mete Balci. All rights reserved.