Tree Gen 1.36.0: Ursprung an der Stammbasis, Weide gedeckelt, Birke ueberarbeitet

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>
This commit is contained in:
2026-08-06 11:55:34 +02:00
co-authored by Claude Opus 4.8
parent fa7067d42e
commit 499d507e28
9 changed files with 461 additions and 37 deletions
+62
View File
@@ -563,6 +563,68 @@ 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.
### Der Ursprung sitzt an der Stammbasis, nicht am tiefsten Ast
Zweimal war dieser Fehler schon "behoben". Erst kam der Ursprung aus der
Gesamt-Bbox - eine tief haengende Blatt-Card hob den ganzen Baum an. Dann aus
Material-Slot 0, was die Cards ausnahm, aber die AESTE gehoeren ebenfalls zum
Rinden-Slot. Gemessen an Tanne_01_S1 (Aeste ab 6 % Stammhoehe, haengend): der
tiefste Slot-0-Punkt lag bei **-5.35 cm**, der tiefste STAMM-Punkt bei
**-0.02 cm**. Die Stammbasis schwebte 5.3 cm ueber dem Boden, weil eine
Astspitze den Nullpunkt bestimmte.
Die exakte Trennung liefert `ast_id` (0 = Stamm) - dasselbe Attribut, das der
Baum ohnehin fuer die Faell-Teile traegt. Ein Schwellwert auf den Achsabstand
waere die naheliegende Alternative und faellt beim Kaktus um: dessen Stamm ist
dicker als jeder sinnvolle Schwellwert. X/Y kommt aus dem UNTERSTEN RING statt
aus der Stamm-Bbox; bei einem krummen Stamm (Bend 1.5 am toten Baum) liegt die
Bbox-Mitte irgendwo in der Kruemmung.
`tests/test_ursprung.py` misst am reimportierten FBX. Die erste Fassung des
Tests suchte den "tiefsten Punkt nahe der Achse" - und die Gegenprobe hat sie
umgeworfen: bei der Tanne faellt eine Astspitze ins Achsband, der Test meldete
Fuss = 0, obwohl der Stamm 5 cm darueber schwebte. Ein Schwellwert, der die
Bugfassung durchlaesst, prueft nichts. Jetzt wird ein STAMMQUERSCHNITT gesucht:
Vertices, die die Achse in allen Himmelsrichtungen umschliessen. Eine Astspitze
tut das nicht.
Nebenbefund: ein Baum ohne Aeste traegt gar kein `ast_id` - das Attribut
entsteht auf dem Ast-Zweig des Graphen, und den schaltet `Branch Count 0`
komplett ab (Kaktus-Setzling). Dann ist ohnehin alles Stamm, der Fallback ist
also exakt und nicht bloss ausreichend.
### Weide: Ziel-Cardzahl je Preset
"Volle Dichte" auf S4 heisst: das Ergebnis haengt an der Zweigflaeche, und die
faellt je Art verschieden aus. Die Weide traegt die meiste und landete gemessen
bei 5456-5594 Tris ueber drei Seeds, gegen ein Stufenbudget von 4300. Mit der
Deckelung auf 350 Cards: 3890-3962 Tris.
`LEAF_STUFEN_PRESET` haelt solche Ausnahmen. Das macht die Tabelle
preset-abhaengig - bewusste Entscheidung der Spielseite, statt das Budget fuer
alle anzuheben: die Weide ist der Ausreisser, nicht die Regel.
### Birke: keine Saeule
Gemessen war die alte Birke Breite/Hoehe **0.15** - schmaler als der
Standardbaum (0.22) und nicht einmal die Haelfte der Eiche (0.36). Ursache war
`Branch Up` 1.1: die Aeste zeigten fast senkrecht nach oben und klebten am
Stamm.
Zielband aus zwei Quellen, die sich ueberlappen: Van den Berk nennt fuer
*Betula pendula* 15-20 m Hoehe bei 8-12 m Kronenbreite (B/H 0.40-0.80), der
Woodland Trust 15-25 m bei 6-10 m (0.24-0.67). Schnittmenge rund 0.35-0.55;
gemessen jetzt **0.51**.
Den Habitus nennt Van den Berk woertlich: "spreading branches have clearly
pendulous and thin twigs". Das ist der Palmen-Bogen im Kleinen - der Ast steigt
erst und kippt dann ab -, deshalb `Branch Droop` mit spaeter `Droop Curve`.
Negatives `Sub Up` waere der naheliegende Griff gewesen und bewegt hier nichts:
durchgemessen von +2.2 bis -2.0 blieb der Anteil haengender Vertices bei 1-6 %,
weil die Sub-Aeste zu kurz sind, um die Silhouette zu tragen. Mit Droop 0.8 sind
es 26 % bei einem Fall von 0.033 x Hoehe - vergleichbar der Tanne (0.030), weit
weg von der Weide (0.213). Die Zweige haengen, der Baum nicht.
### Die Node-Gruppe wird WIEDERVERWENDET, nicht neu gebaut
`build_group()` loeschte die Gruppe `GN_Tree` bei jedem Erzeugen und legte sie