GeoTree: Procedural Trees in Geometry Nodes

Sorry bout that. It might be useful sometimes, but W Guy’s solution is more what you were asking for.

I don’t know though, you may want the smaller twigs to have higher resolution anyway.

It fixed it somewhat, but it’s still not totally under my control. I still maybe only want to have one or two branches coming off the smaller limbs, while keeping the longer ones more dense.

You know, if this whole project has shown me anything, it’s that I should’ve spent more time paying attention to trig in school. When it comes to making logical processes using raw math inputs, I am not too slick.

The newer rev is looking much, much more natural and realistic.


I love when you spend a good hour overthinking something, only to find out the solution is about the most simple thing in the world.

All I had to do was put a resample length node inside one of the branch axis nodes. Doing the same for the trunk and limbs now allows me to distribute branches on the trunk regardless of the underlying geometry, since it’s sampling spawn points from off the resampling directly.


GeoTree v0.3! Now with new Trunk Node! (1.7 MB)


Actually there was an add-on that used a mesh to define the shape of the canopy, but it had issues with the trunks coming out a bit wonky. It was used for Big Buck Bunny. This looks really good, btw. I am going to try it out.

1 Like

Introducing GeoTrees 0.41. With more randomness and other various nice things to make trees with!

Next up:

  • Combine the twig and branch trees into one node, and create a new specific leaf node.
  • Set it up so that the lower limbs carry larger, more complicated branches.

GeoTree_v0.41.blend (3.9 MB)

edit: and there’s one bad bug I’ve just come across. Turns out Limb Radius By Position isn’t working quite as intended. In fact, it’s pretty janky at the moment.


Great work, the variability is getting a lot better!

I finally caught onto the name of the project, and changed the thread name to match.

I wouldn’t use the Z position to drive the limb radius. Instead, I recommend using the sample curve node to find the position of a branch along the main spline, and use that to drive the radius.

1 Like

I’ll try that tomorrow. Right now, I’m working on the new branches. The results are promising, but I’ve still got a TON to do here.


You are making a really good tree generator here!


This is the basic output of the new branch nodes.

And this is the new output when they’re put together.

End result? More realistic trees with hanging leaves that look like they’re being dragged down by gravity, and a poly count that isn’t super ridiculous.They pass the basic test in that they sorta look like the trees in the woods across the street from me.

Though I feel I need to do something to add the random wild flavah back in.


GeoTree 0.5. Calling it halfway done, because I feel this is a base I could generate any tree from. I’d like some feedback on this one, since things are done slightly differently compared to previous versions. (1.6 MB)


This is maybe getting really picky, given the amazing work you are doing, but on looking at the new branch node I notice the tip of the branch continues without any leaves at the end.

In general I think this is a little unrealistic, in that if there are a health amount of leaves, then they usually end up as the last tip of the branch, unless for some reason the tree has been mostly stripped of leaves or that part of the branch is ‘dead’, in which case there are no leaves at all.


Yeah, that’s due to an issue that’s plagued me since day 1. You’ll notice that I rarely ever push the limbs and branches to their utmost distribution limit. That’s because the corresponding instances don’t quite pay attention to the size of the radius of the spline they’re being grown off of. Once you get near the tapered ends, you start seeing big tubes being spawned off little tubes, which looks goofy.

Fortunately for me, it’s only noticeable when you’re zoomed close in, and I’m hoping to solve the issue via Radius By Position, which will scale down the instances the farther away from the base they go, and/or calculate the size of the radius at the position an instance is being spawned from, and limit the radius of the ensuing instance accordingly.

I’ve yet to get it to work, but it’s something I’ll be working on from here on out now that I’ve got the basics roughly done.

Edit: Hey, yall! Check this out! I dunno what it’s good for, but BY GOD, I WILL FIND A USE FOR IT!

Ahh, yes, that’s a bit of a problem. Wish I could help, but all this is a bit too much like coding, which just does my head in.

1 Like

perhaps you could think on bool chices to manage different kind of leave generation…

1 Like

And also that rule for the main shape based on the light’s main direction.


Yeah, I’m not exactly the most swift of coders myself, which I’m really starting to feel now that I’m getting into parts that require raw math expressions to achieve.

Fortunately, I have a ton of Youtube videos and StackExchange links queued up to help me out. Thank god for the internet!

This will definitely come in handy. Right now, my biggest concerns are “looks cool,” and “doesn’t hurt performance too much,” but I will have to address pure realism at some point.

It is done. Finally. Thanks to Zeroskilz, and a fortunate Erindale video I came across that helped give me a step by step guide through what was not at all an intuitive process (seriously, it took 5 freaking transfer nodes), I managed to get my limbs, branches, and twigs to scale properly.

It’s still a little limited. I need to find a way to better control growth beyond a fairly rigid average. But for now, it’s great for younger to lightly mediumish aged trees. (1.6 MB)

I’d say this is the best proof I’ve seen that all this effort is actually worthwhile. This is easily the best looking forest I’ve ever made, and all I did was instance some splines.

Coming soon, once I figure some more stuff out.



GeoTrees 0.58: Now with roots!

I’ve set it so that you don’t have any Z control over the roots, rather they just snap to the underlying geometry defined through what I call the Root Anchor Object. I like the results, but it is a little finicky, being yet another procedural object that seems to be effected as much by the origin of the object you’re anchoring it to as the underlying geometry.

I’m going to work on the leaves next, but I’d like for some people to run it through a couple of scenarios. See how it works out for you, so I can tell what needs to be changed.

I think one thing I need to do is set it so that the snap can also consider -X and -Y, rather than solely -Z. That would probably make it snap to the steeper curves more cleanly, without the occasional spazzy error.

Edit: Slightly updated version, for added realism. (3.1 MB)


If there are any other scripts that make roots, I do not recall them, so congrats for breaking ground.

1 Like