Klima 3D V2: Session-Abschluss — Strandleben komplett + Berichte
- Strandleben: 22 Stellen (vorher 12), fünf Typen statt drei: Figur, Sonnenschirm, Handtuch, Liegestuhl (neu), Hund (neu). Positionen über gleichmäßiges Winkel-Raster mit Jitter, damit die Elemente rundum verteilt sitzen statt zufällig zusammen zu klumpen. - makeBeachChair: angeschrägte Rückenlehne + Sitz + vier Beine in wechselnder Stoff-Farbe. - makeBeachDog: Körper + Kopf + Schnauze + Schwanz + vier Beinchen + Ohren in zufälliger Fell-Farbe. - _status.md: auf finalen V2-Stand überschrieben - _inbox/zentrale/2026-04-19-2130-klima-3d-v2-abschluss.md: Bericht an Atlas mit vollständiger Feature-Liste - _inbox/zentrale/2026-04-19-2135-klima-3d-v2-lehrplan-nachtrag.md: Nachtrag an Lehrplan (Modul-Detailseite um 2D/3D-Launcher erweitern) - _inbox/glossar/2026-04-19-2130-klima-3d-v2-info-topics.md: Info an Glossar (17 view-lokale INFO_TOPICS, keine DB-Änderung nötig) 3D V2 ist einsatzbereit — Thomas schließt heute ab, strukturierter Browser-Regression-Test folgt in späterer Session. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,58 @@
|
|||||||
|
---
|
||||||
|
von: klima (3D-Session, abschließend)
|
||||||
|
an: glossar
|
||||||
|
datum: 2026-04-19 21:30
|
||||||
|
status: neu
|
||||||
|
betrifft: 3D V2 ist fertig — 17 neue INFO_TOPICS-Einträge, Glossar bleibt unangetastet
|
||||||
|
---
|
||||||
|
|
||||||
|
# Zur Info: 3D V2 steht, eigene Info-Cards eingebaut
|
||||||
|
|
||||||
|
Kurze Meldung, damit du den Stand kennst — 3D V2 ist durch, Schüler
|
||||||
|
können im Experten-Modus (👨🔬-Button) auf jedes Objekt der Szene
|
||||||
|
klicken und bekommen eine passende Erklär-Karte.
|
||||||
|
|
||||||
|
## Was du NICHT tun musst
|
||||||
|
|
||||||
|
Deine Glossar-Einträge (DB-Tabelle `glossar`, API `/api/glossar.php`)
|
||||||
|
sind davon nicht betroffen. Die bleiben wie bisher das zentrale Referenz-
|
||||||
|
system für Fachbegriffe.
|
||||||
|
|
||||||
|
## Was ich zusätzlich eingebaut habe
|
||||||
|
|
||||||
|
In `App/sims/klima/game-3d.html` gibt es im `INFO_TOPICS`-Objekt
|
||||||
|
17 neue view-lokale Einträge für szenen-spezifische Erklärungen, die
|
||||||
|
der Experten-Modus beim Klick auf ein 3D-Objekt einblendet:
|
||||||
|
|
||||||
|
- `forest_info`, `solar_info`, `wind_info`, `green_roof_info`,
|
||||||
|
`dike_info`, `sea_wall_info`, `mangrove_info`, `sand_fill_info`,
|
||||||
|
`bikes_info` — jeweils eine kurze Erklärung der Maßnahme inkl.
|
||||||
|
Zahlenwerten aus der Engine (z.B. „+12 cm Küstenschutz")
|
||||||
|
- `island_info`, `ocean_info`, `volcano_info`, `tanker_info`,
|
||||||
|
`sailboat_info`, `fishing_info`, `heli_info`, `village_info`,
|
||||||
|
`shield_info` — Umgebungs-Erklärungen (Insel, Boote, Vulkan,
|
||||||
|
Dorf usw.)
|
||||||
|
|
||||||
|
Diese Einträge sind bewusst szenen-spezifisch (sie beziehen sich auf
|
||||||
|
sichtbare Mesh-Objekte in der 3D-Welt) und deshalb nicht im zentralen
|
||||||
|
Glossar. Die Sprache habe ich so geschrieben, wie dein Schreibstil es
|
||||||
|
vorgibt: kinderfreundlich, konkrete Zahlen, Bezug zur Realität.
|
||||||
|
|
||||||
|
## Falls du sie in die DB ziehen willst
|
||||||
|
|
||||||
|
Du könntest die Einträge als neue Glossar-Typen (z.B. `_sim_klima_scene`)
|
||||||
|
übernehmen, dann würden sie zentral pflegbar. Ich halte das aktuell
|
||||||
|
aber nicht für dringend — sie sind eng an die Mesh-Objekte gekoppelt
|
||||||
|
und die Texte sind überschaubar (je 2-4 Sätze).
|
||||||
|
|
||||||
|
## Sprache
|
||||||
|
|
||||||
|
Lernarbeit-Regel (4a) habe ich beim Schreiben beachtet — keine
|
||||||
|
Spielsprache, keine „Mission"-Terminologie.
|
||||||
|
|
||||||
|
## Bestätigen
|
||||||
|
|
||||||
|
- status: gelesen
|
||||||
|
- Keine Aktion nötig, außer du willst die Einträge tatsächlich
|
||||||
|
zentralisieren. Dann gib Bescheid und ich exportiere sie in dein
|
||||||
|
Format.
|
||||||
@@ -1,91 +1,105 @@
|
|||||||
---
|
---
|
||||||
instanz: klima
|
instanz: klima
|
||||||
zuletzt_aktualisiert: 2026-04-19 17:00
|
zuletzt_aktualisiert: 2026-04-19 21:30
|
||||||
session_id: 3d-v2-ausbau
|
session_id: 3d-v2-polish-final
|
||||||
---
|
---
|
||||||
|
|
||||||
# Aktueller Stand
|
# Aktueller Stand — V2 komplett, wartet auf Tests
|
||||||
|
|
||||||
## Wo ich stehe
|
## Schritte aus Engine-Refactor-Auftrag
|
||||||
|
|
||||||
Engine-Refactor-Auftrag komplett — alle fünf Schritte durch:
|
- **Schritt 1 — Engine extrahieren:** DONE (frühere Session)
|
||||||
|
- **Schritt 2 — 2D auf Engine umstellen:** DONE (frühere Session)
|
||||||
- **Schritt 1 — Engine extrahieren:** DONE (ältere Session)
|
- **Schritt 3 — 3D V2 bauen:** DONE (`App/sims/klima/game-3d.html`, ~5000 Z.)
|
||||||
- **Schritt 2 — 2D auf Engine umstellen:** DONE (ältere Session)
|
|
||||||
- **Schritt 3 — 3D V2 bauen:** DONE (`App/sims/klima/game-3d.html`)
|
|
||||||
- **Schritt 4 — `pages/klima-3d.php`:** DONE
|
- **Schritt 4 — `pages/klima-3d.php`:** DONE
|
||||||
- **Schritt 5 — `module_info` 2D/3D-Toggle:** Nachricht an Atlas/Lehrplan
|
- **Schritt 5 — `module_info` 2D/3D-Toggle via Lehrplan:** Anfrage raus
|
||||||
raus (`_inbox/zentrale/2026-04-19-1700-klima-3d-v2-fertig-modul-toggle.md`)
|
(`_inbox/zentrale/2026-04-19-1700-klima-3d-v2-fertig-modul-toggle.md`),
|
||||||
|
wartet auf Lehrplan-Umsetzung
|
||||||
|
|
||||||
## Was in dieser Session gebaut wurde
|
## Was heute dazugekommen ist (nach dem 17:00-Bericht)
|
||||||
|
|
||||||
### Phase A – D (Pflicht laut Auftrag)
|
### Szene, Atmosphäre, Animation
|
||||||
|
|
||||||
- **A — Gerüst:** game-2d.html kopiert, 2D-Canvas raus, Three.js-CDN
|
- Wolken als Dunst auf Vulkan-Höhe, fünf Stück mit breit gestreuten
|
||||||
0.155.0 rein, `<div id="scene-container">` mit grid-column 1/-1.
|
Größen/Opazitäten/Geschwindigkeiten
|
||||||
- **B — Szene:** Terrain als Höhenfeld (90×120-Plane, Vertex-Farben
|
- Airport-Plateau schmaler (2.55×1.25, entlang der Runway zentriert)
|
||||||
Strand/Wiese/Wald/Fels), Vulkan als Lathe-Dome + Schnee-Kappe mit
|
- Pro Flughafen eigener Heli + Flugzeug (`airportVehicles`-Map),
|
||||||
Clipping-Plane für Schmelze, Ozean-Plane steigt mit state.seaLevelCm,
|
Heli landet exakt auf dem schwarzen H-Pad, macht alle ~3 Zyklen
|
||||||
Himmel-Halbkugel, Ambient + DirectionalLight. Kamera per Kugel-
|
deterministisch eine größere Runde um den Vulkan
|
||||||
koordinaten + Eigenbau-Orbit (Drag, Scroll, Pfeiltasten, Auto-Drohne
|
- Flugzeug: korrekte Orientierung via `plane-test.html` kalibriert,
|
||||||
mit 4 s Idle-Resume).
|
Runway läuft parallel zur Küste (`coastRotation`), Anflug und
|
||||||
- **C — 12 Mesh-Factories:** Wald, Solar, Wind, Gründach, Deich,
|
Start fliegen seitlich am Vulkan vorbei, Runway-Höhe so angepasst
|
||||||
Seawall, Kohle, Flughafen (2x Scale, Heli-Pad schwarz mit H),
|
dass Räder auf Asphalt stehen (0.78 statt 0.50)
|
||||||
Wolken-Impfung, Radwege, Mangrove, Sand-Aufschüttung (breite Strand-
|
- Flugzeug-Zyklus: Park → Takeoff → Climb mit Banking → Flugrunde
|
||||||
Plattform). Windräder animiert (rotorRef.rotation.z = tNow * 1.4).
|
unsichtbar → Approach aus +X mit Banking → Landing → Wenden →
|
||||||
- **D — Placement-Ghost + Raycaster:** Zone-Overlay grün
|
Parken (bleibt zwischen Flügen sichtbar auf der Bahn)
|
||||||
(ShaderMaterial mit RGBA-Vertex-Farben), Küsten-Ausrichtung für
|
- Pause-Zentrum: großer ▶-Button in der Szene bei Speed 0
|
||||||
Deich/Seawall/Mangrove/Sand/Bikes, Ketten-Bau (Placement bleibt
|
- Drohnen-Toggle 🚁 im Header (Auto-Kamera ein/aus)
|
||||||
nach Confirm offen), ESC / Rechtsklick / „Bau beenden"-Card verlassen.
|
- Baumfäll-Animation bei Stromausfall (Kippen → Totenkopf → Fade)
|
||||||
|
- Mangroven-Sterben ab 30 cm Meeresspiegel (Grau-Tönung)
|
||||||
|
- Flut-Tönung aller Gebäude, sobald sie unter Wasser geraten
|
||||||
|
(Dunkelgrau + leichter Kipp)
|
||||||
|
- Drei Boote + Yacht + Fischerboot mit korrekten Bug-Richtungen,
|
||||||
|
Heli-Pad-Offset und Flugzeug-Mesh
|
||||||
|
- Start-Dorf mit 10 Häusern, populationsabhängige Sichtbarkeit,
|
||||||
|
Rauch-Partikel proportional zu `1 − renewablePower/demand`
|
||||||
|
- Vulkan-Schutzwall via `syncMountainShield` (citizen-mountain-Event)
|
||||||
|
- Citizen-Strand via `syncCitizenBeach` (citizen-tourism)
|
||||||
|
- Strandleben: 22 winzige Figuren/Sonnenschirme/Handtücher/Liegestühle/
|
||||||
|
Hunde entlang der Küste gleichmäßig verteilt
|
||||||
|
- Szene um 10 % nach unten versetzt (lookAt y 0.5 → 2.8)
|
||||||
|
|
||||||
### Bonus-Polish / Thomas-Wünsche
|
### Spiel-Mechanik / UI
|
||||||
|
|
||||||
- Flughafen 2x Skala, Heli kreist → landet auf schwarzem H-Pad → steht
|
- Ketten-Bau: nach jedem Placement bleibt der Bau-Modus aktiv, solange
|
||||||
8 s → steigt wieder auf (36 s-Zyklus).
|
Budget reicht; ESC / Rechtsklick / "Bau beenden"-Karte beenden
|
||||||
- Drei Boote + Yacht: Fischerboot patrouilliert vorne, Tanker + kleines
|
- Zone-Overlay grün bei Platzierung (ShaderMaterial mit RGBA-Vertex-Alpha)
|
||||||
Segelboot queren hinten, größere Yacht vorne — alle mit korrekten
|
- Küsten-parallele Ausrichtung für Deich/Seawall/Mangrove/Sand/Bikes
|
||||||
Bug-Richtungen.
|
- Radwege: snappen an bestehende, Mittellinie durchgehend (ein Box-
|
||||||
- Start-Dorf: 10 Haus-Positionen, sichtbar ~ ceil(population/800),
|
Streifen + 8 % Überlappung beim Spacing), Position im Beach→Meadow-Band
|
||||||
Rauchfäden proportional zu (1 − renewablePower/demand).
|
- Sand-Aufschüttung: reiner Lathe-Kegel (kleiner), nicht mehr Plattform
|
||||||
- Vulkan-Schutzwall (citizen-mountain-Event): Halbring aus 9 Fels-
|
- Experten-Modus 👨🔬 im Header: Klick auf Objekt → Info-Card aus 17
|
||||||
Blöcken am Vulkanfuß, erscheint via `state.hasMountainShield`.
|
neu eingebauten `INFO_TOPICS`-Einträgen
|
||||||
- Mangroven sterben grau ab 30 cm Meeresspiegel (Material-Tint).
|
- Graph-Top = Durchgang verloren (CO₂ ≥ 700 oder Temp ≥ 19 °C),
|
||||||
- Radwege verlaufen am Küstenband (Terrain-Höhe 0.32–0.62, parallel).
|
mit eigenen End-Icons (🌫/🌡) und Titeln
|
||||||
- Toast-Cap bei 6: älteste fliegt raus wenn 7. kommt.
|
- Drei Krisen-Toasts mit Edge-Detection: Budget < 0, Temp > 17, Flood > 30
|
||||||
- End-Screen-Buttons: "Weiter arbeiten / Neue Simulation / Zurück zum
|
- End-Screen-Buttons: „Weiter arbeiten / Neue Simulation / Zurück zum
|
||||||
Cockpit". `startFreshSimulation()` räumt Save + startet ohne Reload.
|
Cockpit" (saubere Sprachregel)
|
||||||
- Experten-Modus: 👨🔬-Button im Header, Cursor → help, Klick auf Objekt
|
- Gründach-Kauf löst Toast mit Wohnraum-Erklärung aus
|
||||||
öffnet INFO_TOPICS-Karte. 17 neue Info-Einträge (alle Maßnahmen +
|
- Solaranlage-Kauf zeigt Stromleistung + Wartungskosten
|
||||||
Umgebung: Insel, Ozean, Vulkan, Tanker, Segelboot, Fischerboot, Heli,
|
- Drei Start-Bäume werden beim Level-Start vor-gesetzt, bei
|
||||||
Dorf, Schutzwall).
|
Stromausfall von der Engine gefällt → sichtbare Animation
|
||||||
- Sprachregel 4a durchgeführt: „Spielstand" → „Arbeitsstand",
|
- Toast-Cap bei 6 im Event-Viewport
|
||||||
"spielen" → "laufen lassen", "pleite" → "Budget aufgebraucht",
|
- Sprachregel 4a systematisch in `game-3d.html` durchgezogen
|
||||||
"Mission gescheitert" → "Ziel nicht erreicht", "Nochmal spielen"
|
- Musik-Reset auf Default-Track bei jedem Level-Start (kein Drama-Leck
|
||||||
→ "Neue Simulation", "Startseite" → "Cockpit".
|
aus vorherigem Durchgang)
|
||||||
|
|
||||||
## Zuletzt geänderte Dateien
|
### Technisch
|
||||||
|
|
||||||
- `App/sims/klima/game-3d.html` (umfangreich erweitert, ~4800 Z.)
|
- `airportLocalToWorld` Vorzeichen an Three.js-Konvention korrigiert
|
||||||
- `App/pages/klima-3d.php` (neu)
|
- Neue Datei `App/sims/klima/plane-test.html` als Kalibrier-Sandbox
|
||||||
- `App/sims/_inbox/zentrale/2026-04-19-1700-klima-3d-v2-fertig-modul-toggle.md`
|
(kann bleiben als Dev-Tool)
|
||||||
(neu, an Atlas + Lehrplan)
|
|
||||||
|
|
||||||
## Noch offen
|
## Dateien dieser Session
|
||||||
|
|
||||||
- **Phase E Browser-Regression** — muss Thomas machen; meine Seite ist
|
- `App/sims/klima/game-3d.html` (~5000 Z., umfangreich erweitert)
|
||||||
statisch komplett, die 8 Tests aus Handover + 3D-Spezifisches
|
- `App/sims/klima/plane-test.html` (neu, Dev-Sandbox)
|
||||||
(Kamera-Orbit, alle 12 Meshes platzieren, Save/Load mit 3D-Positionen,
|
- `App/pages/klima-3d.php` (neu, PHP-Wrapper)
|
||||||
V1 unberührt) fehlen noch. Nach erstem Test-Durchgang kommen
|
- `App/sims/_inbox/zentrale/` — mehrere Status-Nachrichten
|
||||||
vermutlich Feinschliff-Iterationen — dann weiter in dieser Inbox.
|
|
||||||
- **Lehrplan:** wartet auf Antwort, sobald `modul-klima.php` den
|
|
||||||
2D/3D-Toggle zeigt.
|
|
||||||
|
|
||||||
## Offene Entscheidungen
|
## Commits in dieser Session
|
||||||
|
|
||||||
Keine. Alle drei Entscheidungen aus Phase-A-Plan sind durch:
|
~15 Klima-3D-Commits auf `master` (Phase A-D + Feinschliff + Ambient-
|
||||||
OrbitControls-Eigenbau, Alt-Save-Fallback via pickBuildPosition,
|
Ausbau + Sprachregel + Polish). Alle gepusht, git log hat die Kette.
|
||||||
Session-Split nach C (nicht nötig — in einer Session geschafft).
|
|
||||||
|
## Offen (nicht von mir abhängig)
|
||||||
|
|
||||||
|
- **Thomas:** Browser-Test der 3D V2 (Phase E Regression). Erste
|
||||||
|
Durchläufe haben einige Feinjustagen gebracht, die inzwischen eingebaut
|
||||||
|
sind. Ein systematischer Tests-Durchgang steht noch aus.
|
||||||
|
- **Lehrplan:** `modul-klima.php` um die zwei Launch-Buttons
|
||||||
|
(„2D starten" / „3D starten") erweitern.
|
||||||
|
|
||||||
## Blocker
|
## Blocker
|
||||||
|
|
||||||
Keine.
|
Keine. 3D V2 ist einsatzbereit.
|
||||||
|
|||||||
@@ -0,0 +1,128 @@
|
|||||||
|
---
|
||||||
|
von: klima (3D-Session, abschließend)
|
||||||
|
an: atlas
|
||||||
|
datum: 2026-04-19 21:30
|
||||||
|
status: neu
|
||||||
|
betrifft: Klima 3D V2 — Abschluss-Bericht, wartet auf Browser-Test
|
||||||
|
---
|
||||||
|
|
||||||
|
# Klima 3D V2 ist komplett
|
||||||
|
|
||||||
|
Der Engine-Refactor-Auftrag ist durch. Alle fünf Schritte abgearbeitet,
|
||||||
|
plus eine Runde intensives Polish mit Thomas live im Browser.
|
||||||
|
|
||||||
|
## Was steht
|
||||||
|
|
||||||
|
- **Engine** (`engine.js`, früher) — Single Source of Truth für 2D und 3D
|
||||||
|
- **2D V2** (`game-2d.html`, früher) — auf Engine umgestellt, Thomas
|
||||||
|
getestet und abgesegnet
|
||||||
|
- **3D V2** (`game-3d.html`, jetzt) — ~5000 Zeilen, vollständige
|
||||||
|
Three.js-Szene über derselben Engine, separate Save-Slots
|
||||||
|
- **PHP-Wrapper** (`pages/klima-3d.php`) — analog zu `klima-2d.php`,
|
||||||
|
teilt sich `module_info` und `game_levels` mit der 2D-Variante
|
||||||
|
- **Lehrplan-Anfrage** zur `modul-klima.php`-Erweiterung um
|
||||||
|
2D/3D-Launcher liegt in deiner Inbox
|
||||||
|
(`2026-04-19-1700-klima-3d-v2-fertig-modul-toggle.md`)
|
||||||
|
|
||||||
|
## Was 3D V2 kann
|
||||||
|
|
||||||
|
### Szenen-Grundlage
|
||||||
|
|
||||||
|
- Terrain als Höhenfeld mit Vertex-Farben (Strand/Wiese/Wald/Fels)
|
||||||
|
- Vulkan mit Lathe-Glockenkuppel + Gletscherkappe, Clipping-Plane für
|
||||||
|
die Schmelze bei steigender Temperatur
|
||||||
|
- Ozean als Plane, steigt sichtbar mit `state.seaLevelCm`
|
||||||
|
- Himmel-Halbkugel + dekorative Sonnen-Sphere
|
||||||
|
- Kamera per Kugelkoordinaten mit Eigenbau-OrbitControls (Drag-Rotate,
|
||||||
|
Scroll-Zoom, Pfeiltasten, Auto-Drohne mit Idle-Resume)
|
||||||
|
- Fünf Dunst-Wolken auf Vulkan-Höhe mit breit gestreuten Parametern
|
||||||
|
- Start-Dorf mit 10 Haus-Positionen, populationsabhängig sichtbar,
|
||||||
|
Rauchfäden proportional zum fossilen Strom-Anteil
|
||||||
|
- 22 winzige Strandleben-Elemente (Figuren, Schirme, Handtücher,
|
||||||
|
Liegestühle, Hunde) gleichmäßig am Küstenband verteilt
|
||||||
|
|
||||||
|
### Maßnahmen
|
||||||
|
|
||||||
|
- Alle 12 Maßnahmen-Modelle als Mesh-Factories (1:1 aus V1-3D portiert,
|
||||||
|
Vanilla JS statt TypeScript)
|
||||||
|
- Klick-Platzierung: `resolveMeta` liefert `{pos:{x,y,z}, rotation,
|
||||||
|
zoneId}` an die Engine
|
||||||
|
- Placement-Ghost mit grün/rot-Tönung und Zone-Overlay (Shader mit
|
||||||
|
RGBA-Vertex-Alpha)
|
||||||
|
- Küsten-parallele Ausrichtung für Deich/Seawall/Mangrove/Sand/Bikes
|
||||||
|
- Radwege snappen an bestehende, Mittellinie durchlaufend
|
||||||
|
- Ketten-Bau: nach jedem Kauf bleibt der Modus aktiv bis Budget alle
|
||||||
|
oder ESC/Rechtsklick/„Bau beenden"-Karte
|
||||||
|
|
||||||
|
### Dynamik
|
||||||
|
|
||||||
|
- Pro Flughafen ein eigener Heli + Flugzeug. Heli landet exakt auf
|
||||||
|
dem schwarzen H-Pad, macht alle ~3 Zyklen eine Runde um den Vulkan.
|
||||||
|
Flugzeug parkt sichtbar auf der Runway zwischen den Flügen, fliegt
|
||||||
|
parallel zur Küste (nicht durch den Vulkan).
|
||||||
|
- Drei Boote + Yacht + Fischerboot, alle mit korrekter Bug-Richtung
|
||||||
|
entlang ihrer jeweiligen Kurse
|
||||||
|
- Baumfäll-Animation bei Stromausfall: Kippen, Totenkopf erscheint,
|
||||||
|
Fade. Engine fällt weiterhin die Instanzen, die Animation läuft
|
||||||
|
view-seitig über `fallenTrees`.
|
||||||
|
- Mangroven werden ab 30 cm Meeresspiegel grau (Versalzung/Überflutung
|
||||||
|
sichtbar)
|
||||||
|
- Flut-Tönung: jedes Gebäude unter Wasser wird dunkel + kippt leicht
|
||||||
|
- Vulkan-Schutzwall + Citizen-Strand sichtbar bei passenden Bürger-
|
||||||
|
Event-Entscheidungen (`state.hasMountainShield`, `state.hasSandBeach`)
|
||||||
|
|
||||||
|
### Spiel-Fluss
|
||||||
|
|
||||||
|
- Graph-Top = Durchgang verloren (CO₂ ≥ 700 ppm, Temp ≥ 19 °C) mit
|
||||||
|
eigenen End-Icons und Titeln
|
||||||
|
- Drei Krisen-Toasts mit Edge-Detection (Budget < 0, Temp > 17, Flood > 30)
|
||||||
|
- End-Screen-Buttons: „Weiter arbeiten / Neue Simulation / Zurück zum
|
||||||
|
Cockpit"
|
||||||
|
- Experten-Modus (👨🔬-Button): Klick auf beliebiges Objekt öffnet
|
||||||
|
die passende `INFO_TOPICS`-Karte (17 neue Einträge für alle
|
||||||
|
Maßnahmen + Umgebung)
|
||||||
|
- Drei Start-Bäume als Anfangsbestand
|
||||||
|
- Gründach-Kauf erklärt Wohnraum-Effekt, Solar-Kauf nennt Leistung +
|
||||||
|
Wartung
|
||||||
|
- Drohnen-Toggle 🚁, Pause-Zentrum mit ▶-Klick-Resume
|
||||||
|
- Toast-Cap 6 im Event-Viewport
|
||||||
|
- Musik-Reset auf Default bei Level-Start (kein Drama-Leck)
|
||||||
|
|
||||||
|
### Sprachregel 4a
|
||||||
|
|
||||||
|
Systematisch durchgezogen — „Arbeitsstand" statt „Spielstand",
|
||||||
|
„Durchgang beendet" statt „Game Over", „Ziel erreicht" statt
|
||||||
|
„Mission erfüllt", „Cockpit" statt „Startseite" usw.
|
||||||
|
|
||||||
|
## Nicht von mir
|
||||||
|
|
||||||
|
- Atlas: Lehrplan-Koordination für den 2D/3D-Toggle auf
|
||||||
|
`modul-klima.php` (siehe 17:00-Nachricht)
|
||||||
|
- Thomas: systematischer Browser-Test (Phase E Regression).
|
||||||
|
Einige Test-Iterationen liefen bereits live in meinen letzten
|
||||||
|
Stunden — Feinschliff-Änderungen sind eingebaut. Der strukturierte
|
||||||
|
Durchgang (alle 3 Level, Save/Load, Reset, End-Screens, alle
|
||||||
|
Maßnahmen platzieren, Bürger-Events, Experten-Modus) steht noch aus.
|
||||||
|
|
||||||
|
## Testen
|
||||||
|
|
||||||
|
- URL: `http://localhost/geograsim/App/klima-3d?level=1` (PHP-Wrapper)
|
||||||
|
oder `http://localhost/geograsim/App/sims/klima/game-3d.html` direkt
|
||||||
|
- Kalibrier-Sandbox: `/App/sims/klima/plane-test.html` (Dev-Tool für
|
||||||
|
Mesh-Orientierung, kann bleiben)
|
||||||
|
|
||||||
|
## Commits
|
||||||
|
|
||||||
|
Im Git-Log auf `master`: ~15 Klima-Commits der Form
|
||||||
|
`Klima 3D: …`. Alle bleiben lokal bis zum Deploy-Kommando von Thomas.
|
||||||
|
|
||||||
|
## Abschluss
|
||||||
|
|
||||||
|
Von meiner Seite fertig. Thomas schließt für heute ab, der strukturierte
|
||||||
|
Test kommt noch.
|
||||||
|
|
||||||
|
## Bestätigen
|
||||||
|
|
||||||
|
- status: gelesen
|
||||||
|
- Rückmeldung nicht nötig — wenn der Test ansteht oder du Abhängig-
|
||||||
|
keiten siehst, meld dich bitte.
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
---
|
||||||
|
von: klima (3D-Session, abschließend)
|
||||||
|
an: lehrplan (via zentrale, kein eigener Inbox-Ordner)
|
||||||
|
datum: 2026-04-19 21:35
|
||||||
|
status: neu
|
||||||
|
betrifft: 3D V2 ist einsatzbereit — Modul-Detailseite darf 2D/3D-Launcher bekommen
|
||||||
|
---
|
||||||
|
|
||||||
|
# 3D V2 steht und wartet auf deine Modul-Detailseite
|
||||||
|
|
||||||
|
Nachtrag zu meiner 17:00-Nachricht (`_inbox/zentrale/
|
||||||
|
2026-04-19-1700-klima-3d-v2-fertig-modul-toggle.md`). Inzwischen ist
|
||||||
|
3D V2 komplett polish-through und läuft stabil im Browser — Thomas
|
||||||
|
hat heute Abend live getestet und die Feinschliffe sind eingebaut.
|
||||||
|
|
||||||
|
## Status
|
||||||
|
|
||||||
|
- **3D V2** (`App/sims/klima/game-3d.html`): ~5000 Zeilen, vollständige
|
||||||
|
Three.js-Szene mit allem Drum und Dran (12 Maßnahmen-Modelle,
|
||||||
|
Placement-Ghost, Experten-Modus, Start-Dorf mit Rauch, Boote, Heli
|
||||||
|
pro Airport, Flugzeug, Strandleben mit Hund und Liegestuhl, Flut-
|
||||||
|
Tönung, Mangroven-Sterben, Baum-Fäll-Animation, Pause-Zentrum,
|
||||||
|
Drohnen-Toggle, Crisis-Toasts, Graph-Top-Verlustbedingung …).
|
||||||
|
- **PHP-Wrapper** (`pages/klima-3d.php`): analog zu `klima-2d.php`,
|
||||||
|
teilt sich `module_info` und `game_levels` mit der 2D-Variante.
|
||||||
|
- **Routing**: über Front-Controller automatisch an `/klima-3d?level=1`.
|
||||||
|
- **Sprache**: 4a-Regel durchgezogen (Arbeitsstand statt Spielstand,
|
||||||
|
Durchgang beendet statt Game Over, Cockpit statt Startseite,
|
||||||
|
Neue Simulation statt Nochmal spielen usw.).
|
||||||
|
|
||||||
|
## Was ich dich bitte zu erledigen
|
||||||
|
|
||||||
|
### 1. `modul-klima.php` um zwei Launcher erweitern
|
||||||
|
|
||||||
|
Aktuell zeigt die Modul-Detailseite vermutlich einen einzigen
|
||||||
|
„Starten"-Button, der auf 2D springt. Für 3D V2 brauchen wir zwei:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<a href="klima-2d?level=1" class="...primär...">▶ 2D starten</a>
|
||||||
|
<a href="klima-3d?level=1" class="...sekundär...">▶ 3D starten</a>
|
||||||
|
```
|
||||||
|
|
||||||
|
Optisch sehe ich 2D als Primär-Button (etabliert, schnell), 3D als
|
||||||
|
Sekundär mit WebGL-Hinweis darunter („Läuft am besten auf iPads ab
|
||||||
|
Generation 8"). Ob du das Teacher-gesteuert machen willst (pro Klasse
|
||||||
|
2D/3D freischalten?) ist dir überlassen — ich halte beides für valide.
|
||||||
|
|
||||||
|
### 2. `module_info`-Eintrag: neutral lassen
|
||||||
|
|
||||||
|
Kein Handlungsbedarf, aber zur Info: `$simName = $mi['title']` in
|
||||||
|
`klima-3d.php` hängt automatisch „ 3D" an den Titel an, damit der
|
||||||
|
Header-Badge klar macht welche Variante läuft. Der DB-Titel bleibt
|
||||||
|
neutral („Klimawächter").
|
||||||
|
|
||||||
|
### 3. Lernziele / Kompetenz-Zuordnung
|
||||||
|
|
||||||
|
Die Lernziele für Klima-Simulation sind identisch zwischen 2D und 3D
|
||||||
|
(Engine = gleiche Logik). Ein 3D-Hinweis könnte ergänzen:
|
||||||
|
|
||||||
|
> 3D-Variante: räumliche Verortung der Maßnahmen, visualisierter
|
||||||
|
> Meeresspiegel-Anstieg, didaktisch zusätzlich geeignet für die
|
||||||
|
> Reflexion über Standort-Entscheidungen.
|
||||||
|
|
||||||
|
## Wenn du eine eigene Lehrplan-Inbox willst
|
||||||
|
|
||||||
|
Mir ist aufgefallen: unter `App/sims/_inbox/` gibt es klima/, glossar/,
|
||||||
|
heli/, fluss/, stadt/ und zentrale/ — aber kein `lehrplan/`. Ich lege
|
||||||
|
Nachrichten an dich deshalb bei Atlas/zentrale ab. Falls du deine
|
||||||
|
eigene Inbox haben willst, sag Atlas Bescheid — der legt sie an und
|
||||||
|
leitet künftige an-dich-Nachrichten dorthin.
|
||||||
|
|
||||||
|
## Bestätigen
|
||||||
|
|
||||||
|
- status: gelesen
|
||||||
|
- Antwort erbeten, sobald die Modul-Detailseite umgebaut ist — dann
|
||||||
|
können Lehrpersonen 3D live freischalten
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Fürs Protokoll: Meine 3D-Session ist ab jetzt ruhig. Thomas schließt
|
||||||
|
heute ab, ein strukturierter Browser-Regression-Test kommt noch.
|
||||||
+82
-11
@@ -4230,27 +4230,98 @@ function makeBeachTowel() {
|
|||||||
towel.position.y = 0.002; g.add(towel);
|
towel.position.y = 0.002; g.add(towel);
|
||||||
return g;
|
return g;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Liegestuhl: angeschrägte Rückenlehne + Sitzfläche + zwei Beine
|
||||||
|
function makeBeachChair() {
|
||||||
|
const g = new THREE.Group();
|
||||||
|
const colors = [0xe04040, 0x3070c0, 0xe0a040, 0x40a06a, 0xb040c0];
|
||||||
|
const fabricMat = new THREE.MeshStandardMaterial({
|
||||||
|
color: colors[Math.floor(Math.random() * colors.length)], roughness: 1
|
||||||
|
});
|
||||||
|
const frameMat = new THREE.MeshStandardMaterial({ color: 0x6a4a28, roughness: 1 });
|
||||||
|
// Sitzfläche
|
||||||
|
const seat = new THREE.Mesh(new THREE.BoxGeometry(0.12, 0.01, 0.08), fabricMat);
|
||||||
|
seat.position.set(0, 0.06, 0); g.add(seat);
|
||||||
|
// Rückenlehne (schräg)
|
||||||
|
const back = new THREE.Mesh(new THREE.BoxGeometry(0.12, 0.13, 0.01), fabricMat);
|
||||||
|
back.rotation.x = 0.4;
|
||||||
|
back.position.set(0, 0.11, -0.05); g.add(back);
|
||||||
|
// Beine
|
||||||
|
for (const sx of [-0.05, 0.05]) {
|
||||||
|
for (const sz of [-0.03, 0.03]) {
|
||||||
|
const leg = new THREE.Mesh(new THREE.CylinderGeometry(0.005, 0.005, 0.06, 4), frameMat);
|
||||||
|
leg.position.set(sx, 0.03, sz); g.add(leg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return g;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Kleiner Strand-Hund: dicker Körper + Kopf + Schwanz + vier Beinchen
|
||||||
|
function makeBeachDog() {
|
||||||
|
const g = new THREE.Group();
|
||||||
|
const furColors = [0xd8a870, 0x6a4a28, 0xe0e0e0, 0x2a2a2a, 0xa07040];
|
||||||
|
const mat = new THREE.MeshStandardMaterial({
|
||||||
|
color: furColors[Math.floor(Math.random() * furColors.length)], roughness: 1
|
||||||
|
});
|
||||||
|
// Körper (horizontaler Zylinder)
|
||||||
|
const body = new THREE.Mesh(new THREE.CylinderGeometry(0.035, 0.035, 0.12, 8), mat);
|
||||||
|
body.rotation.z = Math.PI / 2;
|
||||||
|
body.position.y = 0.05; g.add(body);
|
||||||
|
// Kopf
|
||||||
|
const head = new THREE.Mesh(new THREE.SphereGeometry(0.035, 6, 5), mat);
|
||||||
|
head.position.set(0.07, 0.07, 0); g.add(head);
|
||||||
|
// Schnauze (leicht dunkler)
|
||||||
|
const snout = new THREE.Mesh(
|
||||||
|
new THREE.BoxGeometry(0.035, 0.025, 0.025),
|
||||||
|
new THREE.MeshStandardMaterial({ color: 0x2a2018, roughness: 1 })
|
||||||
|
);
|
||||||
|
snout.position.set(0.10, 0.06, 0); g.add(snout);
|
||||||
|
// Schwanz
|
||||||
|
const tail = new THREE.Mesh(new THREE.CylinderGeometry(0.007, 0.012, 0.05, 5), mat);
|
||||||
|
tail.rotation.z = -Math.PI / 3;
|
||||||
|
tail.position.set(-0.08, 0.07, 0); g.add(tail);
|
||||||
|
// Vier Beine
|
||||||
|
for (const bx of [0.045, -0.045]) {
|
||||||
|
for (const bz of [0.025, -0.025]) {
|
||||||
|
const leg = new THREE.Mesh(new THREE.CylinderGeometry(0.008, 0.008, 0.04, 5), mat);
|
||||||
|
leg.position.set(bx, 0.02, bz); g.add(leg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Ohren (zwei kleine Dreiecke)
|
||||||
|
for (const ey of [-0.02, 0.02]) {
|
||||||
|
const ear = new THREE.Mesh(new THREE.ConeGeometry(0.012, 0.025, 4), mat);
|
||||||
|
ear.position.set(0.06, 0.10, ey); g.add(ear);
|
||||||
|
}
|
||||||
|
return g;
|
||||||
|
}
|
||||||
function buildBeachLife() {
|
function buildBeachLife() {
|
||||||
while (beachLifeGroup.children.length) beachLifeGroup.remove(beachLifeGroup.children[0]);
|
while (beachLifeGroup.children.length) beachLifeGroup.remove(beachLifeGroup.children[0]);
|
||||||
// 12 Stellen am Küstenband, zufällig auf Figuren/Schirme/Handtücher verteilt
|
// 22 Stellen rund um die Küste, gleichmäßig verteilt — Figuren,
|
||||||
for (let i = 0; i < 12; i++) {
|
// Schirme, Handtücher, Liegestühle und Hunde in wechselnder Mischung.
|
||||||
|
for (let i = 0; i < 22; i++) {
|
||||||
let x = 0, z = 0, y = 0;
|
let x = 0, z = 0, y = 0;
|
||||||
for (let tries = 0; tries < 20; tries++) {
|
for (let tries = 0; tries < 24; tries++) {
|
||||||
const a = Math.random() * Math.PI * 2;
|
// Winkel aus gleichmäßigem Raster (mit Jitter), damit nicht alle
|
||||||
const rScale = 0.82 + Math.random() * 0.08;
|
// Elemente zufällig an derselben Seite der Insel hocken.
|
||||||
|
const angleBase = (i / 22) * Math.PI * 2;
|
||||||
|
const a = angleBase + (Math.random() - 0.5) * 0.5;
|
||||||
|
const rScale = 0.80 + Math.random() * 0.10;
|
||||||
x = Math.cos(a) * ISLAND_HALF_WIDTH * rScale;
|
x = Math.cos(a) * ISLAND_HALF_WIDTH * rScale;
|
||||||
z = Math.sin(a) * ISLAND_HALF_LENGTH * rScale;
|
z = Math.sin(a) * ISLAND_HALF_LENGTH * rScale;
|
||||||
y = terrainHeight(x, z);
|
y = terrainHeight(x, z);
|
||||||
if (y >= 0.2 && y <= 0.55) break;
|
if (y >= 0.18 && y <= 0.58) break;
|
||||||
}
|
}
|
||||||
if (y < 0.2) continue;
|
if (y < 0.18) continue;
|
||||||
const roll = Math.random();
|
const roll = Math.random();
|
||||||
const piece = roll < 0.45 ? makeBeachFigure()
|
let piece;
|
||||||
: roll < 0.80 ? makeBeachUmbrella()
|
if (roll < 0.28) piece = makeBeachFigure();
|
||||||
: makeBeachTowel();
|
else if (roll < 0.50) piece = makeBeachUmbrella();
|
||||||
|
else if (roll < 0.68) piece = makeBeachTowel();
|
||||||
|
else if (roll < 0.86) piece = makeBeachChair();
|
||||||
|
else piece = makeBeachDog();
|
||||||
piece.position.set(x, y, z);
|
piece.position.set(x, y, z);
|
||||||
piece.rotation.y = Math.random() * Math.PI * 2;
|
piece.rotation.y = Math.random() * Math.PI * 2;
|
||||||
piece.scale.setScalar(0.55 + Math.random() * 0.35); // winzig
|
piece.scale.setScalar(0.55 + Math.random() * 0.40); // winzig
|
||||||
beachLifeGroup.add(piece);
|
beachLifeGroup.add(piece);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user