diff --git a/src/app/features/galaxy-system/system-orbits-renderer.ts b/src/app/features/galaxy-system/system-orbits-renderer.ts index aafff2f..4b33abe 100644 --- a/src/app/features/galaxy-system/system-orbits-renderer.ts +++ b/src/app/features/galaxy-system/system-orbits-renderer.ts @@ -204,7 +204,8 @@ function reshapeOrbitLine(line: THREE.Line, elements: OrbitalElements): void { * A photograph is handed to `deferPhotograph`, which puts it on the body once it has loaded, one a * frame: a texture is copied to the GPU in the first frame that draws it, and the 28 maps, which * arrive within 40 ms of each other, made that one frame a 160-210 ms task on entering the Sun's - * system (copyExternalImageToTexture, about 20 megapixels of JPEG). + * system (copyExternalImageToTexture, about 38 megapixels of JPEG: nine maps at 2048 by 1024, the + * Sun's among them, Jupiter's at 3840 by 1920, and eighteen smaller). * * Every marker is the one unit sphere, {@link MARKER_SPHERE}, scaled to the body's radius, which * it also keeps as `userData.radiusAu`: built one a body, the 38 spheres of the Sun's system took diff --git a/src/app/shared/models/body.model.ts b/src/app/shared/models/body.model.ts index b25c3bb..aa717c2 100644 --- a/src/app/shared/models/body.model.ts +++ b/src/app/shared/models/body.model.ts @@ -95,10 +95,10 @@ export interface BodyRecord { * Horizons gives a negative rate (Venus, Uranus), and the tilt of that axis from its orbital * plane — which past 90 degrees already says the turn is retrograde. * - * For a locked moon the period is its orbit's, from the mean motion that carries it round; for - * a body whose source states none, the measured one its ETL spec carries (Eris, Nereid). Absent - * only for Hyperion, which tumbles — the view leaves it still rather than spinning it at an - * invented rate. + * For a locked moon the period is its orbit's, from the mean motion that carries it round. Where + * the source states none, or one a later measurement overturns, it is the one the body's ETL spec + * carries: Nereid's K2 light curve, Eris's lock to Dysnomia. Absent only for Hyperion, which + * tumbles — the view leaves it still rather than spinning it at an invented rate. */ rotationPeriodHours?: number; obliquityDeg?: number; diff --git a/src/app/shared/rendering/body-orientation.spec.ts b/src/app/shared/rendering/body-orientation.spec.ts index c978d81..35732b2 100644 --- a/src/app/shared/rendering/body-orientation.spec.ts +++ b/src/app/shared/rendering/body-orientation.spec.ts @@ -50,7 +50,7 @@ describe('bodyPageView', () => { it('lights Earth’s face where Horizons does at the far end of the clock too: AD 1000 and AD 1', () => { // Horizons' sub-solar longitude from the Sun (observer quantity 14, TIME_TYPE=UT), Earth taken // one light-time back: 1.0510 E on JD 2086455 and 1.5606 E on JD 1721600. The IAU's W, taken at - // UT, drew them 2.3 and 4.5 degrees west of that. + // UT + 69.184 s as it was, drew them 2.3 and 4.5 degrees west of that (2.0 and 4.2 at UT itself). for (const [jdUt, lightMinutes, eastDeg] of [[2086455, 8.45437443, 1.05101], [1721600, 8.45020842, 1.560644]]) { expect(Math.abs(subSolarPoint(EARTH, jdUt - lightMinutes / 1440).eastDeg - eastDeg)).toBeLessThan(0.15); } diff --git a/src/app/shared/rendering/body-orientation.ts b/src/app/shared/rendering/body-orientation.ts index 9c03139..0bed9d9 100644 --- a/src/app/shared/rendering/body-orientation.ts +++ b/src/app/shared/rendering/body-orientation.ts @@ -58,8 +58,9 @@ export function poleFrame(pole: { raDeg: number; decDeg: number }, target = new * it is turned by the IERS Earth Rotation Angle at the clock's date (IERS Conventions 2010, eq. * 5.15), counted from the node its W starts at, 90 degrees past its pole's right ascension. The * IAU's W for Earth, fitted to today, runs 6.3e-6 degrees a day slow of that once its pole's drift - * is counted: taken at UT, it left Earth's lit face 2.3 degrees off Horizons at AD 1000 and 4.5 at - * AD 1. Taken at TDB, it would have turned ΔT further, 44 degrees at AD 1. + * is counted: taken at UT + 69.184 s, as it was, it left Earth's lit face 2.3 degrees off Horizons at + * AD 1000 and 4.5 at AD 1 (2.0 and 4.2 at UT itself). Taken at TDB, it would have turned ΔT further, + * 44 degrees at AD 1. */ export function bodyOrientation(elements: RotationalElements, jdUtc: number, target = new THREE.Quaternion(), followsUt = false): THREE.Quaternion { const { poleRaDeg, poleDecDeg, primeMeridianDeg } = orientationAt(elements, tdbFromUtc(jdUtc)); diff --git a/src/assets/textures/README.md b/src/assets/textures/README.md index cf29447..cb14f22 100644 --- a/src/assets/textures/README.md +++ b/src/assets/textures/README.md @@ -32,7 +32,11 @@ Each was downloaded from the URL below and processed the same way (script: `build_maps.py`, kept with the measurements outside the repository): 1. Pixels the source leaves unmapped (value 0 in every band, its no-data value) are set to one - flat grey: the mean of the mapped surface. They are never filled with invented terrain. + flat grey: the mean of the mapped surface. They are never filled with invented terrain. Titan's + source marks its largest gap another way, with a flat grey of its own (147 and 148, its two + commonest values; "the uniform gray area in the northern hemisphere indicates a gap in the + imaging coverage", PIA19658), which the table counts as unmapped too: 1.09% of `titan.jpg`'s + pixels, 0.87% of the sphere, where its zeros alone were 0.02%. 2. Downsampled by area averaging (PIL `BOX`) to 2 048 by 1 024 for bodies over 1 000 km in radius and 1 024 by 512 for the rest. 3. Rolled half a turn where the source is centred on longitude 180, so longitude 0 is in the @@ -66,7 +70,7 @@ photometry. | `tethys.jpg` | [USGS](https://asc-pds-services.s3.us-west-2.amazonaws.com/mosaic/Tethys_Cassini_mosaic_global_293m.tif) Tethys Cassini Global Mosaic 293 m | Cassini ISS; NASA/JPL/Space Science Institute | Odysseus, Penelope | 0.04% | 0.009% | 1024x512, 182 KB | | `dione.jpg` | [USGS](https://asc-pds-services.s3.us-west-2.amazonaws.com/mosaic/Dione_Cassini_Voyager_mosaic_global_154m.tif) Dione Cassini-Voyager Global Mosaic 154 m | Cassini ISS and Voyager; NASA/JPL/Space Science Institute | Creusa, Evander | 0.18% | 0.011% | 1024x512, 195 KB | | `rhea.jpg` | [USGS](https://asc-pds-services.s3.us-west-2.amazonaws.com/mosaic/Rhea_Cassini_Voyager_mosaic_global_417m.tif) Rhea Cassini-Voyager Global Mosaic 417 m | Cassini ISS and Voyager; NASA/JPL/Space Science Institute | Inktomi, Tirawa | 0% | 0.003% | 1024x512, 128 KB | -| `titan.jpg` | [USGS](https://asc-pds-services.s3.us-west-2.amazonaws.com/mosaic/Titan_ISS_P19658_Mosaic_Global_4km.tif) Titan Cassini ISS Global Mosaic 4 km (938 nm, through the haze) | Cassini ISS; NASA/JPL-Caltech/SSI | Xanadu, Shangri-La, Belet | 0.02% | 0.078% | 2048x1024, 294 KB | +| `titan.jpg` | [USGS](https://asc-pds-services.s3.us-west-2.amazonaws.com/mosaic/Titan_ISS_P19658_Mosaic_Global_4km.tif) Titan Cassini ISS Global Mosaic 4 km (938 nm, through the haze) | Cassini ISS; NASA/JPL-Caltech/SSI | Xanadu, Shangri-La, Belet | 1.1% (48-68 N, 37 W to 25 E: the source's own flat grey, see step 1) | 0.078% | 2048x1024, 294 KB | | `iapetus.jpg` | [USGS](https://asc-pds-services.s3.us-west-2.amazonaws.com/mosaic/Iapetus_Cassini_Voyager_mosaic_global_783m.tif) Iapetus Cassini-Voyager Global Mosaic 783 m | Cassini ISS and Voyager; NASA/JPL/Space Science Institute | Cassini Regio (leading side, 90 W), Engelier | 0% | 0.019% | 1024x512, 159 KB | | `phoebe.jpg` | [PDS](https://planetarydata.jpl.nasa.gov/img/data/carto/coiss_3001/extras/full/images/SP_1M_0_0_SIMP.IMG.png) COISS_3001, Cassini ISS cartographic map of Phoebe | Cassini ISS; DLR and FU Berlin (Roatsch et al.), NASA PDS | Jason (16 N, 318 W) | 20.41% (the north) | 0.344% (shadows) | 1024x512, 78 KB | | `triton.jpg` | [USGS](https://asc-pds-services.s3.us-west-2.amazonaws.com/mosaic/Triton_Voyager2_ClrMosaic_GlobalFill_600m.tif) Triton Voyager 2 Global Colour Mosaic 600 m (PIA18668) | Voyager 2; P. Schenk, NASA/JPL/LPI | Leviathan Patera; southern cap | 38.59% (the north Voyager 2 never saw) | 0% | 2048x1024, 205 KB | diff --git a/tools/etl/build.ts b/tools/etl/build.ts index 2d7a260..5cf738c 100644 --- a/tools/etl/build.ts +++ b/tools/etl/build.ts @@ -212,12 +212,24 @@ const WITHOUT_ROTATIONAL_ELEMENTS = new Set(['hyperion', 'nereid', 'eris', 'haum const TUMBLING = new Set(['hyperion']); /** - * How far the IAU's day, 360 degrees over W's rate, may be from the one Horizons states, as a - * fraction of it. Measured on this catalogue: at most 1.8e-5 (Jupiter's System III, 9.92492 hours - * against 9.92510). Neptune is 0.89 per cent out, because the report takes 15.9663 hours from the - * cloud features Karkoschka (2011) tracked, where Horizons keeps Voyager's radio period, 16.11. What - * this catches is a rate read in the wrong unit or for the wrong body: Oberon's day for Titania's is - * 55 per cent out. + * How far the IAU's day, 360 degrees over W's rate, may be from the period the body's record + * carries, as a fraction of it. That period is not always a second source: + * + * - The eight planets and Phoebe: the one Horizons states. Measured on this catalogue: at most + * 1.8e-5 (Jupiter's System III, 9.92492 hours against 9.92510). Neptune is 0.89 per cent out, + * because the report takes 15.9663 hours from the cloud features Karkoschka (2011) tracked, where + * Horizons keeps Voyager's radio period, 16.11. + * - Pluto and Ceres: the IAU's own rate restated. Horizons' 153.29335198 hours for Pluto is 360 over + * its W (8.5e-12), and the SBDB's 9.074170 for Ceres, which Horizons prints too, is noted as + * derived from the report's 952.1532 degrees a day (3.3e-10). + * - The 22 locked moons: their orbit's period, from JPL's satellite table, not a figure from their + * Horizons pages ("Synchronous" on eighteen of them, nothing on Titan's or Proteus's). Their W is + * turned at that rate (see `lockedToOrbit`, which first holds the kernel's own rate to it within + * 1e-5), so here they are 0, but for the Moon and Phobos, whose W keeps its own rate and its + * quadratic (1.1e-8 and 3.1e-7). + * + * What this catches is a rate read in the wrong unit or for the wrong body: Oberon's day for + * Titania's is 55 per cent out. */ const MAX_DAY_OFFSET = 1e-4; const DAY_OFFSET_CEILINGS: Record = { neptune: 0.01 }; @@ -347,7 +359,7 @@ function validateBodies(bodies: BodyRecord[], horizonsOrbits: Map): void { diff --git a/tools/etl/fetchSolarSystem.ts b/tools/etl/fetchSolarSystem.ts index a0b2d5c..4176a43 100644 --- a/tools/etl/fetchSolarSystem.ts +++ b/tools/etl/fetchSolarSystem.ts @@ -137,11 +137,15 @@ const BODY_SPECS: BodySpec[] = [ // Hyperion's eccentricity is 0.105 in JPL's current table (ssd.jpl.nasa.gov/sats/elem, SAT441). { id: 'hyperion', name: 'Hyperion', kind: 'moon', horizonsCommand: '607', center: '500@699', parentBodyId: 'saturn', spinsFreely: true, measuredEccentricity: 0.105, trackStepDays: 1 }, { id: 'iapetus', name: 'Iapetus', kind: 'moon', horizonsCommand: '608', center: '500@699', parentBodyId: 'saturn', poleFollowsOrbit: true }, - // Phoebe's row gives a mean motion of 0.6569114 degrees a day, a 548.02-day year, where its - // Horizons page and JPL's current table (SAT441) give 550.30: the table's own note warns that - // its source misstated the mean motions of retrograde moons. On the row's figure Phoebe was - // 25 degrees from Horizons by 2025 and 100 by 2075; on the current period, within 2.6 from 1950 - // to 2100 (2.58 in 1969). + // Phoebe's row gives n = 0.6569114 degrees a day as the table defines it, the rate of its mean + // longitude, node plus periapsis plus mean anomaly, and its P, 548.02 days, is 360 over that. Its + // sidereal period is 550.30 (its Horizons page and JPL's current table, SAT441): n less twice its + // node's rate, 0.6541855, against 360 / 550.30391 = 0.6541840. Triton's row gives its sidereal + // rate as n instead, and the propagator reads a retrograde moon's n as that (see + // `meanElementsAt`): on the row's n Phoebe ran twice its node's rate too fast, 25 degrees from + // Horizons by 2025 and 100 by 2075. On the sidereal period it is within 2.6 from 1950 to 2100 + // (2.58 in 1969). The table's note on misstated retrograde mean motions is about another source, + // Jacobson 2000 on Jupiter's outer moons, and says the table carries the corrected values. { id: 'phoebe', name: 'Phoebe', kind: 'moon', horizonsCommand: '609', center: '500@699', parentBodyId: 'saturn', spinsFreely: true, periodDays: 550.30391 }, { id: 'miranda', name: 'Miranda', horizonsCommand: '705', ...URANUS_MOON }, { id: 'ariel', name: 'Ariel', horizonsCommand: '701', ...URANUS_MOON },