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:
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user