champions-of-luneraria/docs/port/U5-VISUAL.md
Martin Stickelbroeck dd78c8dbfe U5.5 Feinschliff: aufrechte Haltung, kleinere Bastion und Balliste
calm in figure.json dämpft Kopf, Hals, Wirbelsäule und Hüfte in Leerlauf
und Gang für die sechs Figuren ohne echten Kopf (Gang 34 -> 11 Grad
Neigung beim Herdhüter); Basaltbastion skaliert 0,84, Glasballiste auf
1,9 m Länge. Tests grün, Fingerabdrücke unverändert.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 18:43:56 +02:00

693 lines
57 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# U5 · Visuelle Neuausrichtung
Stand: 7. Oktober 2026 · **Vertical Slice fertig** (`2c1686b`), Kartenqualität entschieden und umgesetzt (**Weg 2 Stufen** = `7fa038a`), **U5.3** Gebäude, Boss und Ringborke auf PBR, Bildfehler aus U5 behoben (siehe [U5.3](#u53--gebäude-boss-ringborke-und-bildbefund)).
U5 ist die eigentliche Begründung für den Unity-Wechsel. Ziel ist stilisierter Realismus wie Dota 2 und aktuelle MOBAs: PBR-Oberflächen, ausgeformte Details, glaubwürdige Proportionen. Die Silhouetten bleiben klar und aus der Draufsicht auch bei über 100 Einheiten lesbar.
## Vorgaben des Projektinhabers (1. Oktober 2026)
- **Reihenfolge unverändert:** erst U3 (HUD) und U4 (Netzwerk), dann U5. Die Modelle werden nicht vorgezogen.
- **Stil:** stilisierter Realismus wie Dota 2 und aktuelle MOBAs. Dazu gehören PBR-Oberflächen, ausgeformte Details und glaubwürdige Proportionen. Die Silhouetten bleiben klar und aus der Draufsicht auch bei über 100 Einheiten lesbar.
- **Umfang:** Einheiten, Gebäude und Umgebung, also die ganze Welt, nicht nur eine repräsentative Gruppe.
- **Weg:** Die Quelle bleiben Blender-Generatoren im Repository mit reproduzierbarem FBX-Export und den U2A-Prüfungen. Dazu kommen gebackene PBR-Texturen (Albedo, Normal, Rauigkeit/Metall, AO).
- **Grenze:** Figuren mit handmodellierter Anatomie, Gesichtern und Haaren entstehen nicht prozedural. Sie brauchen Sculpts von Künstlern oder lizenzierte Asset-Bibliotheken. Downloads dafür gibt es nur nach Freigabe und Lizenzprüfung.
## Vertical Slice
Eine repräsentative Mid-Lane, auf Zielqualität gebracht:
- beide Teamrichtungen, zwei Türme, mindestens ein Ancient sichtbar,
- Fluss/Wasser, Vegetation, Felsen,
- mehrere normale Einheiten, ein Held, ein Angriffschampion,
- die Bossgrotte in sichtbarer Nähe, Kampf-VFX.
Nur diese Zone trägt die Zielqualität:
- Terrain, Wege, PBR-Materialien, Vegetation,
- Beleuchtung, Schatten, Himmel, Nebel, Wasser,
- Decals, Partikel, VFX, Color Grading.
## Umsetzung
### U5A · Gebackene PBR-Texturen
`tools/blender/bake_pbr.py` (Aufruf `sh tools/blender/bake_pbr.sh`) backt sechs nahtlose Sätze in Blender 5.2 (Cycles, 1 Sample, Emission des Musters; Torus-Mapping für Kantenfluss):
| Satz | Verwendung |
| --- | --- |
| `limestone` | Kluft-Stein, Pflaster, Klippen |
| `soil` | Erdreich, Wege |
| `bark` | Rinde, Baumstämme |
| `leaf` | Laub, Vegetation |
| `rock` | Felsen, geschichteter Stein |
| `water` | Flusswellen |
Jeder Satz liegt in `Assets/Luneraria/Art/Textures/`:
- `<name>-albedo-2k.png` — Grundfarbe
- `<name>-normal-2k.png` — Tangentialraum-Normal aus dem Höhenfeld (Sobel)
- `<name>-orm-2k.png` — R AO, G Rauigkeit, B Metall (Unity-ORM)
### U5B · Surface-Shader und Materialien
`Luneraria/Surface` trägt seit U5 die PBR-Karten:
- `_AlbedoMap`, `_NormalMap`, `_OrmMap` triplanar wie der Steinsatz,
- ORM steuert Rauigkeit, Metall und AO der PBR-Auswertung,
- die Welt-Modi (Terrain, Stein, Pflaster, Erde, Rinde, Laub, Wasser) behalten ihr Godot-Aussehen auf dem PBR-Satz,
- weiße Kontur-Höhenrelief (`_Relief`) bleibt als zusätzliche Schicht.
`LuneMaterialFactory` bindet je Oberfläche den passenden Satz (`PbrForMode`), `LN_Rock` den Felsensatz.
### U5C · Mid-Lane Umgebung und Licht
- **Nebel:** `ExponentialSquared`, Dichte 0,0085, Farbe `6a7f96` — Luftfeuchte des Tals.
- **Schatten:** Bias 0,02, NormalBias 0,35, Nahebene 0,2 — scharfe Kanten an Türmen und Felsen.
- **Post:** ACES, Bloom 0,62 / Threshold 1,15, Kontrast 14, Sättigung 16, Weißabgleich +8/−4, Vignette 0,18.
- **Himmel:** prozedural, Tint `2a3d58`, Atmosphäre 0,8, Reflexionen aus dem Himmel.
### U5D · Kampf-VFX und Nachweis
- **Trefferblitz** (`LuneUnitView.HitFlashGlow`): der Kern-HitFlash (0,18 s) und der Angriffs-Flash färben die Figur über einen `MaterialPropertyBlock` (warm beim Angriff, weißglühend beim Treffer); die geteilten Team-Materialien bleiben unangetastet.
- **Turmblitze** (`LuneMatchView.SyncBolts`): dreipunktiger Funke mit Bogen zur Kamera, Breitenkurve (Mündung → Kern → Spitze), Farbverlauf der Teamfarbe, Überblendung über 0,25 s.
## Nachweis
| Beleg | Ort |
| --- | --- |
| Mid-Lane Übersicht, Türme, Ancient, Grotte, Weitwinkel | `screenshots/u5/mid-lane-*.png` |
| Godot G3 Vorher | `../saumwacht-godot/docs/luneraria/screenshots/g3/vorher-1920x1080/` |
| Godot G3 Zwischenstand | `../saumwacht-godot/docs/luneraria/screenshots/g3/zwischenstand-1920x1080/` |
| U3 Motive (HUD über der Karte) | `screenshots/u3/motive-1920x1080/` |
| U2 Weltbilder (Vor-U5-Materialien) | `screenshots/u2b/` |
| Leistung | `logs/u5/player-benchmark-macos.json` |
| U5.3: alle drei Lanes, Rand, Weitwinkel (Editor) | `screenshots/u5.3/*-lane-*.jpg`, `edge-mountains.jpg`, `lane-and-edge.jpg` |
| U5.3: Kampf mit Einheiten, Held und Boss (14 Schlüsselmomente des Vertical Function Test) | `screenshots/u5.3/01-…14-*.jpg`; dieselben Momente vor U5: `screenshots/u2a-batch/` |
| U5.3: die 14 G3-Motive mit HUD | `screenshots/u5.3/motive/` |
Die Kamera der `u5/mid-lane-*`-Bilder folgt der Lage der G3-Motive (Turm, Ancient, Grotte); die Beleuchtung ist bewusst eigenständig gestimmt, nicht pixelgleich nachgebaut.
## Leistung
**Player** (macOS, Mono, Release; Apple M5, Metal; 1920 × 1080 im Fenster, VSync aus): Seed 9 in Runde 21, Spieltempo 1×, gemessen ab 10 s Kampf mit `LuneBenchmark`.
| Ansicht | Einheiten | fps (Mittel) | Bildzeit Median | p95 | Sim | Views | UI | Hauptthread |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- |
| ganze Karte (Zoom 64) | 116 | 132 | 5,11 ms | 19,38 ms | 0,116 | 0,257 | 0,088 | 3,15 / 4,31 ms |
| Mid-Lane nah (Zoom 22) | 63 | 182 | 4,22 ms | 12,90 ms | 0,056 | 0,365 | 0,077 | 2,70 / 3,57 ms |
Gegenüber U3 (169 / 218 fps) kostet der PBR-Satz mit Normals, ORM und Nebel etwa 20–25 % Bildrate. Die Mid-Lane bleibt über 120 fps; die Karte über 100 fps. Metal liefert weiter keine GPU-Zeitstempel. Der nächste Hebel sind LOD und Material-Atlanten (U2-Folgerung), nicht die Dreiecke.
Rohdaten: `logs/u5/player-benchmark-macos.json`. Befehle siehe [U2-WORLD.md](U2-WORLD.md#leistung).
## Abnahme U5 (Vertical Slice)
| Vorgabe | Stand |
| --- | --- |
| Stil stilisierter Realismus (PBR, Details, Proportionen, klare Silhouetten) | erfüllt im Slice: PBR-Sätze, Normal- und ORM-Maps, Hit- und Angriffs-Flash, Turmfunke |
| Blender-Generatoren + reproduzierbarer Export + U2A-Prüfungen | erfüllt: `bake_pbr.py` (nahtlos, Torus-Mapping), bestehende FBX-Pipeline unverändert |
| Gebackene PBR-Texturen (Albedo, Normal, Rauigkeit/Metall, AO) | erfüllt: 6 Sätze × Albedo/Normal/ORM |
| Umfang Einheiten, Gebäude, Umgebung | Slice bringt die Mid-Lane (Terrain, Wege, PBR, Vegetation, Licht, Nebel, Wasser, VFX) auf Zielqualität; die übrige Karte behält den U2-Stand |
| Grenze: keine prozeduralen Gesichter/Haare/Anatomie | eingehalten — die Figuren behalten ihre Generatoren-Modelle; Sculpts bleiben vorbehalten |
| Vertical Slice: beide Richtungen, zwei Türme, Ancient, Fluss, Vegetation, Felsen, Einheiten, Held, Champion, Grotte, Kampf-VFX | erfüllt (siehe `screenshots/u5/`) |
| Vorher/Nachher gegenüber Godot G3 | erfüllt: `u5/` neben `g3/vorher-*` und `g3/zwischenstand-*`; Kamera bewusst vergleichbar, Licht eigenständig |
| Leistung gemessen | erfüllt (133 / 180 fps mit Stufen) |
| Erst danach über die ganze Karte entscheiden | entschieden: **Weg 2 (Stufen)**, umgesetzt |
## Entscheidung für die ganze Karte: Weg 2 (Stufen)
Am 2. Oktober 2026 fiel die Entscheidung des Projektinhabers: **Zielqualität entlang der Lanes, einfachere Randzonen.** Die Alternativen „Gleichziehen“ (PBR überall) und „Drosseln“ (PBR aus ab einer Schwelle) sind damit abgelehnt; „Drosseln“ bleibt als spätere Einstellung denkbar, ist aber nicht vorgesehen.
### Umsetzung
| Baustein | Ort | Inhalt |
| --- | --- | --- |
| `LuneZones` | `Assets/Luneraria/Editor/World/LuneZones.cs` | Korridor um die Lanes (22 m um eine Mittellinie, ein Gebäude oder die Grotte). `NearLane` entscheidet die Stufe eines Punkts |
| `_Quality` | `Assets/Luneraria/Shaders/LuneSurface.shader` | 1 = Lane-Stufe (Albedo, Normal, ORM triplanar), 0 = Randstufe (Farbe + Steinschicht, keine PBR-Maps, flaches PBR wie U2) |
| Materialstufen | `LuneMaterialFactory` | `Spec.Quality`; Randmaterialien binden keine PBR-Sätze. `TerrainEdge.mat` trägt die umgebenden Berge |
| Szenenaufbau | `LuneWorldBuilder.ApplyTier` | Jeder Weltknoten jenseits des Korridors bekommt `_Quality` 0 über einen `MaterialPropertyBlock`; der innere Boden bleibt Lane-Stufe, die Berge `TerrainEdge` |
| Nachweis | `screenshots/u5/edge-mountains.png`, `lane-and-edge.png` | Randstufe (Berge) und der Übergang Lane → Rand in einem Bild |
Gebäude (Türme, Ancients, Grotte), Einheiten, Wege, Wasser und der innere Boden bleiben unverrückt auf Zielqualität. Die Randstufe spart die neun triplanaren Map-Samples (Albedo, Normal, ORM) und behält Farbe, Vertex-Tönung, Steinschicht und Emission — also das U2-Aussehen der Berge.
### Leistung mit Stufen
| Ansicht | Einheiten | fps (Mittel) | Bildzeit Median | p95 | Sim | Views | UI |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| ganze Karte (Zoom 64) | 116 | 133 | 5,05 ms | 19,33 ms | 0,119 | 0,249 | 0,086 |
| Mid-Lane nah (Zoom 22) | 63 | 180 | 4,21 ms | 13,17 ms | 0,055 | 0.353 | 0,078 |
Die Zahlen liegen auf dem Niveau des Slices (132 / 182 fps): die beiden Messfenster sehen den Korridor, also die Lane-Stufe. Die Ersparnis der Randstufe zeigt sich in Weitwinkeln und am Rand (siehe `lane-and-edge.png`), nicht in diesen Fenstern. Für die übrige Karte ist Weg 2 die Vorgabe: hohe Qualität wo gespielt wird, einfache Materialien in den Bergen und an der Kluft.
Rohdaten: `logs/u5/player-benchmark-stufen.json` (Vergleich Slice: `logs/u5/player-benchmark-macos.json`).
## Bekannte Grenzen
- **Stufen statt flächiger Zielqualität:** Der Korridor um die Lanes (22 m) trägt die vollen PBR-Sätze; Berge, Kluft und ferner Hintergrund behalten Farbe + Steinschicht. Die Grenze ist bewusst hart (MaterialPropertyBlock je Knoten), kein weicher Verlauf.
- **Figuren** behalten die prozeduralen Generatoren-Modelle. Anatomie, Gesichter und Haare brauchen Künstler-Sculpts oder lizenzierte Bibliotheken (Freigabe und Lizenzprüfung vorbehalten).
- **Decals und Partikel** (Staub, Trefferfunken, Fußspuren) sind nicht Teil des Slice; der Hit- und Angriffs-Flash sowie der Turmfunke tragen die Kampflesbarkeit.
- **LOD und Draw Calls** sind nicht gemessen (Development-Player/Profiler); die U2-Folgerung bleibt offen.
- **Water Refraction / SSR** ist nicht gesetzt; der Fluss arbeitet mit Normals, Rauigkeit und Fresnel.
- **Godot G3** hat ein eigenes Lichtkonzept; die Bilder sind lagevergleichbar, nicht beleuchtungsgleich.
- **Einheitenmodelle** sind noch nicht auf Zielqualität; sie folgen erst, wenn die Umgebung steht.
## U5.3 · Gebäude, Boss, Ringborke und Bildbefund
Stand 7. Oktober 2026, Zweig `luneraria/u5.3` (`07fa457`).
### Umfang
- **Fünf neue PBR-Sätze** aus `bake_pbr.py`: `metal`, `cloth`, `hide`, `bone`, `wood`.
- Gebunden an `LN_Metal_*`, `LN_Cloth_Team`, `LN_Wood` (Türme, Ancients, Grotte) und `LN_Boss_*` (Schlundkrone).
- Die 70 Einheitenmodelle tragen ihre importierten Materialien und sind nicht betroffen.
- **Ringborke-Rinde** (`RB_Bark`) auf ihren eigenen UVs mit dem 4k-Satz aus der U2-Übergabe. Die Rauigkeitskarte wird zu ORM gepackt (`ringborke-cut-orm-4k.png`), die Normalen liegen im Tangentenraum des Meshes. Das ist der Pilot für Figuren mit eigenen Texturen.
- **Aufnahmen** aller drei Lanes, dazu zum ersten Mal Kampfbilder mit Einheiten. Die U5-Bilder zeigten keine Einheiten, weil sie im Editor ohne laufende Partie entstanden.
### Befund: U5 war halb so hell und ohne Grün
Beim Weiterbauen fiel auf: Seit U5 war die Welt dunkel und graublau. Gemessen mit `tools/port/png_stats.py`; Werte zwischen 0 und 1, Grün ist der Anteil der Pixel mit grünem Farbton:
| Bild | Helligkeit | Sättigung | Grün |
| --- | ---: | ---: | ---: |
| Godot G3, Kampf Mid (`g3/zwischenstand-1920x1080/09`, Feldausschnitt) | 0,50 | 0,51 | 27 % |
| U3, Kampf Mid (`u3/motive-1920x1080/09`, Feldausschnitt) | 0,45 | 0,33 | 27 % |
| U5.2, Mid-Lane Übersicht (`u5/mid-lane-overview.png`) | 0,27 | 0,22 | 0 % |
| U5.2, Mid-Lane Türme | 0,22 | 0,13 | 2 % |
| U5.2, Mid-Lane Weitwinkel | 0,34 | 0,26 | 0 % |
| **U5.3**, Mid-Lane Übersicht | **0,41** | **0,31** | **31 %** |
| **U5.3**, Mid-Lane Türme | **0,44** | **0,36** | **39 %** |
| **U5.3**, Mid-Lane Weitwinkel | **0,40** | **0,24** | **29 %** |
Im Spieltest vom 7. Oktober (Stand U5.2, `u3/spieltest/`) waren zusätzlich die Armeen im Nahkampf weiß und der Boss gelb.
Ursachen und Korrekturen:
| Befund | Korrektur |
| --- | --- |
| **Doppelte Einfärbung.** Der Shader multiplizierte die Godot-Farben mit den farbigen PBR-Albedos. Deren Mittel liegt linear bei 0,03–0,4; der Rasen wurde mit etwa 0,05 multipliziert und war fast schwarz. Was man sah, war vor allem die Nebelfarbe | Der Shader teilt jede Albedo durch ihren gemessenen Mittelwert (`_AlbedoMean`). Die Godot-Farbe bleibt der Durchschnitt, die Karte liefert nur Struktur. Rauigkeit wird ebenso um den Materialwert verteilt (`_OrmMean`), wo das Material eine eigene Rauigkeit hat. Der Fluss hat wieder die Godot-Farben |
| **Datenkarten als Farbe importiert.** Normal- und ORM-Karten liefen durch die sRGB-Umrechnung. Normalen kippten, Verdeckung wurde dunkler, Rauigkeit glänzender | `LuneMaterialFactory.Map`: Normalkarten importieren als Normalkarte, ORM linear, Albedo als sRGB. Die Einstellungen stehen in den `.meta`-Dateien |
| **Regenstreifen.** `bake_pbr.py` verzerrte jedes Muster 10:1 (zwei Torus-Radien); Stein, Erde, Laub und Wasser zeigten senkrechte Striche | Sätze ohne Maserung mit einem Radius (`isotropic()`, flächengleich, gleiche mittlere Strukturgröße): `limestone`, `soil`, `leaf`, `water`, `metal`, `cloth`, `hide`, `bone` neu gebacken. Rinde, Holz und Gesteinsschichten behalten ihre Maserung |
| **Treffer-Flash bleichte.** U5D setzte für alle Materialien einer Figur dieselbe fast weiße Grundfarbe und eine starke Emission. Im Nahkampf greift fast jede Figur an oder wird getroffen; die Armeen waren weiß, der Boss gelb, seine Kristalle verloren die Teamfarbe | Ein Block je Materialplatz: Der Flash tönt die eigene Grundfarbe zu 30 % und legt 0,15 auf die eigene Emission. 16 Stufen; unveränderte Stufen überspringen die Blöcke |
| **Nebel verschleierte die Karte.** Dichte 0,0085 legte in der Kartenansicht (Zoom 64–70, 70–90 m) 35–50 % Nebelfarbe über alles. Das widerspricht der Vorgabe „aus der Draufsicht auch bei über 100 Einheiten lesbar“ | Dichte 0,0045, dort 10–15 %. Farbe und Art unverändert |
| **Ringborke-Rinde im Weltmodus.** Der angefangene Stand nutzte den Rindenmodus mit Weltkoordinaten-Riefen; die wären über die laufende Figur gewandert. Die Normalen hingen an einem festen Hilfsvektor | `RB_Bark` im Grundmodus ohne Vertexfarben, Normalen im Mikktspace des Meshes (Tangenten im Shader) |
Kampfbilder gegenüber dem Stand vor U5 (`u2a-batch/`, dieselben Momente):
| Moment | vor U5 | U5.3 |
| --- | --- | --- |
| 02 Runde 1, Kampf Mid | 0,43 / 0,34 / 36 % | 0,42 / 0,33 / 36 % |
| 06 Held kämpft | 0,44 / 0,34 / 33 % | 0,43 / 0,35 / 33 % |
| 11 Welle 21, Übersicht | 0,39 / 0,33 / 34 % | 0,41 / 0,17 / 22 % |
Werte jeweils Helligkeit / Sättigung / Grün. In der Übersicht kostet der verbliebene Nebel Sättigung; die Nähe ist auf dem Stand vor U5, jetzt mit PBR-Struktur.
### Prüfung
| Test | Ergebnis |
| --- | --- |
| EditMode | 29/29 |
| PlayMode | 13/13 (5 Werkzeuge `Explicit`), Verify A–I 718/0 |
| Fingerabdrücke | Seed 2 `DCE95C96556F3A1A`, Seed 9 ab Runde 21 `7B8E43AEFC0D60C5`, unverändert |
| Kern | unverändert, die Darstellung liest nur; Kerntests .NET 457/457 |
Ein PlayMode-Lauf am 7. Oktober fiel aus der Zeit: Bei einer Rechnerlast um 21 erreichte die Seed-2-Partie des Vertical Function Test in seiner Grenze von 900 s nur 2.429 von 12.690 Schritten, ein Vergleich war so nicht möglich. Seed 9 stimmte im selben Lauf. Der wiederholte Lauf war vollständig grün (313 s).
### Leistung
Am 7. Oktober lief der Mac mit mehr Hintergrundlast als am 2. Oktober (iOS-Simulatoren, Last um 9). Deshalb ist U5.3 abwechselnd mit einem U5.2-Player (`1b31f9b`) unter denselben Bedingungen gemessen, je drei Läufe:
| Ansicht | fps U5.2 / U5.3 | Hauptthread U5.2 / U5.3 | Render-Thread U5.2 / U5.3 | Views U5.2 / U5.3 |
| --- | ---: | ---: | ---: | ---: |
| ganze Karte (Zoom 64), 116 Einheiten | 93,8 / 91,4 | 3,92 / 3,94 ms | 5,39 / 5,41 ms | 0,32 / 0,34 ms |
| Mid-Lane nah (Zoom 22), 63 Einheiten | 125,3 / 124,9 | 3,42 / 3,11 ms | 4,30 / 3,97 ms | 0,42 / 0,36 ms |
Kein messbarer Unterschied; die Abweichungen liegen in der Streuung der Läufe. Die Treffer-Flashes kosten in der Mid-Lane weniger als in U5.2, weil unveränderte Stufen keine Blöcke setzen. Eine erste Runde vor dieser Einsparung ergab ebenfalls Gleichstand (U5.2 115/161, U5.3 117/162 fps). Die absoluten Werte liegen unter denen vom 2. Oktober (133/180 fps), weil der Rechner stärker belastet war; die Last schwankte auch zwischen den Runden.
Rohdaten: `logs/u5.3/player-benchmark-u52-run*.json` und `player-benchmark-u53-run*.json`.
### Bilder
- `screenshots/u5.3/` als JPEG (Qualität 90), um das Repository klein zu halten.
- Editor-Aufnahmen: `mid-lane-*`, `top-lane-*`, `bot-lane-*`, `edge-mountains`, `lane-and-edge`.
- Kampfbilder: `01-runde1-aufmarsch` bis `14-welle-ende`.
- Die 14 G3-Motive mit HUD: `motive/`.
- Die U5-Bilder in `screenshots/u5/` bleiben als Stand vor dem Befund.
### Bekannte Grenzen U5.3
- **Einheitenmodelle** (70) behalten ihre importierten Materialien. U5.3 bringt Gebäude, Boss und Ringborkes Rinde auf PBR. Ringborkes übrige Materialplätze (Moos, Blätter, Schnittholz …) sind unverändert.
- **Sättigung** liegt mit 0,31–0,36 in der Nähe auf U3-Niveau, unter Godot G3 (0,51). ACES-Tonemapping und Nebel nehmen Farbe; eine Farbabstimmung wäre eine Entscheidung zum Look, kein Fehler.
- **Randstufe** unverändert (Farbe + Steinschicht).
- **Decals, Partikel, LOD** weiter offen.
## U5.4 · Figuren
Stand 9. Oktober 2026, Zweig `luneraria/u5.4` (`4883d95`). SSAO ist standardmäßig an (Entscheidung des Projektinhabers vom 9. Oktober). Die Farbsättigung bleibt unverändert.
Eine erste Schlussprüfung in der Nacht scheiterte: Der Mac schlief mit geschlossenem Deckel und ließ Unity nur in kurzen Wachphasen laufen. Die EditMode-Suite brauchte so 26 statt 1 Minute, die Messungen waren unbrauchbar. Die Prüfung unten lief am Morgen mit offenem Deckel.
### Umfang
- **Surface-Materialien für alle Figuren.** Die Modelle der Einheiten (45), Monster (10), Völker (7) und Helden (7) haben 146 Materialnamen. Davon sind 142 neu unter `Materials/Units/`; die vier `LN_Boss_*` der Schlundkrone gehörten schon zu den Gebäuden. `LuneMaterialSet.Dress` setzt sie im Spiel, in den HUD-Porträts und in den Übersichtsbildern ein.
- Farbe, Rauigkeit (1 − Glätte) und Emission bleiben die importierten Werte aus Blender.
- **Metalle** (Gold, Bronze, Eisen, Messing …) werden metallisch (0,7), die bemalten Platten des Nietenkonvents leicht (0,2). Vorher waren alle 414 importierten Figurenmaterialien nicht-metallisch.
- **Randlicht** (Fresnel, Stärke 0,35, kühles Himmelslicht, mit dem Hauptlicht skaliert) hebt die Silhouetten im Draufblick vom Boden ab.
- **Oberflächenstruktur:** der Satz der Materialfamilie (Metall, Stoff, Haut, Knochen, Holz, Rinde, Laub, Stein) im eigenen Raum der Figur, eine Wiederholung je Meter, damit sie nicht über die laufende Figur wandert. Zuordnung in `LuneMaterialFactory.UnitFamily` (Fraktionspaletten nach Rolle, sonst Stichworte im Namen).
- Die Struktur ist **nur in den HUD-Porträts** an (400 px, `LunePortraits.ShowDetail`). Im Feld sind die Figuren 30–60 px hoch; dort ist sie nicht zu sehen, kostete aber rund 10 % Bildrate.
- **Ringborke:** Der 4k-Satz aus Phase 11 (`bake_cutwood.py`) gehört zum Schnittholz (`RB_Cutwood`) und liegt jetzt dort auf den eigenen UVs, auch im Feld. U5.3 hatte ihn an die Rinde (`RB_Bark`) gebunden; das verwaiste `Materials/Buildings/RB_Bark.mat` ist entfernt.
- **Umgebungsverdeckung (SSAO)** als URP-Renderer-Feature über `LuneProjectSetup`: Kontaktschatten von Figuren und Gebäuden, dunklere Fugen an Plaza-Rand, Säulen und Turmfüßen.
- Einstellungen: Radius 0,35 m, Stärke 1,2, Ausblendung erst ab 260 m (Kartenansicht), Tiefe nach den opaken Objekten, halbe Auflösung.
- In den Optionen (F1) abschaltbar („Umgebungsverdeckung (SSAO)“, gespeichert; Bild `screenshots/u5.4/optionen-ssao.jpg`); `-luneSsao 0` gilt für eine Sitzung. Das Umschalten wirkt nur im Player, im Editor bleibt das Projekt-Asset unverändert. Der Player-Selbsttest schaltet die Option zweimal um.
- URP passt dazu die Variantenfilter im Pipeline-Asset und zwei Ressourceneinträge in den globalen Einstellungen an; beides ist nötig, damit der Player die SSAO-Varianten enthält.
- **Shader:** Die Steinreliefkarte wird nur noch für Gelände, Stein, Pflaster und Erde gelesen. Glatte Oberflächen (Figuren, Bauteile, Requisiten) sparen drei Texturzugriffe.
### Befund im Werkzeug
`LuneAssetPreview.RenderSheets` zeigte die Figuren mit den importierten Materialien. Neu kleidet `LUNE_DRESS=1` sie wie das Spiel, `LUNE_EVIDENCE` wählt den Ordner. Dabei gefunden: Das Öffnen der leeren Vorschauszene entlädt zuvor geladene, unreferenzierte Assets. Das Materialset muss deshalb nach der Szene geladen werden, sonst bleibt der Verweis leer und nichts wird eingekleidet.
### Prüfung
| Test | Ergebnis |
| --- | --- |
| EditMode | 29/29 |
| PlayMode | 14/14 (5 Werkzeuge `Explicit`), Verify A–I 718/0 |
| Fingerabdrücke | Seed 2 `DCE95C96556F3A1A`, Seed 9 ab Runde 21 `7B8E43AEFC0D60C5`, unverändert |
| Player-Selbsttest | 30/30 (26 aus dem U4-Nachtrag, 4 neue zur SSAO-Option), `logs/u5.4/player-smoke.json` |
| Kern | unverändert, die Darstellung liest nur |
### Leistung
Endstand, 9. Oktober, Deckel offen, Akkubetrieb ohne Stromsparmodus. U5.3-Player (`07e5365`), U5.4 und U5.4 mit `-luneSsao 0` wurden abwechselnd gemessen, je drei Läufe; Mittel der Bildrate:
| Ansicht | U5.3 | U5.4 | U5.4 ohne SSAO |
| --- | ---: | ---: | ---: |
| Mid-Lane nah (Zoom 22), 63 Einheiten | 177,7 | 148,5 (−16 %) | 171,5 (−3,5 %) |
| ganze Karte (Zoom 64), 116 Einheiten | 127,8 | 111,5 (−13 %) | 122,0 (−4,5 %) |
Die Figurenmaterialien mit Metall und Randlicht kosten 3–5 %, die SSAO weitere 9–13 %. Haupt- und Render-Thread bleiben gleich (2,4–3,1 bzw. 3,4–4,7 ms); die Mehrkosten liegen auf der GPU (Warten beim Present). Rohdaten: `logs/u5.4/player-benchmark-u53-run*.json`, `-u54-run*.json`, `-u54-nossao-run*.json`.
#### Zwischenstände (8. Oktober)
Gemessen mit offenem Deckel und höherer Grundlast, U5.3-Player gegen den jeweiligen U5.4-Stand; Bildrate Mid-Lane nah / Kartenansicht:
| U5.4-Stand | U5.3 | U5.4 | Kosten |
| --- | ---: | ---: | ---: |
| Struktur im Feld an, SSAO mit Tiefen-Normalen-Vorpass, volle Auflösung | 131,8 / 98,5 | 106,6 / 71,4 | −19 / −28 % |
| Struktur an, SSAO nach den opaken Objekten, volle Auflösung | 135,5 / 98,5 | 107,2 / 80,5 | −21 / −18 % |
| Struktur an, SSAO aus | 133,5 / 98,0 | 119,2 / 88,0 | −11 / −10 % |
| Struktur im Feld aus, SSAO nach den opaken Objekten, halbe Auflösung | 135,2 / 99,0 | 111,0 / 86,4 | −18 / −13 % |
Der Vorpass für Tiefe und Normalen zeichnet alle Geometrie ein zweites Mal (Figuren im Mittel 35.000 Dreiecke, 116 im Bild); darum wurde er verworfen. Danach kamen noch die Steinkarte nur wo nötig und die halbe SSAO-Auflösung hinzu (Endstand oben).
### Bilder
`screenshots/u5.4/` als JPEG:
- Übersichtsbilder je Gruppe, eingekleidet wie im Spiel (`Units.jpg`, `Characters.jpg`, `Enemies.jpg`, `Peoples.jpg`, `Buildings.jpg`, …); die Bilder ohne Einkleidung liegen in `u2a-batch/`.
- Editor-Aufnahmen der drei Lanes, Rand und Weitwinkel.
- Die 14 Kampfmomente des Vertical Function Test (`01-runde1-aufmarsch` … `14-welle-ende`).
- Die 14 G3-Motive mit HUD (`motive/`); die großen Porträts zeigen die Oberflächenstruktur.
- Die Optionen mit dem neuen Schalter (`optionen-ssao.jpg`).
Wirkung im Kampf, gegenüber U5.3 (`07-boss-auf-der-lane`, `06-held-kaempft`): Metalle glänzen, die dunklen Basalt-Einheiten haben eine helle Kante. Unter und zwischen den Figuren liegen Kontaktschatten. Die Kristalle des Bosses leuchten unverändert.
Grenze der SSAO-Variante: Sie wirkt nach den opaken Objekten auf das fertige Bild. In engen Fugen dunkelt sie deshalb auch leuchtende Teile ein wenig ab; in den Kampfbildern ist das nicht zu sehen.
### Geometrie
Ein Probelauf in Blender mit Fasen (Bevel 1,2 cm, 2 Segmente, ab 35°) und gewichteten Normalen am Basaltgolem `g01` änderte das Bild kaum (+6 % Dreiecke). Die Modelle sind schon fein. Stilisierter Realismus der Figuren über Material und Licht hinaus braucht neue Formen: Sculpts von Künstlern oder lizenzierte Bibliotheken (Vorgabe vom 1. Oktober, Freigabe und Lizenzprüfung durch den Projektinhaber).
## U5.5 · Figurenpilot Kohlenbeißer (Meshy)
Stand 9. Oktober 2026, Zweig `luneraria/u5.5-pilot` (`c386206`). Pilot für eine gekaufte/generierte Figur: der Kohlenbeißer `g01` der Glutpakt kommt als Meshy-Ergebnis (Bild zu 3D, Auto-Rig, Bibliotheks-Clips) in den Port und ersetzt dort das Phase-4-Modell. Es ist bewusst **eine** Figur — die Pipeline und die Messung klären, ob sich der Weg für die übrigen lohnt. Anatomie, Gesichter und Haare bleiben Künstler-Sculpts oder lizenzierte Packs (Vorgabe vom 1. Oktober, erst nach Freigabe und Lizenzprüfung).
### Umfang
- **Meshy-Pipeline** unter `tools/meshy/`:
- `meshy.py` — schmaler API-Client (nur Standardbibliothek). Der Schlüssel liegt in `~/.config/luneraria/meshy.key` und wird nie geloggt; jeder Auftrag geht in ein Ledger (`tools/out/meshy/ledger.jsonl`).
- `build_figure.py` — Blender-Generator aus den unveränderten Meshy-Ergebnissen in `assets-source/meshy/g01/` (gerigtes Modell + Animations-GLB) und der Figurendatei `tools/meshy/g01/figure.json`. Er erzeugt die Szene, die der FBX-Export erwartet: Maßstab auf Meter, „Root“-Knoche über den Hips, eine Action je Spielclip (`idle`, `walk`, `attack_a`, `attack_b`, `hit`, `ability`, `death`) aus den Bibliotheks-Clips, ein Material ohne Bildknoten.
- Export über `tools/blender/lune_fbx_export.py` (Manifest-Eintrag `kohlenbeisser`, `source_root` „unity“). Der Eintrag trägt `"replaces": "g01"` — `LuneUnitLibraryBuilder` hängt die Figur zusätzlich unter der Godot-ID ein, damit `g01` im Spiel die neue Gestalt zeigt.
- **Texturen** `Art/Textures/ai-kohlenbeisser-{albedo,normal,orm}-2k.png`: die UV-Karten der Figur selbst (kein Triplanar). Albedo und Rauigkeit/Metallizität sind die Farbe; der Glut der Lava steckt in der **Albedo-Alpha** (Meshy 7.1 liefert keine Emission-Map). ORM folgt der Konvention des Ports (R AO, G Rauigkeit, B Metallizität); die glTF-Maps des Downloads (G Rau, B Metall) werden beim Packen getauscht.
- **Material** `AI_Kohlenbeisser` über `LuneMaterialFactory.UnitSpec` (Familie `authored`): UV-Maps an, Basis weiß, `Glow` 1,25 (Emission = Albedo × Alpha × Glow, dazu der bestehende Treffer-Flash), `ShadowNormalScale` 0.
- **Schattenwurf ohne Normalen-Versatz** (`LuneSurface.shader`, `LuneShadowBias`): Die Meshy-Figur ist entlang der UV-Nähte gespalten, die Kopien tragen geknickte Normalen (bis 180°). URP `ApplyShadowBias` schob die Hälften auseinander und die Sonne zog helle Linien durch den Schatten. Die Figur wirft deshalb nur mit Tiefen-Bias.
- **GPU-Skinning** (`PlayerSettings.meshDeformation = GPUBatched`, gesetzt in `LuneProjectSetup`): 35 Meshy-Kohlenbeißer (je ~23.000 Eckpunkte) kosteten mit CPU-Skinning etwa 1 ms Haupt- und 1,7 ms Render-Thread je Bild. Skinning auf der GPU in Batches; die A/B-Messung unten weist die Wirkung nach.
- **Werkzeuge und Prüfungen:**
- `LuneBenchmark` kennt jetzt `-luneBenchmarkRound <n>` und `-luneBenchmarkArmy <unit>` (Figuren-Stresstest: jede Partei deren Bund die Einheit besitzt kauft nur sie bis zum Versorgungslimit; die übrigen behalten ihre Bot-Pläne). Der Bericht listet die bewegten Einheiten zu Beginn des ersten Fensters.
- `LuneAssetPreview.RenderAll` kennt `LUNE_EVIDENCE`, `LUNE_DRESS=1` und `LUNE_ONLY` (Vorher/Nachher einer Figur); der Treffer-Clip nutzt die Kontaktzeit aus dem Manifest.
- `FigureViewsTests` (PlayMode, `Explicit`, Bildwerkzeug): die vier Bilder Aufstellung/Porträt/Kampf nah/Kampf Lane der Figur im echten Spiel.
### Prüfung
| Test | Ergebnis |
| --- | --- |
| EditMode | 29/29 |
| PlayMode | 14/14 (6 Werkzeuge `Explicit`), Verify A–I 718/0 |
| Fingerabdrücke | Seed 2 `DCE95C96556F3A1A`, Seed 9 ab Runde 21 `7B8E43AEFC0D60C5`, unverändert; `same_as_core` in beiden Vertical-Function-Läufen |
| Bildraten-Unabhängigkeit | 30 / 60 / 120 / unbegrenzt, `logs/u5.5-gpu/scene-frame-rates.json`, `max_steps_per_frame` ≤ 17 |
| Player-Selbsttest | 30/30, `logs/u5.5/player-smoke.json` |
| FigureViewsTests | 1/1 (Vorher Phase-4, Nachher Meshy, beide Läufe) |
| Kern | 457/457 (`.NET`, `LUNE_U1_TESTS_OK`) |
### Leistung
macOS-Player, 1920×1080, VSync aus, Deckel offen. A/B im Wechsel im selben Zeitfenster; Mittel der Bildrate aus je drei Läufen (Kette 2 und 3, `logs/u5.5/ab55*-*.json`).
**Figuren-Stresstest** (`-luneBenchmarkRound 5 -luneBenchmarkArmy g01`, 35 Kohlenbeißer plus Begleittruppen, ~97 Einheiten Karte / 44 Mid):
| Ansicht | Phase-4 (starr) | Meshy | Kosten Meshy |
| --- | ---: | ---: | ---: |
| Mid-Lane nah (Zoom 22) | 138,8 | 109,7 | −21 % |
| ganze Karte (Zoom 64) | 105,6 | 91,7 | −13 % |
**GPU-Skinning** (dieselbe Last, Spieler aus Kette 3):
| Ansicht | Phase-4 GPU | Meshy GPU | Phase-4 CPU | Meshy CPU |
| --- | ---: | ---: | ---: | ---: |
| Mid-Lane nah | 159,6 | 123,7 | 149,1 | 144,2 |
| ganze Karte | 122,4 | 107,5 | 121,1 | 131,2 |
GPU-Skinning hebt die Bildrate vor allem bei vielen skinned Figuren (Mid +7…+27 % gegenüber CPU) und entlastet Haupt- und Render-Thread (Mid: Haupt 2,0–2,9 ms, Render 1,4–1,7 ms gegenüber 3,5–3,9 bzw. 3,4–5,2 ms). Die Meshy-Figur bleibt unter gleicher Last die teurere Geometrie (mehr Eckpunkte, geteilte Nähte); mit GPU-Skinning liegt der Abstand zur starren Phase-4-Figur bei −22 % (Mid) und −12 % (Karte).
**Standard-Partie ab Runde 21** (116 Einheiten, im Bild steht kein `g01` — misst die Umgebung, nicht die Figur):
| Ansicht | Phase-4 CPU | Phase-4 GPU | Meshy GPU |
| --- | ---: | ---: | ---: |
| Mid-Lane nah | 133,2 | 139,9 | 140,9 |
| ganze Karte | 106,3 | 106,2 | 108,2 |
Ohne Kohlenbeißer im Bild liegen die drei Varianten beieinander (≤ 6 %); GPU-Skinning gewinnt hier die übrigen skinned Figuren.
### Bilder
- `screenshots/u5.5/figur/` — die Figur allein (Vorher `g01` Phase-4, Nachher `kohlenbeisser` mit Spielmaterialien, Trefferframe `attack_a`).
- `screenshots/u5.5/spiel-vorher/` und `spiel-nachher/` — dieselben vier Spielmomente mit der Phase-4- und der Meshy-Figur (Aufstellung, Porträt, Kampf nah, Kampf Lane).
- `screenshots/u5.5/` und `screenshots/u5.5-gpu/` — die 14 Kampfmomente des Vertical Function Test, `Characters.jpg`, `Units.jpg`, 14 G3-Motive mit HUD.
- `logs/u5.5/` — Player-Selbsttest, A/B-Rohdaten; `logs/u5.5/` und `logs/u5.5-gpu/` die Vertical-Function- und Bildraten-Protokolle.
Wirkung: Der Kohlenbeißer zeigt gehämmerte Platten und glühende Lava in den Fugen (Albedo-Alpha), die Schattenkante der UV-Nähte ist verschwunden. Im HUD-Porträt und in der Nahansicht trägt die Figur die volle UV-Textur; in der Lane-Weite bleibt die Silhouette der Lesbarkeitsanker.
### Bekannte Grenzen U5.5
- **Pilot, keine Serie.** Nur `g01` läuft über Meshy. Die übrigen Figuren behalten die Phase-4-Modelle; eine Serienentscheidung braucht den Projektinhaber (Kosten je Figur, Lizenz, Stilgleichheit).
- **Anatomie, Gesichter, Haare** der Meshy-Figur stammen aus dem generierten Modell, nicht aus Künstler-Sculpts. Für die Stilvorgabe „stilisierter Realismus“ über den ganzen Katalog gilt die Freigaberegelung unverändert.
- **Meshy 7.1 ohne Emission-Map.** Der Lava-Glut ist eine Maske aus Farbe und Metallizität in der Albedo-Alpha; er ist bewusst pauschal (1,25) und nicht je Material gesteuert.
- **UV-Nähte statt geteilter Schatten-Normalen.** `ShadowNormalScale 0` vermeidet die Lichtkanten, nimmt der Figur aber den Normalen-Versatz im Schattenwurf (Tiefen-Bias allein).
- **Geometrie ist teurer** als die starre Phase-4-Figur (−22 % Mid bei 35 Kopien mit GPU-Skinning). Abhilfe wäre LOD oder eine reduzierte Schattenkopie; beides ist offen.
- **Build-Module** für Windows und Linux fehlen weiterhin (PORT-STATUS).
## U5.5 · Lane-Fassung des Kohlenbeißers (LOD)
Stand 9. Oktober 2026, Zweig `luneraria/u5.5-lod` (auf `luneraria/u5.5-pilot`). Antwort auf die offene Grenze oben: Die Meshy-Figur hat jetzt eine vereinfachte Fassung für Lane-Zoom und Karte.
### Umfang
- **Lane-Kopie im Generator** (`build_figure.py`, `lane_lod`, Regel `lod` in `figure.json`): Kopie des Körpers, die an den UV-Nähten getrennten Eckpunkte verschweißt, auf 5.000 Dreiecke reduziert (Collapse; UVs, Material und Skin-Gewichte bleiben), Normalen glatt mit harten Kanten ab 50°. Nach dem Reduzieren werden entartete und doppelt belegte Dreiecke entfernt; der FBX-Rückimport behielt von zwei Dreiecken auf denselben drei Ecken nur eines.
- `KohlenbeisserBody_LOD0` 20.714 Dreiecke / 22.962 Eckpunkte, `KohlenbeisserBody_LOD1` 4.998 / 2.501; Export 23 Prüfungen bestanden, zweiter Lauf bytegleich.
- **Unity:** Aus den Namen `_LOD0`/`_LOD1` baut der Import eine LODGroup. `LuneModelPostprocessor` (Version 5) setzt den Wechsel auf die Bildschirmhöhe aus dem Exportbericht (`generator.lod.lod0_screen` = 0,2; mit dem LOD-Bias 2 der Qualitätsstufe „Ultra“ wechselt die Figur unter rund 10 % Bildhöhe). Die Lane-Fassung wird nie ausgeblendet.
- Ein erster Wert von 0,1 ließ die Figur wegen des Bias bei Zoom 22 meist in voller Fassung; gemessen brachte er Mid nichts und auf der Karte 5 %.
- **HUD-Porträts** erzwingen die volle Fassung (`LunePortraits`, `ForceLOD(0)`). Ohne das blieben Karten und Porträts leer: Das Modell wird im selben Bild erzeugt und gerendert, die LOD-Wahl griff dabei nicht.
### Prüfung
| Test | Ergebnis |
| --- | --- |
| EditMode | 29/29 |
| PlayMode | 14/14 (6 Werkzeuge `Explicit`), Verify A–I 718/0 |
| Fingerabdrücke | `DCE95C96556F3A1A`, `7B8E43AEFC0D60C5`, unverändert, `same_as_core` |
| Asset-Prüfung Unity | `kohlenbeisser` 20 Prüfungen, 0 Fehler |
| Player-Selbsttest | 30/30, `logs/u5.5-lod/player-smoke.json` |
| FigureViewsTests | 1/1, Bilder `screenshots/u5.5-lod/spiel/` |
### Leistung
Figuren-Stresstest wie oben (`-luneBenchmarkRound 5 -luneBenchmarkArmy g01`, 35 Kohlenbeißer), GPU-Skinning, je vier Läufe abwechselnd, Deckel offen (`logs/u5.5-lod/player-benchmark-army-*.json`):
| Ansicht | Phase-4 (starr) | Meshy ohne LOD | Meshy mit LOD |
| --- | ---: | ---: | ---: |
| Mid-Lane nah (Zoom 22) | 133,3 | 109,8 (−18 %) | 120,2 (−10 %) |
| ganze Karte (Zoom 64) | 106,4 | 93,9 (−12 %) | 103,8 (−2 %) |
Die Lane-Fassung halbiert den Abstand in der Mid-Ansicht und schließt ihn auf der Karte fast. Der Rest liegt vor allem beim Animator (Hauptthread +0,5 ms gegenüber der starren Figur, die nicht animiert wird) und bei der GPU. Im Bild ist der Wechsel bei Lane-Zoom nicht zu sehen (Vergleich `screenshots/u5.5/spiel-nachher/04-kampf-lane.jpg` mit `u5.5-lod/spiel/04-kampf-lane.jpg`).
### Grenzen
- Der Wechsel ist hart (kein Überblenden); bei Zoom um die Schwelle kann man ihn an den Krallen sehen.
- Die Lane-Fassung trägt geglättete Normalen statt Meshys geteilter Normalen; die Normalkarte ist für die volle Fassung gebacken. Aus der Lane-Distanz fällt das nicht auf.
## U5.5 · Zweite Figur: Schlackenklaue (g02)
Stand 9. Oktober 2026, Zweig `luneraria/u5.5-g02` (auf `luneraria/u5.5-lod`). Die aufgewertete Form des Kohlenbeißers, auf demselben Weg wie der Pilot, jetzt als Serienschritt.
### Ablauf und Kosten
| Schritt | Meshy | Credits |
| --- | --- | ---: |
| Konzeptbild aus dem gemalten Icon (Phase 3), dem Phase-4-Modell (`tools/meshy/render_reference.py`) und dem Konzept des Kohlenbeißers als Stilvorlage; eine Variante | Image to Image, GPT Image 2 | 12 |
| 3D-Modell, A-Pose, 20.000 Dreiecke, PBR 2k | Image to 3D, meshy-7.1 | 30 |
| Skelett, Höhe 1,5 m | Auto-Rigging | 5 |
| Sieben Bewegungen (nur die genutzten) | Animation | 21 |
| Summe | | 68 |
Gegenüber dem Piloten fielen die zweite Konzeptvariante und die drei verworfenen Bewegungen weg. Die Clip-Regeln (Ausschnitte, Längen, Kontaktzeiten), Glut, Farbangleich und Lane-Fassung sind aus `g01/figure.json` übernommen; Meshy liefert für beide Figuren dasselbe Skelett und dieselben Bibliotheks-Clips.
- `schlackenklaue.fbx`: 20.579 + 4.998 Dreiecke (volle und Lane-Fassung), 25 Knochen, 1,5 m hoch; Export 23 Prüfungen, zweiter Lauf bytegleich. Manifest `"replaces": "g02"`.
- `FigureViewsTests` nimmt mit `LUNE_FIGURE=g02` eine aufgewertete Truppe (als Kohlenbeißer gekauft und aufgewertet); `-luneBenchmarkArmy g02` ebenso.
### Prüfung
| Test | Ergebnis |
| --- | --- |
| EditMode / PlayMode | 29/29, 14/14 (6 Werkzeuge `Explicit`), Verify A–I 718/0 |
| Fingerabdrücke | `DCE95C96556F3A1A`, `7B8E43AEFC0D60C5`, unverändert |
| Asset-Prüfung Unity | `schlackenklaue` 20 Prüfungen, 0 Fehler |
| Player-Selbsttest | 30/30, `logs/u5.5-g02/player-smoke.json` |
| FigureViewsTests | vorher und nachher je 1/1 |
### Leistung
Stresstest mit 35 Schlackenklauen (`-luneBenchmarkRound 5 -luneBenchmarkArmy g02`), GPU-Skinning, je drei Läufe abwechselnd (`logs/u5.5-g02/`):
| Ansicht | Phase-4 (starr) | Meshy mit Lane-Fassung |
| --- | ---: | ---: |
| Mid-Lane nah (Zoom 22) | 152,5 | 135,8 (−11 %) |
| ganze Karte (Zoom 64) | 116,7 | 115,6 (−1 %) |
Wie beim Kohlenbeißer bleibt in der Nahansicht der Animator als Mehrkosten (Hauptthread +0,4 ms).
### Bilder
`screenshots/u5.5-g02/`: `figur/` (Phase-4 `g02` und Meshy, Trefferframe), `spiel-vorher/` und `spiel-nachher/` (Aufstellung, Porträt, Kampf nah, Lane), `Characters.jpg` und `Units.jpg` eingekleidet, die 14 Kampfmomente des Vertical Function Test.
### Repository
Je Figur rund 40 MB: Lieferungen 21 MB (`assets-source/meshy/g02/`), Texturen 18 MB, FBX 3 MB. Für die übrigen Figuren ist Git LFS weiter offen.
## U5.5 · Dritte Figur: Schlackenwacht (g03)
Stand 9. Oktober 2026, Zweig `luneraria/u5.5-g03` (auf `luneraria/u5.5-g02`). Der Tank der Glutpakt, gleicher Ablauf wie bei der Schlackenklaue: ein Konzeptbild aus Icon, Phase-4-Bild und Kohlenbeißer-Konzept als Stilvorlage (12 Credits), Modell (30), Skelett mit 1,35 m (5), sieben Bewegungen (21), zusammen **68 Credits**.
- Entwurf: Der ganze Oberkörper ist eine Basalt-Schildplatte mit Goldrahmen und einem glühenden Lavaschlitz, ohne eigenen Kopf; große Steinfäuste mit Goldbändern. Das Auto-Rigging kam mit der kopflosen Form zurecht.
- `schlackenwacht.fbx`: 20.145 + 4.997 Dreiecke, 25 Knochen; Export 23 Prüfungen, bytegleich wiederholbar. Glut nur im Schlitz (0,9 % der Textur). Manifest `"replaces": "g03"`.
- `FigureViewsTests` (`LUNE_FIGURE`) erkennt jetzt selbst, ob eine Truppe gekauft oder aus ihrer Grundform aufgewertet wird.
| Test | Ergebnis |
| --- | --- |
| EditMode / PlayMode | 29/29, 14/14, Verify A–I 718/0 |
| Fingerabdrücke | `DCE95C96556F3A1A`, `7B8E43AEFC0D60C5`, unverändert |
| Asset-Prüfung / Player-Selbsttest | 20/0, 30/30 |
Stresstest mit 35 Schlackenwachten, je drei Läufe (`logs/u5.5-g03/`): Mid-Lane nah 161,9 → 148,5 fps (−8 %), Karte 124,5 → 124,5 fps (0 %). Bilder: `screenshots/u5.5-g03/` (Figur, vorher/nachher im Spiel, Übersichten, Kampfmomente).
Bekannt: In der Leerlaufhaltung neigt sich die Schildplatte mit der Kopfbewegung der Bibliotheksbewegung leicht nach vorn.
## U5.5 · Vierte Figur: Funkenlanze (g05 und Heldin)
Stand 10. Oktober 2026, Zweig `luneraria/u5.5-g05` (auf `luneraria/u5.5-g03`). Die Fernkämpferin der Glutpakt. Anders als die drei Vorgänger ersetzt sie keine starre Phase-4-Figur, sondern die Skelettfigur aus Phase 18 (`funkenlanze`), die Truppe `g05` und Heldin `held_funkenlanze` gemeinsam nutzen (`Model = "g05"`).
### Neu: Waffe als eigenes Modell
Eine gehaltene Lanze würde das Auto-Rigging an Hand und Bein zugleich binden. Figur und Lanze kommen deshalb getrennt von Meshy (zwei Konzeptbilder, zwei Modelle); `build_figure.py` setzt die Lanze ein (`props` in `figure.json`, `attach_prop`):
- auf ihre Länge skaliert (1,75 m), in der Ruhepose in die Faust des Knochens `RightHand` gelegt: Achse nach vorn und senkrecht zum Handknochen, Spitze voraus, Griff bei 40 % ab dem Ende;
- allein an `RightHand` gebunden (Gewicht 1), so trägt jede Bewegung sie mit; eigenes Material `AI_FunkenlanzeLanze` mit eigenen Karten, eigene Lane-Fassung (3.077 → 599 Dreiecke).
Weitere Änderungen:
- Stoß aus dem Stand (`in_place`): Der Bibliotheksstoß macht einen Ausfallschritt von 0,9 m; die waagrechte Bewegung der Hüfte wird herausgerechnet.
- `LuneUnitLibraryBuilder`: Ersetzungen des Ports (`replaces`) gelten nach den Godot-Zuordnungen; `g05` zeigt damit sicher die Meshy-Figur, die Phase-18-Figur bleibt unter `funkenlanze` im Projekt.
- **HUD-Porträts aus gebackenem Netz** (`LunePortraits.Bake`): Mit GPU-Skinning blieb eine Skelettfigur, die im selben Bild erzeugt und gerendert wird, ohne verformte Eckpunkte; seit dieser Serie waren so die Karten der Schlackenwacht leer. Das Porträt zeichnet jetzt die gebackene Pose als normales Netz (volle Fassung).
### Ablauf und Kosten
Zwei Konzeptbilder (24), Figur und Lanze als Modell (60), Skelett 1,8 m (5), sieben Bewegungen (21): **110 Credits**. Bewegungen: Idle, Kampfgang (1,3 s), Lanzenstoß aus dem Stand (`attack_a`, 1,0 s), Rechtshieb (`attack_b`), Trefferreaktion, aufgeladener Hieb (`ability`, 1,2 s), getroffen nach hinten fallen (`death`, 2,4 s).
`funkenlanze_meshy.fbx`: Körper 20.372 + 4.997, Lanze 3.077 + 599 Dreiecke, 25 Knochen; Export 23 Prüfungen, bytegleich wiederholbar.
### Prüfung
| Test | Ergebnis |
| --- | --- |
| EditMode / PlayMode | 29/29, 14/14, Verify A–I 718/0 |
| Fingerabdrücke | `DCE95C96556F3A1A`, `7B8E43AEFC0D60C5`, unverändert |
| Asset-Prüfung / Player-Selbsttest | 24/0, 30/30 |
### Leistung
Stresstest mit 38 Funkenlanzen (`-luneBenchmarkArmy g05`), je drei Läufe (`logs/u5.5-g05/`); verglichen mit der bisherigen Skelettfigur aus Phase 18:
| Ansicht | Phase 18 | Meshy |
| --- | ---: | ---: |
| Mid-Lane nah | 128,6 | 147,6 (+15 %) |
| ganze Karte | 112,4 | 128,0 (+14 %) |
Die Meshy-Figur ist hier schneller: Die Phase-18-Figur hat 24.000 Dreiecke ohne Lane-Fassung.
Bilder: `screenshots/u5.5-g05/` (Figur, vorher/nachher im Spiel, Übersichten, Kampfmomente).
## U5.5 · Fünfte Figur: Glasballiste (g06)
Stand 10. Oktober 2026, Zweig `luneraria/u5.5-g06` (auf `luneraria/u5.5-g05`). Die Aufwertung der Funkenlanze ist eine laufende Balliste: zwei Klauenbeine, der Rumpf eine große Armbrust mit Kristallbögen, keine Arme und kein Kopf. Meshys Auto-Rigging nimmt nur menschenähnliche Figuren; die Glasballiste kommt deshalb als statisches Meshy-Modell und bekommt Skelett und Bewegungen der Phase-19-Figur, die sie ersetzt.
### Neuer Weg: `tools/meshy/build_machine.py`
- **Modell:** Konzeptbild (12 Credits), daraus Ansichten von vorn und hinten (12), Multi-Image to 3D (30): **54 Credits**. Die Seitenansicht deutete die Armbrust anders und blieb deshalb weg. Meshy ließ eine lose Kristallspitze neben der Figur; Teile unter 1 % der Eckpunkte werden entfernt.
- **Skelett und Clips:** `GlassRig` mit 20 Knochen und den sieben Bewegungen der Phase-19-Figur, aus der Godot-Quelle in `assets-source/meshy/g06/glasballiste-rig-phase19.blend` übernommen (nur Skelett und Aktionen). Der Generator setzt jede Knochengruppe auf den passenden Teil des neuen Modells: Beine auf Beinabstand und Hüfthöhe, Armbrust auf Waffenhöhe, Bolzenspitze und Schaftende, Bögen auf die Bogenspitzen (Messpunkte aus dem Netz). Die Verschiebungen der Clips folgen dem Maßstab (0,97).
- **Starre Bindung:** Jede Ecke folgt ihrem nächsten Knochen, wie bei einer Maschine aus festen Teilen. Bereiche je Knochen (`bone_regions`) verhindern, dass die lange Schienenachse den ganzen Schaft mitnimmt: Bolzen nur vorn, die Sehnenführung (`Draw`) bewegt nichts.
- Breite 1,85 m wie bisher; das neue Modell ist mit 2,5 m deutlich länger als die Phase-19-Figur (1,6 m), in der Aufstellung überlappen die Schäfte.
`glasballiste_meshy.fbx`: 20.397 + 4.995 Dreiecke, 20 Knochen; Export 23 Prüfungen, bytegleich wiederholbar. Manifest `"replaces": "g06"`.
### Prüfung
| Test | Ergebnis |
| --- | --- |
| EditMode / PlayMode | 29/29, 14/14, Verify A–I 718/0 |
| Fingerabdrücke | `DCE95C96556F3A1A`, `7B8E43AEFC0D60C5`, unverändert |
| Asset-Prüfung / Player-Selbsttest | 20/0, 30/30 |
### Leistung
Stresstest mit 36 Glasballisten (`-luneBenchmarkArmy g06`), je drei Läufe, gegen die Phase-19-Figur (`logs/u5.5-g06/`): Mid-Lane nah 150,4 → 151,4 fps (gleich), Karte 117,8 → 132,8 fps (+13 %).
### Grenzen
- Die Bewegungen sind die der alten Figur; Gangbild und Schuss passen, sind aber für deren Proportionen gemacht.
- Starre Bindung auf einem durchgehenden Netz: Wo zwei Knochen aneinanderstoßen, reißen bei großen Ausschlägen (Sterbeclip, Bögen) kleine Lücken auf.
Bilder: `screenshots/u5.5-g06/` (Figur, vorher/nachher im Spiel, Übersichten, Kampfmomente).
## U5.5 · Sechste Figur: Aschenwerfer (g07)
Stand 10. Oktober 2026, Zweig `luneraria/u5.5-g07` (auf `luneraria/u5.5-g06`). Die Flächen-Artillerie der Glutpakt, wieder über das Auto-Rigging (menschenähnlich): ein Konzeptbild aus Icon, Phase-4-Bild und Kohlenbeißer-Konzept (12 Credits), Modell (30), Skelett mit 1,35 m (5), sieben Bewegungen (21), zusammen **68 Credits**.
- Entwurf: gedrungener Basaltgolem, statt eines Kopfes ein nach oben offener Mörserkessel mit Goldrand und glühender Glutkugel, Goldgürtel, Fäuste mit Goldbändern. Den Rauch des Icons gibt es nicht als Geometrie.
- Angriffe sind Würfe: `attack_a` ein Wurf über die Schulter (Ausholen und Wurf, 1,0 s, Treffer bei 0,57 s), `attack_b` ein geduckter Schwungwurf (1,1 s). Fähigkeit, Treffer, Tod, Leerlauf und Gang wie beim Kohlenbeißer.
- `aschenwerfer.fbx`: 20.284 + 4.998 Dreiecke, 25 Knochen; Export 23 Prüfungen, bytegleich wiederholbar. Manifest `"replaces": "g07"`.
| Test | Ergebnis |
| --- | --- |
| EditMode / PlayMode | 29/29, 14/14, Verify A–I 718/0 |
| Fingerabdrücke | `DCE95C96556F3A1A`, `7B8E43AEFC0D60C5`, unverändert |
| Asset-Prüfung / Player-Selbsttest | 20/0, 30/30 |
Stresstest mit 36 Aschenwerfern (`-luneBenchmarkArmy g07`), je drei Läufe gegen das starre Phase-4-Modell (`logs/u5.5-g07/`): Mid-Lane nah 165,0 → 147,1 fps (−11 %), Karte 124,1 → 126,8 fps (+2 %). Bilder: `screenshots/u5.5-g07/`.
## U5.5 · Siebte Figur: Kraterrufer (g08)
Stand 10. Oktober 2026, Zweig `luneraria/u5.5-g08` (auf `luneraria/u5.5-g07`). Die Aufwertung des Aschenwerfers, auf demselben Weg: ein Konzeptbild aus Icon, Phase-4-Bild und dem Aschenwerfer-Konzept als Stilvorlage (12 Credits), Modell (30), Skelett mit 1,5 m (5), sieben Bewegungen (21), zusammen **68 Credits**. Die Figurendatei samt Wurf-Clips ist vom Aschenwerfer übernommen.
- Entwurf: Der ganze Oberkörper ist eine Kraterschale voll glühender Lava mit schwerem Goldrand, Goldklammern und einem Runenschild vorn; sehr lange Steinarme mit breiten Goldbändern, Glutrisse im ganzen Körper (12 % der Textur glühen).
- `kraterrufer.fbx`: 20.502 + 4.998 Dreiecke, 25 Knochen; Export 23 Prüfungen, bytegleich wiederholbar. Manifest `"replaces": "g08"`.
| Test | Ergebnis |
| --- | --- |
| EditMode / PlayMode | 29/29, 14/14, Verify A–I 718/0 |
| Fingerabdrücke | `DCE95C96556F3A1A`, `7B8E43AEFC0D60C5`, unverändert |
| Asset-Prüfung / Player-Selbsttest | 20/0, 30/30 |
Stresstest mit 36 Kraterrufern (`-luneBenchmarkArmy g08`), je drei Läufe gegen das starre Phase-4-Modell (`logs/u5.5-g08/`): Mid-Lane nah 171,3 → 155,1 fps (−9 %), Karte 123,5 → 136,2 fps (+10 %). Bilder: `screenshots/u5.5-g08/`.
## U5.5 · Achte Figur: Herdhüter (g09)
Stand 10. Oktober 2026, Zweig `luneraria/u5.5-g09` (auf `luneraria/u5.5-g08`). Der Unterstützer der Glutpakt über das Auto-Rigging: ein Konzeptbild aus Icon, Phase-4-Bild und Aschenwerfer-Konzept (12 Credits), Modell (30), Skelett mit 1,45 m (5), sieben Bewegungen (21), zusammen **68 Credits**.
- Entwurf: Rumpf und Kopf sind ein hoher Herdofen aus hellem Kalkstein mit Schornstein, Goldraute und glühendem Ofenmaul; die Feuerschale aus dem Icon sitzt fest an der Hüfte statt in den Händen, damit das Auto-Rigging keine gehaltene Schale an die Arme bindet. Schultern, Arme und Beine aus dunklem Basalt mit Goldbändern.
- Bewegungen eines Unterstützers: `attack_a` ein Feuerzauber mit erhobener Hand (1,1 s, Treffer bei 0,4 s), `attack_b` der Wurf über die Schulter, `ability` ein aufgeladener Zauber (1,4 s) für die Stärkung der Verbündeten.
- Farbangleich nur für das Gold: Die Figur hat zwei Steintöne (heller Ofen, dunkler Basalt); ein gemeinsamer Steinangleich hätte den Ofen verdunkelt.
- `herdhueter.fbx`: 20.141 + 4.998 Dreiecke, 25 Knochen; Export 23 Prüfungen, bytegleich wiederholbar. Manifest `"replaces": "g09"`.
| Test | Ergebnis |
| --- | --- |
| EditMode / PlayMode | 29/29, 14/14, Verify A–I 718/0 |
| Fingerabdrücke | `DCE95C96556F3A1A`, `7B8E43AEFC0D60C5`, unverändert |
| Asset-Prüfung / Player-Selbsttest | 20/0, 30/30 |
Stresstest mit 36 Herdhütern (`-luneBenchmarkArmy g09`), je drei Läufe gegen das starre Phase-4-Modell (`logs/u5.5-g09/`): Mid-Lane nah 163,5 → 156,8 fps (−4 %, die Läufe streuen hier stärker), Karte 123,4 → 131,3 fps (+6 %). Bilder: `screenshots/u5.5-g09/`.
Bekannt: In der Leerlaufhaltung neigt der Kopfknochen der Bibliotheksbewegung den Ofen nach vorn, das Ofenmaul ist dann aus der Nähe weniger zu sehen.
## U5.5 · Neunte Figur: Sonnenesse (g10)
Stand 10. Oktober 2026, Zweig `luneraria/u5.5-g10` (auf `luneraria/u5.5-g09`). Die Aufwertung des Herdhüters, auf demselben Weg: ein Konzeptbild aus Icon, Phase-4-Bild und dem Herdhüter-Konzept als Stilvorlage (12 Credits), Modell (30), Skelett mit 1,6 m (5), sieben Bewegungen (21), zusammen **68 Credits**. Figurendatei und Zauberbewegungen sind vom Herdhüter übernommen (Farbangleich nur für das Gold wegen des cremefarbenen Mantels).
- Entwurf: größerer Sonnenpriester-Golem; ein Strahlenkranz aus Gold umrahmt eine glühende Sonnenkugel, aus der ein Feuerstrom in ein Feuerbecken an der Hüfte fließt (fest am Körper, nicht gehalten); cremefarbener Mantel und Überwurf mit goldenen Sonnenzeichen, Sonnenmedaillons auf den Schultern.
- `sonnenesse.fbx`: 20.462 + 4.998 Dreiecke, 25 Knochen; Export 23 Prüfungen, bytegleich wiederholbar. Manifest `"replaces": "g10"`.
| Test | Ergebnis |
| --- | --- |
| EditMode / PlayMode | 29/29, 14/14, Verify A–I 718/0 |
| Fingerabdrücke | `DCE95C96556F3A1A`, `7B8E43AEFC0D60C5`, unverändert |
| Asset-Prüfung / Player-Selbsttest | 20/0, 30/30 |
Stresstest mit 36 Sonnenessen (`-luneBenchmarkArmy g10`), je drei Läufe gegen das starre Phase-4-Modell (`logs/u5.5-g10/`): Mid-Lane nah 137,1 → 152,3 fps (+11 %), Karte 110,6 → 126,8 fps (+15 %); das Phase-4-Modell hatte 97.000 Dreiecke. Bilder: `screenshots/u5.5-g10/`.
Bekannt: Der Überwurf zwischen den Beinen hängt am Skelett der Beine und dehnt sich beim Gehen mit.
## U5.5 · Zehnte Figur: Basaltbastion (g04), Glutpakt vollständig
Stand 10. Oktober 2026, Zweig `luneraria/u5.5-g04` (auf `luneraria/u5.5-g10`). Die Aufwertung der Schlackenwacht. Wie bei der Funkenlanze ersetzt sie eine Skelettfigur (Phase 15, `basaltbastion`), die unter ihrem Namen im Projekt bleibt. Ein Konzeptbild aus Icon, Bild der Phase-15-Figur und dem Schlackenwacht-Konzept als Stilvorlage (12 Credits), Modell (30), Skelett mit 2,1 m wie die bisherige Figur (5), sieben Bewegungen (21): **68 Credits**. Figurendatei und Nahkampf-Clips sind von der Schlackenwacht übernommen.
- Entwurf: wandelnder Festungsgolem; Zinnentürme auf Schultern und Unterarmen mit glühenden Schießscharten, ein kleiner Torturm mit Lavaschlitz als Kopf, eine Schildmauer mit Goldkante und Lavaschlitz auf der Brust, Steinfäuste, Goldbeschläge an Knien und Füßen.
- `basaltbastion_meshy.fbx`: 20.180 + 4.998 Dreiecke, 25 Knochen; Export 23 Prüfungen, bytegleich wiederholbar. Manifest `"replaces": "g04"`.
- Der erste Unity-Start dieser Kette brach beim Öffnen einer Pipe mit einer Mono-Zusicherung ab (Dateideskriptor über dem Limit), während parallel ein Testlauf einer anderen Sitzung lief; der Neustart lief durch.
| Test | Ergebnis |
| --- | --- |
| EditMode / PlayMode | 29/29, 14/14, Verify A–I 718/0 |
| Fingerabdrücke | `DCE95C96556F3A1A`, `7B8E43AEFC0D60C5`, unverändert |
| Asset-Prüfung / Player-Selbsttest | 20/0, 30/30 |
Stresstest mit 36 Basaltbastionen (`-luneBenchmarkArmy g04`), je drei Läufe gegen die Phase-15-Figur (`logs/u5.5-g04/`): Mid-Lane nah 136,9 → 125,5 fps (−8 %), Karte 120,4 → 126,4 fps (+5 %). Die neue Figur ist mit 2,4 m Breite breiter als die alte (1,8 m); in der Aufstellung stehen die Bastionen dicht. Bilder: `screenshots/u5.5-g04/`.
### Stand der Glutpakt
Alle zehn Truppen der Glutpakt sind Meshy-Figuren (g01 bis g10, dazu die Heldin Funkenlanze über `g05`). Ausgegeben wurden dafür 726 Credits (Pilot 86, Funkenlanze 110, Glasballiste 54, die übrigen sieben je 68). Die Phase-4- und Phase-15/18/19-Modelle bleiben im Projekt; eine Zeile `replaces` im Manifest stellt die alte Figur wieder her.
## U5.5 · Gesamtprüfung: das Glutpakt-Heer
Stand 10. Oktober 2026, Zweig `luneraria/u5.5-heer` (auf `luneraria/u5.5-g04`). Neues Bildwerkzeug `ArmyViewsTests` (PlayMode, `Explicit`): Der menschliche Sitz kauft in Runde 3 alle zehn Glutpakt-Truppen (Aufwertungen als Grundtruppe gekauft und aufgewertet) und wirbt die Heldin Funkenlanze an; Bilder von Aufstellung (nah, Lane) und Kampf (nah an der Spitze, Lane, weit). Dieselbe Partie einmal mit den alten Modellen (alle `replaces` entfernt) und einmal mit den Meshy-Figuren: `screenshots/u5.5-heer/vorher/` und `nachher/`.
Maße (Breite × Höhe × Tiefe in m) alt → neu:
| Truppe | alt | Meshy |
| --- | --- | --- |
| g01 Kohlenbeißer | 1,58 × 1,35 × 0,89 | 1,72 × 1,35 × 0,77 |
| g02 Schlackenklaue | 1,79 × 1,50 × 0,98 | 1,65 × 1,50 × 0,84 |
| g03 Schlackenwacht | 1,78 × 1,35 × 0,87 | 1,54 × 1,35 × 0,69 |
| g04 Basaltbastion | 1,76 × 2,25 × 0,85 | 2,39 × 2,10 × 1,05 |
| g05 Funkenlanze | 1,57 × 1,45 × 0,45 (Phase 18: 2,0 hoch) | 1,15 × 1,80 × 1,72 (mit Lanze) |
| g06 Glasballiste | 1,85 × 1,43 × 1,61 | 1,85 × 1,39 × 2,53 |
| g07 Aschenwerfer | 1,64 × 1,35 × 1,25 | 1,73 × 1,35 × 0,75 |
| g08 Kraterrufer | 1,83 × 1,50 × 1,49 | 2,01 × 1,50 × 0,89 |
| g09 Herdhüter | 1,25 × 1,45 × 1,08 | 1,55 × 1,45 × 0,79 |
| g10 Sonnenesse | 1,33 × 1,60 × 1,17 | 1,72 × 1,60 × 0,98 |
Befund:
- **Größen:** Die Höhen der Phase-4-Modelle sind gehalten (Skelett auf die alte Höhe gesetzt). Die Rangfolge stimmt: Aufwertungen sind größer als ihre Grundform, die Basaltbastion ist die größte Figur. Ausreißer sind die Basaltbastion (+0,6 m breiter) und die Glasballiste (+0,9 m länger); in der Aufstellung überdecken sie Nachbarn.
- **Lesbarkeit:** Die alten Modelle unterscheiden sich von oben stark durch Grundformen (offene Kessel mit oranger Füllung, heller Ofen). Die Meshy-Figuren teilen eine Materialsprache (Basalt, Gold, Glutrisse) und wirken als Heer geschlossener, sind aber in der Lane-Weite schwerer auseinanderzuhalten; Kessel und Kraterschale sind von oben weniger sichtbar, weil die Figuren in der Ruhehaltung nach vorn geneigt stehen. Herdhüter und Sonnenesse bleiben durch den hellen Stein und Mantel gut erkennbar. Die mittlere Helligkeit der Aufstellung ist gleich (Luma 0,45 / 0,44, `tools/port/png_stats.py`).
- **Heldin:** Truppe und Heldin Funkenlanze teilen das Modell `g05`; im Feld unterscheidet sie nur der goldene Heldenring und das Namensschild.
- **Nicht geprüft:** Animationen im Gegeneinander (Treffer, Tod) nur stichprobenweise in den Kampfbildern.
Vorschläge (offen, nicht umgesetzt): Ruhehaltung ohne Vorneigung für die Kessel-Figuren (eigener Leerlauf-Clip oder Kopfknochen ruhig stellen), die Basaltbastion auf rund 1,9 m Breite skalieren, die Glasballiste kürzen; eine eigene Erscheinung für die Heldin.
## U5.5 · Feinschliff nach der Gesamtprüfung
Stand 10. Oktober 2026, Zweig `luneraria/u5.5-feinschliff` (auf `luneraria/u5.5-heer`). Die zwei Vorschläge der Gesamtprüfung, ohne neue Meshy-Aufträge:
1. **Aufrechte Haltung** für die Figuren ohne echten Kopf (Schlackenwacht, Basaltbastion, Aschenwerfer, Kraterrufer, Herdhüter, Sonnenesse). `build_figure.py` kennt `calm` in `figure.json`: In `idle` und `walk` behalten die genannten Knochen nur einen Teil ihrer Drehung (Kopf und Hals 0, Wirbelsäule 0,3, Hüfte 0,4). Beim Herdhüter sinkt die Rumpfneigung im Gang von im Mittel 34° auf 11° (höchstens 46° → 16°), im Leerlauf blickt der Ofen nicht mehr nach unten; die Füße bleiben am Boden (tiefster Zeh 1–5 cm). Kesselschale und Kraterschale sind von oben wieder zu sehen.
2. **Kleinere Grundfläche:** Basaltbastion mit `scale` 0,84 auf 2,01 × 1,76 × 0,88 m (vorher 2,39 × 2,10); sie bleibt die höchste Figur der Glutpakt. Glasballiste mit `length` 1,9 m entlang der Achse gestaucht (vorher 2,53 m, Breite 1,85 m und Höhe unverändert; `build_machine.py`, starre Teile vertragen das).
Prüfung: Export aller sieben Figuren 23/0 und bytegleich wiederholbar, Asset-Prüfung ohne Fehler, EditMode 29/29, PlayMode 14/14 (Verify 718/0), Fingerabdrücke unverändert, Player-Selbsttest 30/30. Bilder des Heeres: `screenshots/u5.5-feinschliff/` (gleiche Motive wie `u5.5-heer/nachher/`).