Tree Gen 1.44.0: _Pieces_All.fbx steht auf der Stammbasis

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>
This commit is contained in:
2026-08-07 06:59:04 +02:00
co-authored by Claude Opus 4.8
parent 20e8e24322
commit b5ec4a4bc0
8 changed files with 98 additions and 13 deletions
+27
View File
@@ -58,12 +58,19 @@ bpy.ops.object.treegen_create()
baum = [o for o in bpy.context.scene.objects
if o.type == 'MESH' and o.name.startswith("Eiche_01")
and not o.name.endswith(("_Leaf", "_Frucht"))][0]
# Der Baum steht BEWUSST nicht am Ursprung. Die Gesamtdatei trug den
# Szenen-Nullpunkt mit (gemessen X 16.5..19.3 bei einem Baum auf x = 18), und
# bei (0,0,0) faellt genau das nicht auf.
STANDORT = (18.0, -7.5, 0.0)
baum.location = STANDORT
for o in bpy.context.scene.objects:
o.select_set(o is baum)
bpy.context.view_layer.objects.active = baum
s.leaf_card = card
bpy.ops.object.treegen_leaves()
blatt = bpy.data.objects.get(baum.name + "_Leaf")
if blatt is not None:
blatt.location = STANDORT
# Referenz: wie viele Blatt-Faces hat der Stand-Baum?
dg = bpy.context.evaluated_depsgraph_get()
@@ -236,6 +243,26 @@ if gesamt:
fails.append("Gesamtdatei nur %.2f m hoch - die Teile stehen nicht an "
"ihrer Originalposition" % hoehe)
# URSPRUNG auf der Stammbasis, wie beim Stand-Baum. Geprueft ueber den
# STAMMQUERSCHNITT, nicht ueber die Bbox-Mitte: die Krone haengt einseitig,
# und eine Bbox-Mitte wuerde den Fehler verwischen. Gesucht wird auf
# Fusshoehe ein Ring von Vertices, der die Achse umschliesst.
stamm_teile = [o for o in teile if "_Piece_Stamm" in o.name]
if stamm_teile:
sco = [o.matrix_world @ v.co for o in stamm_teile
for v in o.data.vertices]
zmin = min(c.z for c in sco)
band = [c for c in sco if c.z <= zmin + hoehe * 0.03]
mx = sum(c.x for c in band) / len(band)
my = sum(c.y for c in band) / len(band)
print("Gesamtdatei: Stammfuss bei %.3f / %.3f / %.3f" % (mx, my, zmin))
if math.hypot(mx, my) > hoehe * 0.02:
fails.append("Gesamtdatei: Stammfuss liegt bei %.2f/%.2f statt "
"ueber dem Ursprung - die Datei traegt den "
"Szenen-Nullpunkt mit" % (mx, my))
if abs(zmin) > hoehe * 0.02:
fails.append("Gesamtdatei: Stammfuss bei Z %.3f statt 0" % zmin)
print("")
if fails:
print("ERGEBNIS: %d FEHLER" % len(fails))