flights: full CONFIG.flights parameterization (altitude, count, speed, holds, destination weights, contrail chance/alt/life/width) + curved random-destination routing

This commit is contained in:
Richard Zink committed 2026-10-10 11:02:58 +02:00
1 parent fbac24773a
commit d0aa86ce9b
10 files changed
+1231 -210

No files matched your search

+51 -17
View File
@@ -6,7 +6,8 @@
* (default 'ash'). The matching CSS file is loaded at
* startup.
* language - UI / i18n language code (default 'en').
* timeFormat - Moment.js-compatible format string for the clock.
* timeFormat - Format string for the clock using the token set below
* (Moment.js-like names, own mini-formatter).
* debug - If 1, the right-side debug panel is shown.
* units - Object with 'temperature' ('C' or 'F').
* location - Geographic coordinates for sun/moon calculations. Used
@@ -16,9 +17,9 @@
* Optionally add 'label' (string) to override the
* reverse-geocoded city name.
* Note: the height grid is axis-aligned (N up); terrain
* matches the 8-mode square mosaic and straight flights
* with fetch=N. Heights: Copernicus DEM via terrarium
* tiles (z9, ~200 m), fetched once per session.
* matches the square ground mosaic and straight flights
* (prefetch direction via #fetch=N). Heights: Copernicus
* DEM via terrarium tiles (z9, ~200 m).
* terrain - 3D ground from real elevation data. Object:
* enabled - true (default) / false = flat plane.
* exaggeration - vertical scale factor on the DEM
@@ -48,9 +49,9 @@
* (visibility range at which terrain fully blends into
* a milky haze; default 120). false/0 disables fog.
* clouds - Vertical extent of the cloud deck in world units
* (1 unit = ~13 km at zoom 11; camera flies at y=2.2).
* Object with 'top' and 'bottom'. Default keeps the
* deck a bit below flight altitude.
* (1 unit = ~12.9 km at zoom 11; camera band 15-35 km,
* i.e. y ~ 1.16-2.70). Default puts the deck top (~11.6
* km) below the lowest flight altitude.
* tiles - All downloads (street tiles, elevation grid, last
* weather payload, geo label) live permanently in
* IndexedDB and are never re-fetched once cached; a
@@ -60,16 +61,16 @@
*
* Time format tokens (subset):
* YYYY 4-digit year (2026)
* YY 2-digit year (26)
* MMMM full month name (October)
* MM month with leading zero (10)
* DD day with leading zero (07)
* HH 24-hour hour with zero (18)
* hh 12-hour hour with zero (06)
* mm minute with leading zero (14)
* ss second with leading zero (25)
* a am/pm lowercase (pm) - long form
* A AM/PM uppercase (PM) - long form
* a am/pm lowercase (pm)
* A AM/PM uppercase (PM)
* dddd full weekday name (lowercase!)
* Any other character is emitted verbatim.
*/
window.CONFIG = {
theme: 'ash',
@@ -143,11 +144,39 @@ window.CONFIG = {
// hamlet) als leicht gelbliche Glow-Punkte, ab Daemmerung statisch;
// je groesser die Siedlung (place-Klasse + population-Tag), desto
// mehr und hellere Punkte. Eine Overpass-Abfrage, persistent gecacht.
// Daten (c) OpenStreetMap-Mitwirkende, ODbL.
// ---- Civil aviation (CONFIG.flights) ---------------------------------
// Low-poly jets (CC0 model, vendor/plane3d.js) with randomized target
// airports: the destination is rolled at every take-off (hubs weighted
// via wHub/wField/wStrip). Paths are gentle Bezier curves resampled to
// arc length (constant ground speed) flown as a full profile: take-off
// and climb, cruise, descent and landing, a short ground hold, then a
// fresh destination. By day sun-lit silhouettes; by night white
// strobing position lights with a red beacon. Contrails form above
// contrailStartKm on contrailChance of the aircraft and stay visible
// for contrailLifeS. All distances in km (world scale: 1 unit = one
// z11 tile ~ 12.9 km at 48.6 deg N).
flights: {
enabled: true,
altitudeKm: 14, // cruise altitude
climbKm: 100, // climb/descent run to/from cruise altitude
count: 84, // max simultaneous aircraft
speedKmh: 850, // mean ground speed
speedVar: 0.18, // +/- deviation (0..0.5)
minLegKm: 60, // shortest leg (no taxi hops)
holdMinS: 50, // ground hold at destination (min..max)
holdMaxS: 150,
wHub: 4, // destination weights: hub / airfield / strip
wField: 2,
wStrip: 1,
contrailChance: 0.6, // share of aircraft with a persistent trail
contrailStartKm: 6, // trail formation altitude
contrailLifeS: 300, // trail visibility duration
contrailWidthM: 310 // full trail width
},
terrain: {
enabled: true,
exaggeration: 10,
wireframe: false,
exaggeration: 8,
wireframe: true,
nightLights: false,
carLights: true,
cityLights: true
@@ -155,12 +184,17 @@ window.CONFIG = {
// Tagessimulation: true = 24h-Zyklus wird in cycleSeconds durchlaufen
// (Sonne steigt im Osten, Mittag im Sueden, Untergang im Westen).
// false = echte Sonnen-/Mondposition via SunCalc.
// fixedTime: 'HH:MM' (oder Zahl 0-24) = Sim-Uhr steht still auf
// dieser Tageszeit (bewegte Objekte, Wolken, Autos und Wetter-Sim
// laufen unaffected weiter); null/auskommentiert = Uhr laeuft.
// 20:00 = maximum Verkehrsaufkommen (Plateau 18:30-23:00, Dichte=1).
day: {
simulation: false,
cycleSeconds: 20
cycleSeconds: 20,
fixedTime: null
},
// Wolkendecke in Welt-Einheiten (1 unit ~ 13 km bei Zoom 11;
// Kamera fliegt auf y=2.2). Decke etwas unter Flughohe.
// Wolkendecke in Welt-Einheiten (1 unit ~ 12.9 km bei Zoom 11;
// Flugband 15-35 km = y ~ 1.16-2.70). Oberkante unter dem Tiefpunkt.
clouds: {
top: 0.9,
bottom: -0.3