Tree Gen 1.34.0: Ziel-Cardzahl statt Dichte-Konstanten + Ursprung aus dem Stamm
Zwei Befunde von der Spielseite.
1) Dichte-Kompensation ueberschoss preset-abhaengig
Die Eichung am Standardbaum (11 Cards / 486 Tris) kam auf der Eiche als
1008 Tris an. Ursache ist strukturell: "Dichte" ist Punkte pro m2
Zweigflaeche, und die verteilt sich je Preset voellig anders. Jeder
Konstanten-Satz haette fuer den naechsten Baum neu geeicht werden muessen.
Strukturwechsel wie vorgeschlagen: in LEAF_STUFEN steht jetzt die
ZIEL-STUECKZAHL (S1 10, S2 40, S3 120, S4 = volle Dichte), und der Generator
regelt die Dichte per Bisektion dagegen ein. Der Seed wird dabei nicht
angefasst - gleicher Baum und Seed ergeben dieselbe Verteilung.
Gemessen ueber vier Presets (Ziel 10 / 40 / 120):
baum 9 41 104 eiche 10 43 138
birke 9 36 136 tanne 9 38 125
Die Eiche liegt bei S1 jetzt bei 576 Tris statt 1008.
Der Test prueft die Anzahl DIREKT, statt ueber Dichte x Anteil x Flaeche zu
rechnen - genau der Punkt des Vorschlags.
2) Baum stand "etwas in der Luft"
Der Export-Ursprung kam aus der Gesamt-Bbox inklusive Blatt-Cards. Eine
einzige tief haengende Card hebt damit den ganzen Baum an. Jetzt kommt er aus
der STAMM-Geometrie (Slot 0). Gemessen an der Eiche: Stamm-min.Z 0.000 auf
allen vier Stufen, waehrend die Gesamtbox bei S1 auf -0.106 liegt - das waren
die 10 cm, um die er zu hoch stand.
Beim Einbauen selbst verursacht und behoben: eine abgebrochene Befehlskette
liess die Operator-Verdrahtung aus, wodurch die Dichte mit der ZIEL-ANZAHL
multipliziert wurde (170 x 40) - 732 Cards statt 40. Faellt sofort auf, wenn man
die Zahlen anschaut, statt den Durchlauf fuer erfolgreich zu halten.
23 Tests bestehen.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -52,8 +52,8 @@ if not (130.0 <= s.leaf_density <= 200.0):
|
||||
% s.leaf_density)
|
||||
# Die Deckung steht als Tabelle pro Stufe, nicht als Formel. Card-ANZAHL muss
|
||||
# ueber die Stufen steigen, Card-Groesse auch.
|
||||
_d0, _g0, _h0 = tg._stufen_anteile(0.0)
|
||||
_d1, _g1, _h1 = tg._stufen_anteile(1.0)
|
||||
_z0, _g0, _h0 = tg._stufen_anteile(0.0)
|
||||
_z1, _g1, _h1 = tg._stufen_anteile(1.0)
|
||||
if _g0 >= _g1:
|
||||
fails.append("Groessen-Anteil steigt nicht ueber die Stufen (%.2f -> %.2f)"
|
||||
% (_g0, _g1))
|
||||
@@ -275,6 +275,34 @@ if abs(kante_ohne - kanten[-1]) > 0.02:
|
||||
fails.append("Ein Baum ohne Wachstums-Stufen (%.2f) sieht anders aus als "
|
||||
"die letzte Stufe (%.2f)" % (kante_ohne, kanten[-1]))
|
||||
|
||||
# --- 3c) Ziel-Cardzahl wird preset-UNABHAENGIG eingeregelt ---------------
|
||||
# Frueher standen hier Dichte-Faktoren. Die mussten je Preset neu geeicht
|
||||
# werden: "Dichte" ist Punkte pro m2 Zweigflaeche, und die verteilt sich je
|
||||
# Baum voellig anders - ein Faktor, der am Standardbaum 11 Cards ergab,
|
||||
# ueberschoss auf der Eiche um mehr als das Doppelte. Jetzt steht die
|
||||
# Stueckzahl da und wird eingeregelt; der Test prueft sie DIREKT.
|
||||
print("")
|
||||
print("%-10s %8s %8s %8s %8s" % ("Preset", "S1", "S2", "S3", "S4"))
|
||||
for pname in ("baum", "eiche", "birke"):
|
||||
reihe = bauen(pname, wachstum=True, stufen=4)
|
||||
pro = tg._cards_pro_stueck(card, None)
|
||||
dg = bpy.context.evaluated_depsgraph_get()
|
||||
zellen = []
|
||||
for st in reihe:
|
||||
bl = bpy.data.objects.get(st.name + "_Leaf")
|
||||
n = tg._card_zahl(bl, pro, dg) if bl else 0
|
||||
gt = float(st.get("growth_t", 1.0))
|
||||
ziel, _, _ = tg._stufen_anteile(gt)
|
||||
zellen.append((n, ziel))
|
||||
if ziel:
|
||||
# 25 % Toleranz: die Bisektion arbeitet auf einer diskreten
|
||||
# Punktverteilung, exakt treffen kann sie nicht.
|
||||
if abs(n - ziel) > max(2, ziel * 0.25):
|
||||
fails.append("%s/%s: %d Cards, Ziel %d - die Regelung trifft "
|
||||
"nicht" % (pname, st.name, n, ziel))
|
||||
print("%-10s %8s %8s %8s %8s"
|
||||
% (pname, *["%d/%s" % (n, z if z else "voll") for n, z in zellen]))
|
||||
|
||||
print("")
|
||||
if fails:
|
||||
print("ERGEBNIS: %d FEHLER" % len(fails))
|
||||
|
||||
Reference in New Issue
Block a user