Tree Gen 1.27.0: Blatt-Cards aus einer Collection (Punkt 3)

"Leaf Card" kann jetzt eine COLLECTION sein: je Blattpunkt wird zufaellig eine
Card gezogen (Pick Instance, seed-stabil). Damit legt der Nutzer 4-6
Diamond-Cards mit unterschiedlichen Atlas-UVs an und die Krone mischt sie.
Rueckwaertskompatibel - ein einzelnes Objekt geht weiter, die Sammlung hat
Vorrang.

Umsetzung: Collection Info mit Separate Children (sonst kaeme die Sammlung als
ein Klumpen an und Pick Instance haette nichts zum Auswaehlen), Geometry-Switch
zwischen Einzel- und Sammlungspfad, Instanz-Index aus einem Random Value, dessen
Obergrenze aus der TATSAECHLICHEN Anzahl kommt - eine feste Obergrenze wuerde
bei weniger Cards Luecken erzeugen. Geometry Nodes kann einen leeren
Collection-Zeiger nicht selbst pruefen, deshalb setzt make_leaves einen
"Use Collection"-Schalter.

Beweisfuehrung im Test: die Zufalls-Groesse wird ABGESCHALTET, dann kommt jede
Groessenabweichung nur von der Card-Variante und die Anzahl verschiedener
Face-Flaechen ist ein exakter Zaehler. Gemessen: Einzel-Card 2 Flaechen (ein
Card-Paar), Sammlung mit 4 Cards 10 Flaechen - alle Varianten kommen vor.
Gleicher Seed identisch, anderer Seed anders.

Nebenbei: die Vorpruefung des Blattwerk-Operators war eine zusammengesetzte
Bedingung, die bei gesetzter Sammlung ohne Einzel-Card auf None zugriff.

Neu: tests/test_blatt_varianten.py. 20 Tests bestehen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-08-06 06:48:25 +02:00
co-authored by Claude Opus 4.8
parent 46b4e9ee34
commit 29899c0aa0
8 changed files with 263 additions and 18 deletions
+35
View File
@@ -352,6 +352,39 @@ Gras-, Blumen- und Farn-Bueschel. Der Kern ist die **Wind-UV**:
## Stylized Tree Generator
### Spielfertiger Stand-Baum (Faellsystem)
Knopf **Spielfertig exportieren** im Export-Panel: Stamm und `_Leaf`-Ebene
werden zu **einem** Mesh mit **zwei Material-Slots** verschmolzen
(Slot 0 = `M_Bark`, Slot 1 = `M_Foliage`). Die getrennten Objekte im Blend
bleiben die Arbeitsebene — verschmolzen wird nur die Export-Kopie. Ursprung
Bbox-Unterseite Mitte, FBX-Einstellungen wie in der Fels-Pipeline.
**Kugel-Normalen** (Haken `Kugel-Normalen auf Blaetter`, Standard an): alle
Blatt-Normalen zeigen radial vom Kronen-Schwerpunkt nach aussen. Ohne das wirkt
jede Card wie ein eigenes flaches Blech und die Krone flimmert im Licht. Der
Schwerpunkt kommt **nur aus den Blatt-Faces** — der Stamm wuerde die Mitte nach
unten ziehen und die Kugel verkippen.
> Bewusst direkt ueber `normals_split_custom_set` statt ueber den
> Normal-Edit-Modifier: der muesste vor dem Export angewendet werden, und
> angewendete Modifier plus Custom Normals ist genau die Kombination, bei der
> der FBX-Export gerne flachbuegelt. Am **reimportierten** FBX gemessen:
> mittlere Radialitaet **1.000**, 100 % der 510 Blatt-Loops ueber 0.8.
> Gegenprobe Rinde 0.043.
**Card-Varianten:** `Card-Sammlung` nimmt eine Collection mit 46 Diamond-Cards
unterschiedlicher Atlas-UVs; je Blattpunkt wird eine zufaellig gezogen
(seed-stabil). Eine einzelne Card geht weiter — die Sammlung hat Vorrang.
Zwei Fallen beim Bauen:
- Ueber `bmesh.from_mesh` zusammenzufuegen haengt die Geometrie zwar an, wirft
aber die **Material-Indizes** weg: danach lagen alle 748 Faces auf Index 0.
Blenders `join` fuehrt die Slot-Listen zusammen und rechnet die Indizes um.
- `join` loescht das zweite Objekt; jede gehaltene Referenz darauf ist danach
tot. Die Aufraeumliste fuehrt deshalb **Namen** statt Objekte.
### Proportionen: gemessen, nicht geschaetzt
Drei Presets sahen falsch aus. Die Ursachen wurden gemessen bzw. belegt, nicht
@@ -572,6 +605,8 @@ gefiltert `.\run_tests.ps1 -Filter panels`.
| Datei | prueft |
|---|---|
| `tests/test_baum_export.py` | Stand-Baum: ein Mesh, zwei Slots, Ursprung, **Kugel-Normalen im exportierten FBX** |
| `tests/test_blatt_varianten.py` | Card-Sammlung: alle Varianten werden gezogen, seed-stabil, Einzelobjekt weiter moeglich |
| `tests/test_proportionen.py` | Baum-Proportionen: Palmenkrone, Strauch-Breite, Setzling-Schlankheit, Branch Count 0 |
| `tests/test_bruchstuecke.py` | Bruchstuecke: Volumen 100 % des Muttersteins, dichte Topologie, genau ein Erz-Stueck, Material-Slots, Ursprung, UCX je Teil |
| `tests/test_schnellstart.py` | Schnellstart: jede Sorte liefert ohne Nacharbeit Geometrie + Slot, Erz-Sorte ueber der Dichte-Schwelle, Dissolve-Bereich streut je Stein |