docs(sky): shorten the sky comments and README, fix three stale ones

The far-plane comment said z = w (the code puts z just under w), the Milky
Way constant is a brightness, not an opacity, and the CDS acknowledgement
lives in the Data attribution popover, not DATA_SOURCES.md.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
German KhokhlovandClaude Opus 5.5 committed 2026-10-20 13:56:44 +04:00
1 parent b00c7c12c8
commit 8c33c6f349
9 files changed
+54 -92

No files matched your search

+4 -4
View File
@@ -1,5 +1,5 @@
- Replace the blocky JPEG sky around the globe with the 9,096 stars of the
Yale Bright Star Catalogue, drawn as sharp points at their catalogue
positions for the scene clock, over a soft Milky Way built from ESO/S.
Brunier's panorama (CC BY 4.0). The Sun and Moon stay, the anime style fades
the Milky Way out, and the new assets weigh 296 kB (gekh, #1243).
Yale Bright Star Catalogue, drawn as sharp points where they are at the
scene time, over a soft Milky Way from ESO/S. Brunier (CC BY 4.0). The Sun
and Moon stay; the anime style hides the Milky Way. Assets: 296 kB (gekh,
#1243).
+1 -1
View File
@@ -8,7 +8,7 @@
* Format: fixed-width ASCII, 197 bytes per record, byte layout in
* https://cdsarc.cds.unistra.fr/ftp/V/50/ReadMe
* License: public domain (Yale University Observatory / NASA ADC); CDS asks
* for an acknowledgement, which DATA_SOURCES.md carries.
* for an acknowledgement, which the Data attribution popover carries.
*
* Transform (deterministic):
* 1. J2000 RA/Dec (bytes 76-90), V magnitude (103-107) and B−V (110-114).
+15 -29
View File
@@ -14,27 +14,16 @@
* Centre, galactic longitude increasing to the left.
*
* Transform (deterministic):
* 1. Resample to WORK_WIDTH×WORK_WIDTH/2 and convert sRGB to linear light.
* 2. Remove stars with a morphological opening (minimum, then maximum, over
* a (2·OPEN_RADIUS+1)² window): anything smaller than the window — every
* star — drops to the surrounding sky; the renderer draws catalogue stars
* itself, sharp and in the right place.
* 3. Paint out the planets the 2008–2010 exposures caught (PLANETS): they
* sit where today's sky has nothing and are far brighter than any star.
* 4. Blur with a three-pass box approximation of a Gaussian, σ = BLUR_DEG on
* the sky: rows wrap in longitude and widen by 1/cos(latitude) so the
* blur stays round towards the poles. Faint glow blends to a second,
* FAINT_BLUR_DEG blur, so it carries no clumps of unresolved stars.
* 5. Resample into six FACE_SIZE² cube faces in the standard WebGL face
* orientation (the renderer uploads them without flipY), with the ICRF
* axes as the cube axes — +X to the March equinox, +Z to the north
* celestial pole — rotating each direction into galactic coordinates
* with the IAU J2000 matrix.
* 6. Map the median sky to black, easing in with a soft knee, and the
* brightest 0.01 % to about 97 % white, the knee's offset there (both
* levels taken before the faint-glow blend; on luminance, keeping each
* pixel's hue),
* encode with gamma 1/2.2 and ±0.5 LSB dither against banding; WebP.
* 1. Resample to WORK_WIDTH×WORK_WIDTH/2, sRGB to linear light.
* 2. Remove stars with a morphological opening: the renderer draws
* catalogue stars itself, sharp and in the right place.
* 3. Paint out the planets the 2008–2010 exposures caught (PLANETS).
* 4. Blur, round on the sphere: σ = BLUR_DEG, widening to FAINT_BLUR_DEG
* in the faint glow so unresolved stars leave no clumps.
* 5. Resample into six WebGL cube faces (uploaded without flipY) with the
* ICRF axes: +X to the March equinox, +Z to the north celestial pole.
* 6. Median sky to black with a soft knee, brightest 0.01 % to ~97 %
* white, on luminance to keep the hue; gamma 1/2.2, dither, WebP.
*
* Usage:
* node scripts/build-milky-way.mjs <eso0932a.tif>
@@ -46,19 +35,16 @@ import { fileURLToPath } from 'node:url';
export const FACE_SIZE = 1024;
export const BLUR_DEG = 0.4;
// Faint glow takes a much wider blur: there the panorama is grain of
// unresolved stars, which a 0.4° blur leaves as clumps. Bright parts keep the
// fine blur and their dust lanes; FAINT_RANGE (fraction of black-to-white)
// is where the two blend.
// Faint glow is grain of unresolved stars and needs the wide blur; bright
// parts keep the fine one and their dust lanes. FAINT_RANGE (fraction of
// black-to-white) is where the two blend.
export const FAINT_BLUR_DEG = 2;
const FAINT_RANGE = [0.005, 0.08];
const WORK_WIDTH = 4096;
const OPEN_RADIUS = 3;
const WEBP_QUALITY = 96;
// The median sky is the black level: away from the galactic plane the
// panorama carries a mottled glow of unresolved stars and dust that reads as
// grey blotches around the globe. A hard cut there draws edges of its own, so
// the level eases in over SOFT_KNEE (a fraction of the black-to-white range).
// The median sky is black: above it the glow away from the plane reads as
// grey blotches. SOFT_KNEE eases the cut in so it draws no edges.
const BLACK_PERCENTILE = 0.5;
const SOFT_KNEE = 0.03;
const WHITE_PERCENTILE = 0.9999;
+2 -3
View File
@@ -118,9 +118,8 @@ export function applicationViewerOptions(creditContainer) {
selectionIndicator: false,
infoBox: false,
baseLayer: false,
// Instead of the default Tycho-2 cube map, whose JPEG blocks show around
// the whole globe. Passed here, not assigned later: `skyBox: false` would
// also stop CesiumWidget from creating the Sun and the Moon.
// Replaces the blocky Tycho-2 default. An option, not `skyBox: false`,
// which would also stop CesiumWidget from creating the Sun and Moon.
skyBox: new StarrySky(),
creditContainer,
msaaSamples: 4,
+23 -40
View File
@@ -1,9 +1,7 @@
# Sky background
The space behind the globe (`src/sky/starrySky.js`): catalogue stars drawn as
sharp point sprites over a soft Milky Way cube map. It replaces Cesium's
default Tycho-2 sky box, whose six 1024² JPEGs stretch 3–6× around the
whole-globe view and show compression blocks.
Catalogue stars over a soft Milky Way, drawn by `src/sky/starrySky.js` in
place of Cesium's blocky Tycho-2 sky box.
| File | Content | Size |
| ---- | ------- | ---- |
@@ -12,57 +10,42 @@ whole-globe view and show compression blocks.
## Stars — Yale Bright Star Catalogue
**Source:** Yale Bright Star Catalogue, 5th Revised Edition (Hoffleit &
Warren 1991), CDS VizieR catalogue
**Source:** 5th Revised Edition (Hoffleit & Warren 1991), CDS catalogue
[V/50](https://cdsarc.cds.unistra.fr/viz-bin/cat/V/50), file
`https://cdsarc.cds.unistra.fr/ftp/V/50/catalog.gz` (sha256
`3dc44b1e90be8fbe5bcc7656032560f51275f985c7e3f783c9028e1838ec7bed`, fetched
2026-10-19).
**License:** public domain (Yale University Observatory / NASA Astronomical
Data Center). CDS asks for an acknowledgement; the in-app "Data attribution"
popover carries it.
**License:** public domain. CDS asks for an acknowledgement; the "Data
attribution" popover carries it.
**Build:** `node scripts/build-bright-stars.mjs [catalog.gz]` — every record
with a J2000 position (14 novae and non-stellar entries dropped), RA/Dec
rounded to 0.001°, magnitudes to 0.01. The renderer maps magnitude to sprite
width and opacity and B−V to a desaturated black-body colour
(`src/sky/stars.js`).
**Build:** `node scripts/build-bright-stars.mjs [catalog.gz]`. Drops the 14
records without a J2000 position; rounds RA/Dec to 0.001° and magnitudes to
0.01.
## Milky Way — ESO/S. Brunier
**Source:** "The Milky Way panorama", ESO image
[eso0932a](https://www.eso.org/public/images/eso0932a/), full-size original
**Source:** ESO image [eso0932a](https://www.eso.org/public/images/eso0932a/),
`https://cdn.eso.org/images/original/eso0932a.tif` (6000×3000 sRGB TIFF, sha256
`10f209ab83e1fd89e7fa1ed70277ffc6ed19c43549f04ec637c6806d98aff035`, fetched
2026-10-19). Plate carrée in galactic coordinates, centred on the Galactic
Centre.
2026-10-19).
**License:** [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/)
(<https://www.eso.org/public/outreach/copyright/>). **Credit: ESO/S. Brunier.**
**License:** [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/).
**Credit: ESO/S. Brunier.**
**Changes made** (CC BY 4.0 asks for them to be stated): resampled to
4096×2048, stars removed with a 7×7 morphological opening, two planets
(Jupiter, by position) painted over with the median of the surrounding sky,
blurred (σ = 0.4°, blending to σ = 2° in the faint glow so unresolved
stars leave no clumps), reprojected from galactic coordinates to ICRF cube faces,
black level set at the median sky with a soft knee (the faint glow away
from the galactic plane fades to black), gamma-encoded and saved as
WebP. Build:
`node scripts/build-milky-way.mjs <eso0932a.tif>`.
**Changes made** (CC BY 4.0 asks for them): resampled to 4096×2048; stars
removed; two images of Jupiter painted over; blurred (0.4°, 2° in the faint
glow); reprojected to ICRF cube faces; black level at the median sky; saved as
WebP. Build: `node scripts/build-milky-way.mjs <eso0932a.tif>`.
The panorama is a photographic mosaic, not an astrometric map: bright stars
sit up to ~2° from their catalogue positions. That is invisible in a glow
blurred this much, and every sharp star on screen comes from the catalogue.
The panorama's stars sit up to ~2° off; that is invisible in the blurred glow,
and every sharp star comes from the catalogue.
The NASA SVS "Deep Star Maps 2020" Milky Way layer was considered and not
used: it is derived from Gaia DR2, which ESA distributes under CC BY-NC 3.0
IGO with prior authorization required for commercial use.
NASA SVS "Deep Star Maps 2020" was not used: it derives from Gaia DR2, which
ESA licenses CC BY-NC 3.0 IGO.
## Frame
Both layers are in ICRF/J2000. The cube faces use the standard WebGL face
layout with +X towards the March equinox and +Z towards the north celestial
pole, uploaded without `flipY`. At runtime one rotation —
`Transforms.computeIcrfToFixedMatrix` at the scene clock — turns both into
Earth-fixed coordinates.
Both layers are in ICRF/J2000. The cube faces use the WebGL face layout, +X
to the March equinox and +Z to the north celestial pole, uploaded without
`flipY`.
+3 -3
View File
@@ -12,7 +12,7 @@ import { buildStarVertices, STAR_VERTEX_FLOATS } from './stars.js';
*/
export const STARRY_SKY_CESIUM_VERSION = '1.138.0';
/** Opacity of the Milky Way glow over black; the stars carry the sky. */
/** Brightness of the Milky Way glow; the stars carry the sky. */
export const MILKY_WAY_INTENSITY = 0.4;
/** Clock change, in seconds, below which the sky rotation is reused. */
export const SKY_ROTATION_EPSILON_SECONDS = 1;
@@ -48,8 +48,8 @@ const MILKY_WAY_FACE_URLS = Object.freeze({
),
});
// Directions, not points: w = 0 drops the camera translation, and z = w puts
// every fragment on the far plane, inside the clip volume at any frustum.
// Directions, not points: w = 0 drops the camera translation, and z just
// under w keeps every fragment at the far plane, inside any frustum.
const SKY_DIRECTION_GLSL = `
uniform mat3 u_icrfToFixed;
vec4 skyClipPosition(vec3 icrfDirection)
+3 -7
View File
@@ -3,17 +3,13 @@
*
* Pure functions, no Cesium. The pack is `local_data/sky/bright_stars.json`
* (Yale Bright Star Catalogue, built by scripts/build-bright-stars.mjs): a
* flat `[raDeg, decDeg, vmag, bv, …]` array in ICRF/J2000.
*
* Every star is drawn as a point sprite holding a small Gaussian. Its width
* is set in CSS pixels and scaled by the device pixel ratio in the shader, so
* a star covers the same screen area at any DPR and stays a crisp dot rather
* than a texel stretched across several pixels.
* flat `[raDeg, decDeg, vmag, bv, …]` array in ICRF/J2000. Each star is a
* small Gaussian sprite, sized in CSS pixels so it stays a crisp dot at any DPR.
*
* @module sky/stars
*/
/** Faintest magnitude drawn distinctly (fainter catalogue stars look like it); the brightness reference. */
/** Brightness reference; fainter catalogue stars are drawn like it. */
export const STAR_LIMIT_MAGNITUDE = 6.5;
/** Gaussian σ of the faintest star, CSS pixels. */
export const STAR_MIN_SIGMA_PX = 0.55;
+1 -1
View File
@@ -93,7 +93,7 @@ test('plate carrée is centred on longitude 0, growing to the left, north up', (
});
test('the galactic rotation puts the Galactic Centre and pole where the IAU does', () => {
// Sgr A*-adjacent origin l = b = 0 at RA 266.405°, Dec −28.936° (J2000).
// Galactic origin l = b = 0 at RA 266.405°, Dec −28.936° (J2000).
const centre = icrfToGalactic(raDecToUnitVector(266.40499, -28.93617));
close(centre[0], 1, 1e-6);
// North galactic pole at RA 192.85948°, Dec +27.12825°.
+2 -4
View File
@@ -112,10 +112,8 @@ export class VisualEffects {
if (this.stopped || !stage) return;
stage.uniforms.intensity = value;
stage.enabled = value > 0.001;
// Anime's four luminance bands turn the faint Milky Way into blotches, and
// a post-process cannot tell the sky from far geometry reliably (near
// plane clamps, keyless terrain above the ellipsoid horizon): fade the
// glow out with the style instead. Bright stars survive as banded points.
// Anime's bands turn the faint Milky Way into blotches, and depth cannot
// tell the sky from far geometry, so the glow fades with the style.
if (stage === this.stages.anime)
this.viewer.scene.skyBox.milkyWayVisibility = 1 - value;
if (stage.enabled && stage.uniforms.time !== undefined)