Tree Generator v1.5.0: Ast-Dicke folgt der Elterndicke

Aeste/Zweige werden per Instanz-Scale an den Radius ihres Elternpunktes gekoppelt
('Input Radius' auf der Punkt-Domain von Instance on Points). Oben am duennen
Stamm sind die Aeste dadurch automatisch kuerzer und duenner statt gleich dick.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-29 10:57:26 +02:00
co-authored by Claude Opus 4.8
parent e210789eaa
commit 514684f576
5 changed files with 35 additions and 8 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
schema_version = "1.0.0"
id = "stylized_tree_generator"
version = "1.4.0"
version = "1.5.0"
name = "Stylized Tree Generator"
tagline = "Parametrische Baeume, Palmen, Bueschen mit Wachstums-Stufen"
maintainer = "D4rkst3r"
+4 -4
View File
@@ -32,7 +32,7 @@
"id": "stylized_tree_generator",
"name": "Stylized Tree Generator",
"tagline": "Parametrische Baeume, Palmen, Bueschen mit Wachstums-Stufen",
"version": "1.4.0",
"version": "1.5.0",
"type": "add-on",
"maintainer": "D4rkst3r",
"license": [
@@ -48,9 +48,9 @@
"Mesh",
"Modeling"
],
"archive_url": "./stylized_tree_generator-1.4.0.zip",
"archive_size": 11373,
"archive_hash": "sha256:421a702f2e5b088988db638dd7cbfb49de8126397476cfe192441bf069983c55"
"archive_url": "./stylized_tree_generator-1.5.0.zip",
"archive_size": 11772,
"archive_hash": "sha256:fe45391647074729afaac194801ab55c0d004c38f36b94737fdd6715e9c9501c"
}
]
}
Binary file not shown.
Binary file not shown.
+30 -3
View File
@@ -1,7 +1,7 @@
bl_info = {
"name": "Stylized Tree Generator",
"author": "D4rkst3r",
"version": (1, 4, 0),
"version": (1, 5, 0),
"blender": (4, 2, 0),
"location": "View3D > Sidebar > Tree Gen",
"description": "Parametrischer Baum-/Palmen-/Busch-Generator (Geometry Nodes) mit Wachstums-Stufen",
@@ -326,9 +326,23 @@ def build_group():
pass
L(dirv.outputs[0], _sock(align, "Vector"))
inst = N("GeometryNodeInstanceOnPoints"); inst.location = (1050, 320)
# Aeste an die ELTERNDICKE anpassen: "Instance on Points" wertet Felder auf
# der Punkt-Domain aus, dort liefert "Input Radius" den Stammradius genau am
# Ansatzpunkt. Ohne das sind Aeste oben (duenner Stamm) genauso dick wie
# unten - und damit dicker als der Stamm selbst.
prad = N("GeometryNodeInputRadius"); prad.location = (900, 120)
pratio = N("ShaderNodeMath"); pratio.location = (1050, 120); pratio.operation = 'DIVIDE'
L(prad.outputs[0], pratio.inputs[0]); L(V["Trunk Radius"], pratio.inputs[1])
pscale = N("ShaderNodeMapRange"); pscale.location = (1200, 120)
L(pratio.outputs[0], pscale.inputs["Value"])
pscale.inputs["To Min"].default_value = 0.35 # nicht ganz kollabieren lassen
pscale.inputs["To Max"].default_value = 1.0
pscale.clamp = True
inst = N("GeometryNodeInstanceOnPoints"); inst.location = (1400, 320)
L(_out(c2p, "Points"), _sock(inst, "Points"))
L(_out(bsetr, "Curve"), _sock(inst, "Instance"))
L(pscale.outputs[0], _sock(inst, "Scale"))
if align is not None:
L(align.outputs[0], _sock(inst, "Rotation"))
@@ -439,9 +453,22 @@ def build_group():
pass
L(sdir.outputs[0], _sock(salign, "Vector"))
sinst = N("GeometryNodeInstanceOnPoints"); sinst.location = (2850, 520)
# Zweige ebenso an die Dicke ihres Elternastes koppeln.
sprad = N("GeometryNodeInputRadius"); sprad.location = (2700, 300)
sbaseref = N("ShaderNodeMath"); sbaseref.location = (2700, 180); sbaseref.operation = 'MULTIPLY'
L(V["Trunk Radius"], sbaseref.inputs[0]); L(V["Branch Thickness"], sbaseref.inputs[1])
sratio = N("ShaderNodeMath"); sratio.location = (2850, 240); sratio.operation = 'DIVIDE'
L(sprad.outputs[0], sratio.inputs[0]); L(sbaseref.outputs[0], sratio.inputs[1])
sscale = N("ShaderNodeMapRange"); sscale.location = (3000, 240)
L(sratio.outputs[0], sscale.inputs["Value"])
sscale.inputs["To Min"].default_value = 0.4
sscale.inputs["To Max"].default_value = 1.0
sscale.clamp = True
sinst = N("GeometryNodeInstanceOnPoints"); sinst.location = (3150, 520)
L(_out(sp, "Points"), _sock(sinst, "Points"))
L(_out(ssetr, "Curve"), _sock(sinst, "Instance"))
L(sscale.outputs[0], _sock(sinst, "Scale"))
if salign is not None:
L(salign.outputs[0], _sock(sinst, "Rotation"))
sreal = N("GeometryNodeRealizeInstances"); sreal.location = (3000, 520)