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>
1) Ursprung: Stammbasis statt tiefstem Slot-0-Punkt
Zweimal war das schon "behoben". Erst kam der Ursprung aus der Gesamt-Bbox
(eine Blatt-Card hob den Baum an), dann aus Material-Slot 0 - aber die AESTE
gehoeren ebenfalls zum Rinden-Slot. Gemessen an Tanne_01_S1: tiefster
Slot-0-Punkt -5.35 cm, tiefster STAMM-Punkt -0.02 cm. Die Stammbasis
schwebte 5.3 cm ueber dem Boden.
Die exakte Trennung liefert ast_id (0 = Stamm) - dasselbe Attribut, das der
Baum fuer die Faell-Teile ohnehin traegt. Ein Schwellwert auf den
Achsabstand faellt beim Kaktus um: dessen Stamm ist dicker als jeder
sinnvolle Schwellwert. X/Y kommt jetzt aus dem untersten RING statt aus der
Stamm-Bbox; bei Bend 1.5 liegt die Bbox-Mitte in der Kruemmung.
Neu: tests/test_ursprung.py, gemessen am reimportierten FBX. Die erste
Fassung des Tests suchte den "tiefsten Punkt nahe der Achse" - die
Gegenprobe hat sie umgeworfen, weil bei der Tanne eine Astspitze ins
Achsband faellt. Ein Schwellwert, der die Bugfassung durchlaesst, prueft
nichts. Jetzt wird ein Stammquerschnitt gesucht: Vertices, die die Achse in
allen Himmelsrichtungen umschliessen. Gegenprobe bestanden.
Nebenbefund: ein Baum ohne Aeste traegt gar kein ast_id (Branch Count 0
schaltet den Ast-Zweig des Graphen ab). Dann ist alles Stamm und der
Fallback exakt.
2) Weide S4 auf 350 Cards gedeckelt - Entscheidung des Users
Gemessen 5456-5594 Tris ueber drei Seeds gegen 4300 Budget; nach der
Deckelung 3890-3962. LEAF_STUFEN_PRESET haelt solche Ausnahmen je Preset.
3) Birke war eine Saeule
Gemessen B/H 0.15 - schmaler als der Standardbaum (0.22), nicht die Haelfte
der Eiche (0.36). Ursache: Branch Up 1.1, die Aeste klebten am Stamm.
Zielband 0.35-0.55 aus Van den Berk (8-12 m bei 15-20 m) und Woodland Trust
(6-10 m bei 15-25 m); jetzt 0.51.
Haengende Zweigenden ueber Branch Droop 0.8 + Droop Curve 3.5, nicht ueber
negatives Sub Up: das wurde von +2.2 bis -2.0 durchgemessen und bewegt
nichts (1-6 %), weil die Sub-Aeste zu kurz sind. Mit Droop 26 % bei einem
Fall von 0.033 x Hoehe - wie die Tanne (0.030), weit weg von der Weide
(0.213).
4) run_tests.ps1 benennt Blender-Abstuerze
test_export_robust starb rund in jedem sechsten Lauf mit
EXCEPTION_ACCESS_VIOLATION und der Runner meldete "<keine Ergebniszeile>".
Der Stack enthaelt keinen einzigen Addon-Frame (RNA_property_int_get ->
rna_property_rna_or_id_get -> IDP_GetPropertyFromGroup, Null-Deref), und mit
eingebauten Markern verschwindet der Absturz: Heisenbug in Blender 5.1.2.
Der Runner wiederholt jetzt einmal und benennt den Absturz.
24 Tests bestehen.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>