diff --git a/App/sims/_inbox/glossar/2026-04-19-2130-klima-3d-v2-info-topics.md b/App/sims/_inbox/glossar/2026-04-19-2130-klima-3d-v2-info-topics.md new file mode 100644 index 0000000..5d784b8 --- /dev/null +++ b/App/sims/_inbox/glossar/2026-04-19-2130-klima-3d-v2-info-topics.md @@ -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. diff --git a/App/sims/_inbox/klima/_status.md b/App/sims/_inbox/klima/_status.md index cf619a8..6dc7ce8 100644 --- a/App/sims/_inbox/klima/_status.md +++ b/App/sims/_inbox/klima/_status.md @@ -1,91 +1,105 @@ --- instanz: klima -zuletzt_aktualisiert: 2026-04-19 17:00 -session_id: 3d-v2-ausbau +zuletzt_aktualisiert: 2026-04-19 21:30 +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 (ältere Session) -- **Schritt 2 — 2D auf Engine umstellen:** DONE (ältere Session) -- **Schritt 3 — 3D V2 bauen:** DONE (`App/sims/klima/game-3d.html`) +- **Schritt 1 — Engine extrahieren:** DONE (frühere Session) +- **Schritt 2 — 2D auf Engine umstellen:** DONE (frühere Session) +- **Schritt 3 — 3D V2 bauen:** DONE (`App/sims/klima/game-3d.html`, ~5000 Z.) - **Schritt 4 — `pages/klima-3d.php`:** DONE -- **Schritt 5 — `module_info` 2D/3D-Toggle:** Nachricht an Atlas/Lehrplan - raus (`_inbox/zentrale/2026-04-19-1700-klima-3d-v2-fertig-modul-toggle.md`) +- **Schritt 5 — `module_info` 2D/3D-Toggle via Lehrplan:** Anfrage raus + (`_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 - 0.155.0 rein, `
` mit grid-column 1/-1. -- **B — Szene:** Terrain als Höhenfeld (90×120-Plane, Vertex-Farben - Strand/Wiese/Wald/Fels), Vulkan als Lathe-Dome + Schnee-Kappe mit - Clipping-Plane für Schmelze, Ozean-Plane steigt mit state.seaLevelCm, - Himmel-Halbkugel, Ambient + DirectionalLight. Kamera per Kugel- - koordinaten + Eigenbau-Orbit (Drag, Scroll, Pfeiltasten, Auto-Drohne - mit 4 s Idle-Resume). -- **C — 12 Mesh-Factories:** Wald, Solar, Wind, Gründach, Deich, - Seawall, Kohle, Flughafen (2x Scale, Heli-Pad schwarz mit H), - Wolken-Impfung, Radwege, Mangrove, Sand-Aufschüttung (breite Strand- - Plattform). Windräder animiert (rotorRef.rotation.z = tNow * 1.4). -- **D — Placement-Ghost + Raycaster:** Zone-Overlay grün - (ShaderMaterial mit RGBA-Vertex-Farben), Küsten-Ausrichtung für - Deich/Seawall/Mangrove/Sand/Bikes, Ketten-Bau (Placement bleibt - nach Confirm offen), ESC / Rechtsklick / „Bau beenden"-Card verlassen. +- Wolken als Dunst auf Vulkan-Höhe, fünf Stück mit breit gestreuten + Größen/Opazitäten/Geschwindigkeiten +- Airport-Plateau schmaler (2.55×1.25, entlang der Runway zentriert) +- Pro Flughafen eigener Heli + Flugzeug (`airportVehicles`-Map), + Heli landet exakt auf dem schwarzen H-Pad, macht alle ~3 Zyklen + deterministisch eine größere Runde um den Vulkan +- Flugzeug: korrekte Orientierung via `plane-test.html` kalibriert, + Runway läuft parallel zur Küste (`coastRotation`), Anflug und + Start fliegen seitlich am Vulkan vorbei, Runway-Höhe so angepasst + dass Räder auf Asphalt stehen (0.78 statt 0.50) +- Flugzeug-Zyklus: Park → Takeoff → Climb mit Banking → Flugrunde + unsichtbar → Approach aus +X mit Banking → Landing → Wenden → + Parken (bleibt zwischen Flügen sichtbar auf der Bahn) +- Pause-Zentrum: großer ▶-Button in der Szene bei Speed 0 +- Drohnen-Toggle 🚁 im Header (Auto-Kamera ein/aus) +- 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 - 8 s → steigt wieder auf (36 s-Zyklus). -- Drei Boote + Yacht: Fischerboot patrouilliert vorne, Tanker + kleines - Segelboot queren hinten, größere Yacht vorne — alle mit korrekten - Bug-Richtungen. -- Start-Dorf: 10 Haus-Positionen, sichtbar ~ ceil(population/800), - Rauchfäden proportional zu (1 − renewablePower/demand). -- Vulkan-Schutzwall (citizen-mountain-Event): Halbring aus 9 Fels- - Blöcken am Vulkanfuß, erscheint via `state.hasMountainShield`. -- Mangroven sterben grau ab 30 cm Meeresspiegel (Material-Tint). -- Radwege verlaufen am Küstenband (Terrain-Höhe 0.32–0.62, parallel). -- Toast-Cap bei 6: älteste fliegt raus wenn 7. kommt. -- End-Screen-Buttons: "Weiter arbeiten / Neue Simulation / Zurück zum - Cockpit". `startFreshSimulation()` räumt Save + startet ohne Reload. -- Experten-Modus: 👨‍🔬-Button im Header, Cursor → help, Klick auf Objekt - öffnet INFO_TOPICS-Karte. 17 neue Info-Einträge (alle Maßnahmen + - Umgebung: Insel, Ozean, Vulkan, Tanker, Segelboot, Fischerboot, Heli, - Dorf, Schutzwall). -- Sprachregel 4a durchgeführt: „Spielstand" → „Arbeitsstand", - "spielen" → "laufen lassen", "pleite" → "Budget aufgebraucht", - "Mission gescheitert" → "Ziel nicht erreicht", "Nochmal spielen" - → "Neue Simulation", "Startseite" → "Cockpit". +- Ketten-Bau: nach jedem Placement bleibt der Bau-Modus aktiv, solange + Budget reicht; ESC / Rechtsklick / "Bau beenden"-Karte beenden +- Zone-Overlay grün bei Platzierung (ShaderMaterial mit RGBA-Vertex-Alpha) +- Küsten-parallele Ausrichtung für Deich/Seawall/Mangrove/Sand/Bikes +- Radwege: snappen an bestehende, Mittellinie durchgehend (ein Box- + Streifen + 8 % Überlappung beim Spacing), Position im Beach→Meadow-Band +- Sand-Aufschüttung: reiner Lathe-Kegel (kleiner), nicht mehr Plattform +- Experten-Modus 👨‍🔬 im Header: Klick auf Objekt → Info-Card aus 17 + neu eingebauten `INFO_TOPICS`-Einträgen +- Graph-Top = Durchgang verloren (CO₂ ≥ 700 oder 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" (saubere Sprachregel) +- Gründach-Kauf löst Toast mit Wohnraum-Erklärung aus +- Solaranlage-Kauf zeigt Stromleistung + Wartungskosten +- Drei Start-Bäume werden beim Level-Start vor-gesetzt, bei + Stromausfall von der Engine gefällt → sichtbare Animation +- Toast-Cap bei 6 im Event-Viewport +- Sprachregel 4a systematisch in `game-3d.html` durchgezogen +- Musik-Reset auf Default-Track bei jedem Level-Start (kein Drama-Leck + aus vorherigem Durchgang) -## Zuletzt geänderte Dateien +### Technisch -- `App/sims/klima/game-3d.html` (umfangreich erweitert, ~4800 Z.) -- `App/pages/klima-3d.php` (neu) -- `App/sims/_inbox/zentrale/2026-04-19-1700-klima-3d-v2-fertig-modul-toggle.md` - (neu, an Atlas + Lehrplan) +- `airportLocalToWorld` Vorzeichen an Three.js-Konvention korrigiert +- Neue Datei `App/sims/klima/plane-test.html` als Kalibrier-Sandbox + (kann bleiben als Dev-Tool) -## Noch offen +## Dateien dieser Session -- **Phase E Browser-Regression** — muss Thomas machen; meine Seite ist - statisch komplett, die 8 Tests aus Handover + 3D-Spezifisches - (Kamera-Orbit, alle 12 Meshes platzieren, Save/Load mit 3D-Positionen, - V1 unberührt) fehlen noch. Nach erstem Test-Durchgang kommen - vermutlich Feinschliff-Iterationen — dann weiter in dieser Inbox. -- **Lehrplan:** wartet auf Antwort, sobald `modul-klima.php` den - 2D/3D-Toggle zeigt. +- `App/sims/klima/game-3d.html` (~5000 Z., umfangreich erweitert) +- `App/sims/klima/plane-test.html` (neu, Dev-Sandbox) +- `App/pages/klima-3d.php` (neu, PHP-Wrapper) +- `App/sims/_inbox/zentrale/` — mehrere Status-Nachrichten -## Offene Entscheidungen +## Commits in dieser Session -Keine. Alle drei Entscheidungen aus Phase-A-Plan sind durch: -OrbitControls-Eigenbau, Alt-Save-Fallback via pickBuildPosition, -Session-Split nach C (nicht nötig — in einer Session geschafft). +~15 Klima-3D-Commits auf `master` (Phase A-D + Feinschliff + Ambient- +Ausbau + Sprachregel + Polish). Alle gepusht, git log hat die Kette. + +## 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 -Keine. +Keine. 3D V2 ist einsatzbereit. diff --git a/App/sims/_inbox/zentrale/2026-04-19-2130-klima-3d-v2-abschluss.md b/App/sims/_inbox/zentrale/2026-04-19-2130-klima-3d-v2-abschluss.md new file mode 100644 index 0000000..27dfb8d --- /dev/null +++ b/App/sims/_inbox/zentrale/2026-04-19-2130-klima-3d-v2-abschluss.md @@ -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. diff --git a/App/sims/_inbox/zentrale/2026-04-19-2135-klima-3d-v2-lehrplan-nachtrag.md b/App/sims/_inbox/zentrale/2026-04-19-2135-klima-3d-v2-lehrplan-nachtrag.md new file mode 100644 index 0000000..acb176e --- /dev/null +++ b/App/sims/_inbox/zentrale/2026-04-19-2135-klima-3d-v2-lehrplan-nachtrag.md @@ -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 +▶ 2D starten +▶ 3D starten +``` + +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. diff --git a/App/sims/klima/game-3d.html b/App/sims/klima/game-3d.html index 295b45a..b5f1c7a 100644 --- a/App/sims/klima/game-3d.html +++ b/App/sims/klima/game-3d.html @@ -4230,27 +4230,98 @@ function makeBeachTowel() { towel.position.y = 0.002; g.add(towel); 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() { while (beachLifeGroup.children.length) beachLifeGroup.remove(beachLifeGroup.children[0]); - // 12 Stellen am Küstenband, zufällig auf Figuren/Schirme/Handtücher verteilt - for (let i = 0; i < 12; i++) { + // 22 Stellen rund um die Küste, gleichmäßig verteilt — Figuren, + // Schirme, Handtücher, Liegestühle und Hunde in wechselnder Mischung. + for (let i = 0; i < 22; i++) { let x = 0, z = 0, y = 0; - for (let tries = 0; tries < 20; tries++) { - const a = Math.random() * Math.PI * 2; - const rScale = 0.82 + Math.random() * 0.08; + for (let tries = 0; tries < 24; tries++) { + // Winkel aus gleichmäßigem Raster (mit Jitter), damit nicht alle + // 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; z = Math.sin(a) * ISLAND_HALF_LENGTH * rScale; 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 piece = roll < 0.45 ? makeBeachFigure() - : roll < 0.80 ? makeBeachUmbrella() - : makeBeachTowel(); + let piece; + if (roll < 0.28) piece = makeBeachFigure(); + 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.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); } }