Die Zusammenbau-Datei trug den SZENEN-Nullpunkt mit: ein Baum bei x = 18 m
exportierte gemessen mit X 16.5..19.3, Y -8.7..-6.2. Die Einzel-Teile hatten
das Problem nie (sie sitzen auf ihrem Massenmittelpunkt), der Stand-Baum folgt
der Stammbasis seit 1.36 - nur diese eine Datei fiel heraus.
Der Versatz kommt aus DERSELBEN Funktion wie beim Stand-Baum: die Rechnung ist
aus _origin_bottom_center als _stammbasis_versatz herausgeloest und wird von
beiden Wegen benutzt. Zwei Rechnungen fuer denselben Nullpunkt waeren genau die
Fehlerklasse, die hier schon dreimal zugeschlagen hat - und hier haette sie
besonders weh getan, weil die zusammengesetzten Truemmer exakt auf dem Platz
des Baums liegen muessen.
Angewendet nur fuer diesen Export, danach zurueckgenommen: mit "Teile behalten"
staenden sie sonst verschoben neben dem Baum in der Szene.
test_faell_teile stellt den Baum jetzt bewusst auf (18, -7.5) und prueft den
Stammfuss ueber den QUERSCHNITT auf Fusshoehe, nicht ueber die Bbox-Mitte - die
Krone haengt einseitig und wuerde den Fehler verwischen.
Gegenprobe ohne Versatz: Stammfuss bei 18.000 / -7.500, exakt der gemeldete
Wert.
27 Tests bestehen.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Die Gesamtdatei kam ohne Kollision an, waehrend die Einzeldateien welche
hatten. Jetzt bekommt jedes Teil auch dort seine Huelle, gleiche Konvention wie
beim Stand-Baum: UCX_<Teilname> als Geschwister, kein Elternteil. Sie entstehen
VOR dem Umsetzen der Pivots, weil in der Gesamtdatei alle Teile noch an ihrer
Originalposition stehen.
Beim Nachmessen kamen zwei Fehler heraus, die auch die BESTEHENDEN
Einzeldateien betrafen:
1) Die Huellen umschlossen das Laub mit
_tree_ucx las alle Vertices eines Teils, also auch die Blatt-Cards. Gemessen
am baum-Preset war die Huelle dadurch 1.4- bis 2.1-mal so gross wie das Holz.
Jetzt nur noch Material-Slot 0. Die Spielseite hatte das fuer ihre
Interim-Boxen laengst so gemacht - zu Recht.
2) Das Aufweiten war fuer schlanke Teile kaputt
Nach dem Vereinfachen wurde die Huelle durch Skalieren um die Huellenmitte
aufgeblasen. Bei langgestreckten Teilen entgleist das: liegt eine Flaeche
fast durch die Mitte, wird der Hebel winzig und der Faktor explodiert -
gemessen 4.2 an einem Stammsegment mit Laenge zu Dicke 13:1. An der dicken
Eiche blieb es bei 1.0-1.4, deshalb ist es nie aufgefallen; erst der Wechsel
auf Rinde-only machte die Teile schlank genug.
Jetzt wird je Flaeche der ECHTE Fehlbetrag gemessen und die Vertices um genau
diesen Betrag nach aussen geschoben - eine Verschiebung in Metern, kein
Verhaeltnis. Iterativ, weil ein Vertex mehreren Flaechen angehoert und
entlang seiner eigenen Normale wandert (ein Durchgang liess einen Rest
stehen, der Test schlug an). Bleibt danach etwas uebrig, faellt die Funktion
auf die unvereinfachte Huelle zurueck.
Ergebnis am 12-teiligen Baum: alle Huellen 14-31 Verts (Budget 32), keine
groesser als das 1.35-fache ihres Holzes.
test_faell_teile prueft die Gesamtdatei jetzt auf: je Teil genau eine Huelle,
richtiger Name, kein Elternteil, und Huellengroesse gegen die RINDE.
Gegenproben: ohne Rinde-Filter 10 Fehler (1.41x bis 2.06x), ohne Huellen in der
Gesamtdatei 1 Fehler.
27 Tests bestehen.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Knopf "Faell-Teile exportieren": Stamm in 2-3 Segmente, jeder Ast als eigenes
Teil SAMT seinen Sub-Aesten und Blatt-Cards, dazu <Name>_Pieces_All.fbx mit
gemeinsamem Ursprung. Je Teil zwei Material-Slots, Pivot am Massenmittelpunkt,
eigene UCX-Huelle.
Die Ast-Zugehoerigkeit ist ein ATTRIBUT, keine Schaetzung - wie von der
UE-Seite vorgeschlagen. Der Generator legt "ast_id" an den Astpunkten ab
(0 = Stamm, 1..N = Aeste). Sub-Aeste erben die ID ihres Astes automatisch, weil
sie aus Punkten auf dessen Kurve entstehen; nachgemessen: bei Sub Count 0 hat
jeder Ast 28 Verts, bei 3 dann 64, der Stamm bleibt konstant bei 156. Beim
Blatt-Streuen wird ast_id am Punkt abgegriffen und auf die Card gespeichert.
Damit ist die Zuordnung exakt nachzaehlbar, und genau das prueft der Test:
Summe der Cards ueber alle Teile == Cards des Stand-Baums. 170 = 170.
Die Falle, die diese Bilanz aufgedeckt hat: die Z-Schnitte am Stamm zerschnitten
anfangs auch Blatt-Cards. Aus einer wurden zwei, die Bilanz stand auf 178 gegen
170 - und die Atlas-UVs der Haelften waeren kaputt gewesen. Eine Card ist ein
unteilbares Billboard; sie wandert jetzt als GANZES in das Segment, in dem ihre
Inselmitte liegt. Nur die Rinde wird geschnitten, ihre Schlagflaechen werden
gedeckelt.
Massenmittelpunkt flaechengewichtet statt Vertex-Mittelwert: wo das Mesh dicht
tesselliert ist (Astansatz), wuerde der Mittelwert den Pivot dorthin ziehen und
das Teil torkelte beim Fallen.
Alles am REIMPORTIERTEN FBX gemessen: 12 Teile (3 Stamm, 9 Ast), UCX 18-32
Verts im Budget, Pivot maximal 16 mm vom Schwerpunkt, 0 non-manifold Kanten,
Gesamtdatei 5.41 m hoch - also volle Baumhoehe und deckungsgleich
rekonstruierbar.
Nebenbei: _deselect fiel ueber None-Eintraege in der Objektliste, die beim
Entfernen von Objekten zwischen den Teilen staendig auftreten.
Neu: tests/test_faell_teile.py. 21 Tests bestehen.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>