# 真实比例地球 / True-scale Earth

Made with Blender 4.3.2, exported as GLB, viewed with Three.js 0.180.0.

## Geometry and units
WGS84 ellipsoid: a=6378137 m, 1/f=298.257223563. Geodetic latitude and longitude are mapped to ECEF using ellipsoidal height h = H + N. H is NOAA ETOPO 2022 height relative to EGM2008; N is NOAA ETOPO 2022 EGM2008 geoid undulation. All Cartesian coordinates are divided uniformly by 1000 for Blender: one Blender coordinate unit represents 1 km, with scene scale_length=1000 m. The GLB exporter multiplies all vertex coordinates uniformly by 1000, so each GLB unit correctly represents 1 metre. Three.js then applies uniform scale (0.001, 0.001, 0.001), returning to a kilometre-based world. No per-axis scaling or elevation exaggeration is applied. Export rotation: Blender ECEF(X,Y,Z) becomes GLB(X,Z,-Y). Three.js imports with scale (0.001, 0.001, 0.001).

## Resolution and limitations
Source is60arcsecond ETOPO 2022 ice-surface global DEM. Global geometry sampled every 30 cells = 0.5 degree (about 55.6 km N–S). Regional geometry sampled every source cell = 1 arcminute (about 1.85 km N–S), latitude 27.5083..36.0083 N, longitude 31.0083..39.0083 E. The global source snapshot is stride 15 and then sampled every 2nd point, without artificial height exaggeration. This is a visualization, not a survey-grade or navigation product. The high-density Levant patch supports viewing Israel-sized areas, not streets/buildings.

Coarse global triangle interiors approximate the curved ellipsoid by chords (maximum curvature-only sag about 121 m per 0.5 degree cell near equator); regional 1 arcminute cell sag about 0.14 m. Fine patch border vertices match coarse straight edges to avoid cracks; only the outer border is geometrically interpolated. DEM sampling omits sub-grid peaks/valleys. Vertex positions are float32, yielding roughly sub-metre numerical precision at global coordinates. Geoid global 0.5 degree bilinear resampling adds approximation, especially polar extrapolation. The regional patch uses matching native 1 arcminute geoid samples (no coarse regional geoid approximation). See model_metadata.json for actual tests. Accurate scale does not mean exact terrestrial surface.

## Water and color
Ocean connected-negative components use H=0 plus local geoidN as a visual mean-sea surface. There is NO whole-world sphere that floods all negative land. Regional sea components touching the patch boundary identify Mediterranean and Red Sea; inland depressions remain their source DEM elevation. This connectivity-derived mask is an approximation at the mesh resolution, not a detailed authoritative coastline. Inland lakes (including the Dead Sea basin) retain the sampled ETOPO surface values; their modern water surface is not reconstructed. Thus this is a terrain/sea-cover model, not a hydrological water-level simulation. Ocean floor is not displayed beneath the cover. Texture colors are elevation classification, not satellite imagery, vegetation, or political boundaries. Markers are visual annotations, not geometry.

## Data and attribution
- NOAA ETOPO 2022 ice-surface 60s, EGM2008 vertical reference: https://oceanwatch.pifsc.noaa.gov/erddap/griddap/ETOPO_2022_v1_60s.html
- NOAA ETOPO 2022 matching geoid: https://www.ngdc.noaa.gov/thredds/catalog/global/ETOPO2022/60s/60s_geoid_netcdf/catalog.html
- WGS84 reference: https://earth-info.nga.mil/index.php?dir=wgs84&action=wgs84
- Three.js: https://threejs.org/ (MIT; local licence included)
NOAA data may be freely used and redistributed, with its no-warranty disclaimer. Source query URLs and sample grids are included for reproducibility. See data/geoid-metadata.json.

## Reproduce
Install Python numpy/scipy, and Blender 4.3.2. Run python prepare_geometry.py, then blender --background --python build_blender.py. Serve dist with any static HTTP server (e.g. python -m http.server 8000 --directory dist); opening file:// will not allow GLB/module loading. No API keys or remote runtime data needed. The generator creates a combined .blend; downloadable Blender packages are split into global and regional components to respect individual file limits. GLBs are split for browser-friendly loading. Import BOTH global.glb and levant.glb together to fill the regional opening.

## Atlas-style relief update
The land palette now follows physical-atlas hypsometry: green lowlands, yellow/tan middle elevations, rose/brown ranges and pale high plateaux. Pale colors encode elevation, NOT snow or ice cover. Land stops (metres): −500, 0, 100, 200, 500, 1000, 1500, 2000, 3000, 4000, 5000, 6500, 8500. Ocean colors encode source bathymetry at −11000, −6000, −4000, −2000, −1000, −200, −1 and 0 metres. Ocean geometry remains the mean-sea cover H=0 + geoid N. Thus seafloor colors/shading are a cartographic visualization on the sea cover, not extruded seafloor geometry.

Global texture: 7200×3600, NOAA 60-second source sampled every 3 cells (3 arcminutes, about 5.56 km north–south). Regional texture: 481×511 native 1 arcminute samples (about 1.85 km north–south). Do not confuse texture detail with the unchanged global 0.5-degree geometry. The regional display can be enlarged, but this does not add source detail.

Hillshade is derived from real DEM gradients divided by WGS84 meridional and prime-vertical ground spacing, including cos(latitude). Light is NW azimuth 315°, altitude 35°. Fine hillshade contrast is 3.8; a 2-pixel Gaussian coarse component has contrast 2.0. The color multiplier is clamped to 0.30–1.50; marine contrast is multiplied by 0.6. These are DISPLAY contrast settings only, not vertical exaggeration: no bump map, altered normal map or displacement map is used. Model material is unlit/emissive so the baked cartographic shading remains consistent. Regional/global shade transitions can be visible because sample spacing differs.

The flat-map mode uses an equirectangular projection. It is a map presentation, not an equal-distance measuring surface; physical 1× claims apply to the globe geometry. Geographic labels are selected descriptive landform/sea names, not political borders. No pixels from the user's reference photos were copied into the deliverable.

## Download packages
All four packages should be extracted into the SAME folder (allow matching folders to merge):
1. earth_blender_global.zip: earth_global.blend, packed texture, globe preview
2. earth_blender_levant.zip: earth_levant.blend, packed texture, region preview, assemble_earth.py
3. earth_threejs_viewer.zip: dist web app and map textures, generation scripts, existing compact data inputs and this README
4. earth_model_assets.zip: dist/global.glb and dist/levant.glb, required by the viewer

Each Blender component is independently viewable. To assemble the full globe, run `blender --background --python assemble_earth.py` after extracting both Blender packages. This creates earth_true_scale.blend with both meshes; their coordinates are already aligned. The global mesh intentionally leaves the regional opening for the high-resolution component.

To view locally, extract the viewer and model-assets packages together, then run `python -m http.server 8000 --directory dist` and open http://localhost:8000. The viewer has no network-data dependency once the packages are extracted.

To regenerate high-resolution cartographic textures, first run `python fetch_relief_data.py`. It downloads the exact NOAA 3-minute subset (about 104 MB); that large raw raster is not duplicated in the download packages. Then run `python generate_relief.py`. Prebuilt textures are included, so this download is not needed to use the viewer or rebuild geometry from the compact input grids. Python requires numpy, scipy and Pillow. The global source subset is cell-center aligned and bilinearly shifted by 1/3 pixel to a standard equirectangular texture grid; this interpolation does not increase source resolution.
