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