Tree Gen 1.42.0: UCX-Stammhuelle im Spielfertig-Export

Die Stand-Baeume bekommen eine konvexe Kollisionshuelle um den STAMM, vom Fuss
bis zum Kronenansatz - keine Kronen-Huelle: gegen die liefe der Spieler, bevor
er den Baum beruehrt.

Die Trennung kommt aus ast_id (0 = Stamm), dasselbe Attribut wie beim Ursprung
und bei den Faell-Teilen. Kronenansatz = tiefster Punkt mit ast_id > 0 plus ein
Zehntel Stammhoehe Luft (der tiefste Astpunkt kann eine herabgebogene Spitze
sein). Ohne Aeste ist die ganze Pflanze Stamm - beim Kaktus genau richtig.

Name und Hierarchie sind NICHT geraten, sondern am Fels-Export nachgemessen,
der in der Pipeline schon abgenommen ist: UCX_<LODGroup-Name>, als GESCHWISTER
des LodGroup-Empty. Ein Kind der Gruppe wuerde Unreal als LOD-Stufe lesen.

Zwei Befunde aus der Messung:
- Die Huelle rutschte 4-6 cm UNTER den Boden. Das Vereinfachen auf 12 Verts
  schneidet Ecken ab, das anschliessende Aufblasen skaliert um die Huellenmitte
  und schiebt dabei die Unterseite nach unten. Im Spiel waere das eine
  Kollision, die aus dem Terrain ragt. Boden wird jetzt auf Z = 0 geklemmt.
- Der erste Anlauf des Tests holte die FBX-Skala aus der Gesamthoehe - die
  Blatt-Cards ragen ueber die Rinde hinaus, die Skala kam zu gross heraus und
  die Huelle sah zu klein aus. Massstab kommt jetzt aus Material-Slot 0.

Neu: tests/test_stamm_ucx.py, vier Faelle (gerader Stamm, krummer Stamm mit
Bend 1.5, Obstbaum, einmal ohne LODs), gemessen im reimportierten FBX.
Gegenprobe ohne Boden-Klemmung: vier Fehler.

test_baum_export, test_baum_lod und test_ursprung zaehlten die Huelle als
Render-Mesh mit und schlugen zu Recht an - sie filtern jetzt UCX_.

Schalter im Export-Panel: "UCX-Stammhuelle" (an) + max. Verts (12).

27 Tests bestehen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-08-07 06:18:29 +02:00
co-authored by Claude Opus 4.8
parent 263b8507d8
commit ae7806e082
11 changed files with 369 additions and 17 deletions
+48
View File
@@ -563,6 +563,54 @@ Der Kaktus erzeugt regulaer **0 Cards** — kein Ast ist duenner als `Max Radius
und das ist botanisch richtig. Vorher lief das still durch und man stand vor
einer leeren `_Leaf`-Ebene; jetzt sagt der Operator es und nennt den Regler.
### Stamm-UCX fuer den Stand-Baum
Die Stand-Baeume bekommen eine konvexe Kollisionshuelle um den **Stamm**, vom
Fuss bis zum Kronenansatz. Bewusst keine Kronen-Huelle: gegen die liefe der
Spieler, bevor er den Baum ueberhaupt beruehrt.
Die Trennung kommt aus `ast_id` (0 = Stamm) - dasselbe Attribut wie beim
Ursprung und bei den Faell-Teilen. Kronenansatz ist der tiefste Punkt mit
ast_id > 0, plus ein Zehntel Stammhoehe Luft, weil der tiefste Astpunkt eine
herabgebogene Spitze sein kann. Ohne Aeste (Kaktus-Setzling) ist die ganze
Pflanze Stamm - und genau die soll dann die Kollision sein.
**Name und Hierarchie sind nicht geraten, sondern vom Fels-Export abgeschaut**,
der in der Spiel-Pipeline schon abgenommen ist: dort exportiert eine LOD-Gruppe
als `UCX_<LODGroup-Name>`, und zwar als GESCHWISTER des LodGroup-Empty, nicht
als Kind - Unreal liest jedes Kind der Gruppe als LOD-Stufe. Nachgemessen im
Fels-FBX, bevor eine Zeile Baum-Code entstand.
Ergebnis im reimportierten Baum-FBX:
```
Eiche_01_LOD0..3 MESH parent = Eiche_01_LODGroup
Eiche_01_LODGroup EMPTY parent = -
UCX_Eiche_01_LODGroup MESH parent = - 12 Verts
```
Zwei Dinge, die erst die Messung gezeigt hat:
* Die Huelle rutschte **4-6 cm unter den Boden**. Das Vereinfachen auf 12 Verts
schneidet Ecken ab, und das anschliessende Aufblasen (damit wieder alles
hineinpasst) skaliert um die Huellenmitte - dabei wandert die Unterseite nach
unten. Im Spiel waere das eine Kollision, die aus dem Terrain herausragt.
Jetzt wird der Boden auf Z = 0 geklemmt.
* Der erste Anlauf des Tests rechnete die FBX-Skala aus der **Gesamthoehe**
zurueck - die Blatt-Cards ragen aber ueber die Rinde hinaus, die Skala kam zu
gross heraus und die Huelle sah zu klein aus. Jetzt kommt der Massstab aus
Material-Slot 0. Ein Massstab, der etwas anderes misst als die Referenz,
verschiebt jede Aussage.
`tests/test_stamm_ucx.py` prueft an vier Faellen (gerader Stamm, krummer Stamm
mit Bend 1.5, Obstbaum, und einmal ohne LODs): genau eine Huelle, richtiger
Name, kein Elternteil, 8-24 Verts, Radius zwischen Stammradius und dem
2.5-fachen davon, Fuss auf Z = 0, Hoehe nicht ueber den Kronenansatz hinaus.
Gegenprobe ohne die Boden-Klemmung: vier Fehler.
Drei bestehende Tests zaehlten die Huelle als Render-Mesh mit und schlugen zu
Recht an - sie filtern jetzt `UCX_`.
### Vom Trichter ueber die Haube zur Kugel
Zielbild ist der **Lollipop** der stilisierten Vektor-Illustration: kurzer