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 @@
|
|||||||
schema_version = "1.0.0"
|
schema_version = "1.0.0"
|
||||||
|
|
||||||
id = "stylized_tree_generator"
|
id = "stylized_tree_generator"
|
||||||
version = "1.4.0"
|
version = "1.5.0"
|
||||||
name = "Stylized Tree Generator"
|
name = "Stylized Tree Generator"
|
||||||
tagline = "Parametrische Baeume, Palmen, Bueschen mit Wachstums-Stufen"
|
tagline = "Parametrische Baeume, Palmen, Bueschen mit Wachstums-Stufen"
|
||||||
maintainer = "D4rkst3r"
|
maintainer = "D4rkst3r"
|
||||||
|
|||||||
Vendored
+4
-4
@@ -32,7 +32,7 @@
|
|||||||
"id": "stylized_tree_generator",
|
"id": "stylized_tree_generator",
|
||||||
"name": "Stylized Tree Generator",
|
"name": "Stylized Tree Generator",
|
||||||
"tagline": "Parametrische Baeume, Palmen, Bueschen mit Wachstums-Stufen",
|
"tagline": "Parametrische Baeume, Palmen, Bueschen mit Wachstums-Stufen",
|
||||||
"version": "1.4.0",
|
"version": "1.5.0",
|
||||||
"type": "add-on",
|
"type": "add-on",
|
||||||
"maintainer": "D4rkst3r",
|
"maintainer": "D4rkst3r",
|
||||||
"license": [
|
"license": [
|
||||||
@@ -48,9 +48,9 @@
|
|||||||
"Mesh",
|
"Mesh",
|
||||||
"Modeling"
|
"Modeling"
|
||||||
],
|
],
|
||||||
"archive_url": "./stylized_tree_generator-1.4.0.zip",
|
"archive_url": "./stylized_tree_generator-1.5.0.zip",
|
||||||
"archive_size": 11373,
|
"archive_size": 11772,
|
||||||
"archive_hash": "sha256:421a702f2e5b088988db638dd7cbfb49de8126397476cfe192441bf069983c55"
|
"archive_hash": "sha256:fe45391647074729afaac194801ab55c0d004c38f36b94737fdd6715e9c9501c"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
BIN
Binary file not shown.
BIN
Binary file not shown.
@@ -1,7 +1,7 @@
|
|||||||
bl_info = {
|
bl_info = {
|
||||||
"name": "Stylized Tree Generator",
|
"name": "Stylized Tree Generator",
|
||||||
"author": "D4rkst3r",
|
"author": "D4rkst3r",
|
||||||
"version": (1, 4, 0),
|
"version": (1, 5, 0),
|
||||||
"blender": (4, 2, 0),
|
"blender": (4, 2, 0),
|
||||||
"location": "View3D > Sidebar > Tree Gen",
|
"location": "View3D > Sidebar > Tree Gen",
|
||||||
"description": "Parametrischer Baum-/Palmen-/Busch-Generator (Geometry Nodes) mit Wachstums-Stufen",
|
"description": "Parametrischer Baum-/Palmen-/Busch-Generator (Geometry Nodes) mit Wachstums-Stufen",
|
||||||
@@ -326,9 +326,23 @@ def build_group():
|
|||||||
pass
|
pass
|
||||||
L(dirv.outputs[0], _sock(align, "Vector"))
|
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(c2p, "Points"), _sock(inst, "Points"))
|
||||||
L(_out(bsetr, "Curve"), _sock(inst, "Instance"))
|
L(_out(bsetr, "Curve"), _sock(inst, "Instance"))
|
||||||
|
L(pscale.outputs[0], _sock(inst, "Scale"))
|
||||||
if align is not None:
|
if align is not None:
|
||||||
L(align.outputs[0], _sock(inst, "Rotation"))
|
L(align.outputs[0], _sock(inst, "Rotation"))
|
||||||
|
|
||||||
@@ -439,9 +453,22 @@ def build_group():
|
|||||||
pass
|
pass
|
||||||
L(sdir.outputs[0], _sock(salign, "Vector"))
|
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(sp, "Points"), _sock(sinst, "Points"))
|
||||||
L(_out(ssetr, "Curve"), _sock(sinst, "Instance"))
|
L(_out(ssetr, "Curve"), _sock(sinst, "Instance"))
|
||||||
|
L(sscale.outputs[0], _sock(sinst, "Scale"))
|
||||||
if salign is not None:
|
if salign is not None:
|
||||||
L(salign.outputs[0], _sock(sinst, "Rotation"))
|
L(salign.outputs[0], _sock(sinst, "Rotation"))
|
||||||
sreal = N("GeometryNodeRealizeInstances"); sreal.location = (3000, 520)
|
sreal = N("GeometryNodeRealizeInstances"); sreal.location = (3000, 520)
|
||||||
|
|||||||
Reference in New Issue
Block a user