🎨 closer: colourise the grayscale moons — directorial hue tint (opus)
USGS has no colour equirect for Europa/Callisto/Titan/Phobos/Charon, so those
mosaics shipped grayscale. Multiply each by its characteristic hue at render
(bodies.js `tint`; moons.js tint-preserving loader keeps the real surface detail,
adds the iconic colour — Titan orange, Europa/Charon tan, Callisto/Phobos warm).
Io/Ganymede/Triton stay true USGS colour (white multiplier). Flagged in CREDITS as
a directorial (non-data) choice per Part ω.2. User-directed ("colourise the moons").
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
bdba119484
commit
bcb05f051e
@ -53,6 +53,13 @@ under budget). Downloaded 2026-07-16.
|
|||||||
Host base URL: `https://planetarymaps.usgs.gov/mosaic/` (served from the USGS
|
Host base URL: `https://planetarymaps.usgs.gov/mosaic/` (served from the USGS
|
||||||
`asc-pds-services` bucket). USGS terms: <https://www.usgs.gov/information-policies-and-instructions/copyrights-and-credits>.
|
`asc-pds-services` bucket). USGS terms: <https://www.usgs.gov/information-policies-and-instructions/copyrights-and-credits>.
|
||||||
|
|
||||||
|
**Directorial colourisation (PERIHELION closer).** USGS has no colour equirect for
|
||||||
|
Europa, Callisto, Titan, Phobos and Charon, so those mosaics ship grayscale. The
|
||||||
|
app multiplies each by its characteristic hue at render (`bodies.js` `tint`:
|
||||||
|
Titan orange, Europa/Charon tan, Callisto/Phobos warm-brown) — the *real surface
|
||||||
|
detail is preserved*; only the colour is an explicit directorial choice, not data.
|
||||||
|
Io, Ganymede and Triton are USGS colour mosaics and render untinted.
|
||||||
|
|
||||||
**Truth boundary (brief §7b):** these are the *real data* textures — real worlds
|
**Truth boundary (brief §7b):** these are the *real data* textures — real worlds
|
||||||
get real maps. The stylized grimoire portraits in `../art/grimoire/` are the
|
get real maps. The stylized grimoire portraits in `../art/grimoire/` are the
|
||||||
*aesthetic* layer (generated art), kept visually and directorially separate.
|
*aesthetic* layer (generated art), kept visually and directorially separate.
|
||||||
|
|||||||
10
js/bodies.js
10
js/bodies.js
@ -62,18 +62,18 @@ export const BODIES = {
|
|||||||
parent: 'earth', moonOrbit: { aKm: 384400, periodDays: 27.322 } },
|
parent: 'earth', moonOrbit: { aKm: 384400, periodDays: 27.322 } },
|
||||||
|
|
||||||
phobos: { name: 'Phobos', type: 'moon', radiusKm: 11.27, color: '#8a7c6e',
|
phobos: { name: 'Phobos', type: 'moon', radiusKm: 11.27, color: '#8a7c6e',
|
||||||
texture: '1k_phobos.jpg', parent: 'mars', moonOrbit: { aKm: 9378, periodDays: 0.319 } },
|
texture: '1k_phobos.jpg', tint: '#a08a76', parent: 'mars', moonOrbit: { aKm: 9378, periodDays: 0.319 } },
|
||||||
deimos: { name: 'Deimos', type: 'moon', radiusKm: 6.2, color: '#9a8c7a',
|
deimos: { name: 'Deimos', type: 'moon', radiusKm: 6.2, color: '#9a8c7a',
|
||||||
texture: null, parent: 'mars', moonOrbit: { aKm: 23459, periodDays: 1.262 } },
|
texture: null, parent: 'mars', moonOrbit: { aKm: 23459, periodDays: 1.262 } },
|
||||||
|
|
||||||
io: { name: 'Io', type: 'moon', radiusKm: 1821.6, color: '#e8d24b',
|
io: { name: 'Io', type: 'moon', radiusKm: 1821.6, color: '#e8d24b',
|
||||||
texture: '1k_io.jpg', parent: 'jupiter', moonOrbit: { aKm: 421700, periodDays: 1.769 } },
|
texture: '1k_io.jpg', parent: 'jupiter', moonOrbit: { aKm: 421700, periodDays: 1.769 } },
|
||||||
europa: { name: 'Europa', type: 'moon', radiusKm: 1560.8, color: '#c9b79c',
|
europa: { name: 'Europa', type: 'moon', radiusKm: 1560.8, color: '#c9b79c',
|
||||||
texture: '1k_europa.jpg', parent: 'jupiter', moonOrbit: { aKm: 671034, periodDays: 3.551 } },
|
texture: '1k_europa.jpg', tint: '#e6dcc8', parent: 'jupiter', moonOrbit: { aKm: 671034, periodDays: 3.551 } },
|
||||||
ganymede: { name: 'Ganymede', type: 'moon', radiusKm: 2634.1, color: '#9b8e7e',
|
ganymede: { name: 'Ganymede', type: 'moon', radiusKm: 2634.1, color: '#9b8e7e',
|
||||||
texture: '1k_ganymede.jpg', parent: 'jupiter', moonOrbit: { aKm: 1070412, periodDays: 7.155 } },
|
texture: '1k_ganymede.jpg', parent: 'jupiter', moonOrbit: { aKm: 1070412, periodDays: 7.155 } },
|
||||||
callisto: { name: 'Callisto', type: 'moon', radiusKm: 2410.3, color: '#6b5f52',
|
callisto: { name: 'Callisto', type: 'moon', radiusKm: 2410.3, color: '#6b5f52',
|
||||||
texture: '1k_callisto.jpg', parent: 'jupiter', moonOrbit: { aKm: 1882709, periodDays: 16.689 } },
|
texture: '1k_callisto.jpg', tint: '#9a8778', parent: 'jupiter', moonOrbit: { aKm: 1882709, periodDays: 16.689 } },
|
||||||
|
|
||||||
mimas: { name: 'Mimas', type: 'moon', radiusKm: 198.2, color: '#c8c8c8',
|
mimas: { name: 'Mimas', type: 'moon', radiusKm: 198.2, color: '#c8c8c8',
|
||||||
texture: null, parent: 'saturn', moonOrbit: { aKm: 185539, periodDays: 0.942 } },
|
texture: null, parent: 'saturn', moonOrbit: { aKm: 185539, periodDays: 0.942 } },
|
||||||
@ -86,7 +86,7 @@ export const BODIES = {
|
|||||||
rhea: { name: 'Rhea', type: 'moon', radiusKm: 763.8, color: '#c4c4c4',
|
rhea: { name: 'Rhea', type: 'moon', radiusKm: 763.8, color: '#c4c4c4',
|
||||||
texture: null, parent: 'saturn', moonOrbit: { aKm: 527068, periodDays: 4.518 } },
|
texture: null, parent: 'saturn', moonOrbit: { aKm: 527068, periodDays: 4.518 } },
|
||||||
titan: { name: 'Titan', type: 'moon', radiusKm: 2574.7, color: '#d9a441',
|
titan: { name: 'Titan', type: 'moon', radiusKm: 2574.7, color: '#d9a441',
|
||||||
texture: '1k_titan.jpg', parent: 'saturn', moonOrbit: { aKm: 1221870, periodDays: 15.945 } },
|
texture: '1k_titan.jpg', tint: '#e0a63f', parent: 'saturn', moonOrbit: { aKm: 1221870, periodDays: 15.945 } },
|
||||||
iapetus: { name: 'Iapetus', type: 'moon', radiusKm: 734.5, color: '#8a7a5e',
|
iapetus: { name: 'Iapetus', type: 'moon', radiusKm: 734.5, color: '#8a7a5e',
|
||||||
texture: null, parent: 'saturn', moonOrbit: { aKm: 3560851, periodDays: 79.33 } },
|
texture: null, parent: 'saturn', moonOrbit: { aKm: 3560851, periodDays: 79.33 } },
|
||||||
|
|
||||||
@ -114,7 +114,7 @@ export const BODIES = {
|
|||||||
w: 113.76329, ma: 14.86012204, epoch: 2451545.0 },
|
w: 113.76329, ma: 14.86012204, epoch: 2451545.0 },
|
||||||
},
|
},
|
||||||
charon: { name: 'Charon', type: 'moon', radiusKm: 606.0, color: '#b3a894',
|
charon: { name: 'Charon', type: 'moon', radiusKm: 606.0, color: '#b3a894',
|
||||||
texture: '1k_charon.jpg', parent: 'pluto', moonOrbit: { aKm: 19591, periodDays: 6.387 } },
|
texture: '1k_charon.jpg', tint: '#c4b7a4', parent: 'pluto', moonOrbit: { aKm: 19591, periodDays: 6.387 } },
|
||||||
};
|
};
|
||||||
|
|
||||||
// Ordered planet ids (draw / menu order).
|
// Ordered planet ids (draw / menu order).
|
||||||
|
|||||||
@ -17,7 +17,17 @@ export default function create(ctx) {
|
|||||||
const mesh = new THREE.Mesh(new THREE.SphereGeometry(1, 24, 16), mat);
|
const mesh = new THREE.Mesh(new THREE.SphereGeometry(1, 24, 16), mat);
|
||||||
mesh.visible = true;
|
mesh.visible = true;
|
||||||
scene.add(mesh);
|
scene.add(mesh);
|
||||||
loadTextureInto(mat, b.texture); // NASA/USGS map when present; flat color otherwise (§7 fallback)
|
if (b.tint) {
|
||||||
|
// Directorial colourisation: the USGS mosaics for these moons are grayscale
|
||||||
|
// (no color equirect exists), so multiply the real surface by the moon's
|
||||||
|
// characteristic hue — keeps true detail, adds the iconic colour. On a load
|
||||||
|
// error the flat b.color already set on the material stands (§7 fallback).
|
||||||
|
new THREE.TextureLoader().load(CONFIG.textures.path + b.texture, (tex) => {
|
||||||
|
tex.colorSpace = THREE.SRGBColorSpace; mat.map = tex; mat.color.set(b.tint); mat.needsUpdate = true;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
loadTextureInto(mat, b.texture); // NASA/USGS map when present; flat color otherwise (§7 fallback)
|
||||||
|
}
|
||||||
registerPick(mesh, id);
|
registerPick(mesh, id);
|
||||||
const lbl = makeLabel(mesh, b.name, 'body-label moon');
|
const lbl = makeLabel(mesh, b.name, 'body-label moon');
|
||||||
lbl.obj.visible = false; // CSS2DRenderer honors obj.visible (not div.style.display)
|
lbl.obj.visible = false; // CSS2DRenderer honors obj.visible (not div.style.display)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user