Get the latest Blender, older versions, or experimental builds.
Stay up-to-date with the new features in the latest Blender releases.
Access production assets and knowledge from the open movies.
Documentation on the usage and features in Blender.
Latest development updates, by Blender developers.
Guidelines, release notes and development docs.
A platform to collect and share results of the Blender Benchmark.
The yearly event that brings the community together.
Support core development with a monthly contribution.
Perform a single donation with more payment options available.
Theory - Basics
Example - Rock Generator
Theory - Data Structure
Example - Simple Rock Scattering
Theory - Fields
Example - Advanced Rock Scattering
Example - Tree Generator
Theory - Attribute Propagation
Example - Grass Tuft Generator
You can join Blender Studio for €11.50/month and get access to all of our training & film content
May 16th, 2022
Download the file created in this video here: grass_tuft_generator.file.blend
Join to comment publicly.
really well done!
This was great thanks, really enjoyed your diagrams to explain some of the tougher concepts, I think the new visualisation in 3d will help a lot, going to have to play with this to fully grasp as some things are still a bit foggy , so the more ways we can understand the source of the values and see their flow is going to be useful. The spreadsheet is a great start. Thanks again!
@Rob Mulally Thanks for the kind words! Yes, Blender 3.4 will finally have an integrated geometry nodes preview system for the viewport, including an attribute overlay to preview fields. That will make it a lot easier to understand what is happening in the node-tree. Also for educational material, like this, this will be incredibly valuable. :)
Very well done tutorial, Simon. Thank you for the effort that went into creating this series.
You're the reason why I signed up for Blender Studio! :)
Looking forward to the next videos. Thank you for this walk through.
@David Rivera This was actually the last video from this series. I went over all the fundamental concepts that make out geometry nodes. But Hopefully I can find some time to do another training series that gets more advanced after our current film project.
@Simon Thommes Thank you . you are a great teacher
@David Rivera +1
This is such a great refresher, very clear as always thank you Simon!
May I ask whether this course has been updated or there will be more course updates later
@陈雨冬 for the time being the videos that are currently available will be the extent of the course. I'm open to add more chapters/tutorials later on, but in the coming months I will be busy with our current open movie production. So during that time that will definitely not happen.
In the Grass Tuft generator , I did not properly understand the curling outwards method. Why do I have to vector rotate the captured position node to get them aligned properly? The explanation doodle was a bit unclear for me. Any resources for that would be very much appreciated.
Also, after before realizing the instances, the smaller grasses has smaller radius in the resulting curve to mesh. But after realizing the instances, everything is uniform. How do I tackle that?
Other than that, its a perfectly fine course. And I am really glad that I enrolled in this.
The actual vector rotation is done on the position of the points in order to create the curl effect. This happens for each point of the curves with the given parameters for the rotation axis, the rotation center and the angle. So these parameters have to be passed in for each of the points.
The rotation center should be the point where a grass blade stands on the ground for the proper curl effect. Otherwise the grass blades are stretched on one side and shrunken on the other side of the rotation. This gets more important the further away from the object center a grass blade is and that is what the first sketch is about. To get this position for all of the points that needs this information as the rotation center you need to capture the position attribute of the instances so that this position is propagated to all points of a curve when the instances are realized.
The rotation axis (so the axis around which the points are rotated) can also make use of this root position. That is what the other sketch is about.
The reason that the radius of the smaller blades is smaller as well without realizing the instances is that in that case only one single curve is actually turned into a mesh and then instanced around, scaling it down. That is how instances work, they refer to some geometry that can be transformed independently per instance.
When the curves are realized first and then turned to a mesh. This actually happens on each curve individually and so the radius on them is the same, as they are not scaled down afterwards.
I hope explaining tit in more detail like this helps you out!
@Simon Thommes I think that the initial portion of Satyaki's question was a point I am also confused on. We capture the the position attribute, normalize it to get a direction to rotate, and then rotate that direction around the z axis finally adding that to the random value.
@Gary Brimer I didn't realize hitting enter would send a comment. It is confusing that the direction derived from the position of the curve origin would then need to be rotated. The only thing I can think is that we are then using that direction to inform an axis around which we are using to offset points, not an axis around which we are rotating geometry. But it would be nice to find a place to learn more about this type of math. It's always almost making sense. I really appreciate this entire series and without it I don't think I would understand geometry nodes at all. Thank you Simon!
@Gary Brimer Hopefully I can clear this up more:
For the curling we don't simply offset the points into a direction, but actually rotate them around an axis. This axis is different for each grass blade though and depends on the grass blade's position. A simple way to create the axis that we need to rotate around is to rotate the blade position by 90deg around the Z axis. This is what the graphic is supposed to illustrate.
You can also think of an example:
A grass blade standing on the X axis needs to be rotated around the Y axis to be tilted away from the origin.
I second the earlier commenter asking about additions to this course. I would love to see later chapters cover volume topics. For now, good luck on the movie production!
@Kevin Healy There are a lot of areas of geometry nodes that are either in current development, still in the design stage or simply just a plan for the future. I think in a lot of cases it would probably make sense to approach most of these topics in a practical way with a more workshop oriented course whenever the time has come.
Volumes for example are an area that still is really limited in what can be done with nodes, though there are some really interesting developments currently!
Thank you for the course, these examples are very helpful. I apologize for asking a similar question but I am also struggling to understand the logic of how some of the effects like the curl and distance mask are driven after a couple times through the video, and how the setup could be modified. I can follow your steps exactly but am wondering how or if different fields could be used. Could the distance mask refer to an empty object's location or another arbitrary point? What if the mesh circle was not at the origin? Could it be instanced multiple times on a plane or along a curve and still work? Any additional examples would be helpful, even if there is no accompanying video.
@Micah Sibert These kinds of questions will become more clear as you are using geometry nodes more. everything follows a clear logic that just takes some time to figure out all the details and fully internalize. So that logic is what I am focusing on in this course. Most of the nodes we currently have are quite low level and thus not very smart. They simply perform very clear tasks, so what inputs are used for that is in the hands of the user.
For example, if the mesh circle was not at the origin, you could still perform the same effect, you simply have to know the actual origin center and consider that in your operations (position - center). But in terms of workflow it is usually good to keep things simple. Split off separate steps into individual node-trees or objects and use instancing in a smart way. That saves performance and does not alter the geometry/shading. Instancing the grass tufts on a plane is what I am doing in the example scene. There is no reason here to stuff all of this into a single node-tree and do the deformation part of curling the blades after instancing.
position - center
I agree that for this it would be helpful to just see more examples, but I simply don't have the time to prepare any more of those. But that's were I really recommend just trying things out yourself.
Incredible... Thank you!
@Simon Thommes Many thanks for this very helpful course!
I am having some suggestions concerning functionality I currently can not find in geometry nodes (Blender 3.3.1). In case there is already something like a "geo nodes wish list", please let me know.
Suggestion 1) In order to further individualize the application of geo nodes on several objects, having something like a "this"- or "self"-functionality in the Object Info node would be great. This way, e.g. the location of the object a given geo node modifier is applied to would be accessible in the node tree dynamically, without having to pick a certain object.
Suggestion 2) Having a random number per object like with the "Random" output of the Object Info shader node would serve a similar goal, again helping to further randomize the application of geo node modifiers on multiple objects.
Suggestion 3) (Presumably more complex to implement and control) Imagine an object with one (or more) geo node modifiers with exposed inputs. Instead of manually picking some nice looking ones out of the numerous possible variations (like you did with the four large/medium/small rocks in the rock scatter example), a system that varies all exposed parameters of "instantiated" objects with geo node modifier(s) automatically (each parameter within its respective bounds) would be great to populate large scenes in a fully procedural and non-repetitive way.
@Hermann Vortisch 1) Is already implemented in Blender 3.4
2) We're aware of that use case I want to have it as well. The current idea is to utilize the custom property system to not only pass a random value per object into the system. But potentially multiple that you could also manually adjust. It would just be randomized whenever the object is duplicated. This would also basically solve 3)
@Simon Thommes 1) nice, thank you for letting me know! 2)+3) Is there any way to integrate parameter randomization in the existing UI of the geometry nodes modifier, like adding this "property" in a similar fashion as setting a geometry nodes input to be controlled by an attribute?
Anyway, I am looking forward to the solution the blender devs will come up with!
@Hermann Vortisch I agree that it would be nice to have a single place to have an overview of the parameters like the modifier panel.
With the ability to access custom object properties in geonodes and also in shader nodes it becomes a bit unclear where that place would be. I'm not sure what the best answer to this is. There are different ideas floating around to package procedural assets in a more generalized way and this topic is part of that.
Hello Simon, first of all: Thank you very much for this great tutorial series. It's good to have a source that explains the "hows" and goes beyond a "cooking recipe" to follow.
I finished the Grass Tuft Generator and it works like a charm. Then I started tinkering with it a bit, to some success.
Where I am stuck is: I'd like to make the Distance Mask also influence the base Radius of the Blades of Grass, so that the outer, shorter blades also are thinner. Like newly sprouted blades.
But when trying to funnel the output of the distance map into the curve radius, all blades get individually changed along their lenght, in a similar way to what the spline already does.
I feel that's probably something to do with the "position" being used in the wrong context, and therefore tried different ways to capture the position attribute of the distributed points and applying those, but failed.
Can you give me a pointer on how to achieve this?
It seems I am failing to understand something important here and would like to remedy that. :D
Thank you very much,
@Jan Simowski Hey Jan, I'm glad you liked the course!
I see what you are trying to achieve, but I'm not sure how exactly you have been trying it so far. I'll just try to explain best I can how exactly I would go about this:
The same as the root position is calculated per spline by capturing it on the instances you want to use an attribute per spline. In this case, as you only need the root position, you can just use the same attribute that is already being captured.
Setting the radius, however needs to happen after you realized the curve geometry, as all the different splines needs a different radius and that radius attribute is defined on the point domain. So you can simply add a Set Curve Radius node after the Realize Instances node and use the mapped distance as the Radius input.
Set Curve Radius
The only issue now is that you are fully overwriting the radius you had previously set. So additionally you should add a Radius input node and multiply your mapped distance as a factor.
That should give you the result you were looking for. Let me know whether this made it clear what you were doing wrong before :)
@Simon Thommes Thank you Simon for your quick and on-point reply!
Core of my issue was as you mention the missing "Realize Instances".
I was thrown off by the fact that the Scale Instance does work for the lenght of the grass before Ralize Instance. Funny enough I even found a combination where the pre-realize-scaling in principle also worked for the thickness of the grass as desired, but without the single blade getting pointy, and I could not marry that with the spline. I got a bushel of tubes so to speak.
So ultimately I followed your Advice, and am now calculating a Distance from the position we captured already via Vector Math Node and feed that through a Map Range and a Float Curve into another Set Curve Radius. The Map Range considers how large the patch is, so that the falloff in Thickness matches the size.
It appears I will have to stick my nose more deeply into the "attributes & domains" concepts, as that topic is still a bit fuzzy for me at the moment.
Again, your Series and Help is much appreciated. I took a peek into your Procedural Shader Series already and will delve into that once I feel I got a firmer grasp on the Geonodes. I expect to model for 3D-Printing a lot, so the Geonodes are probably more crucial to me than the shadernodes.
@Jan Simowski That's great to hear!
It's true that the different topics like attribute domains and geometry components take quite some getting used to in the beginning. Maybe try watching the theory parts of the course again. I tried making them as in-depth and at the same time concise as possible for exactly that purpose, so people would be able to rewatch a certain topic without having to go through hours of material. But that also means that upon first viewing some details might get lost, as it's very dense with information.
This is a great tut, but are you going to do more when you get a chance on simulation and curves etcetera?
@Steven L Fleshman I'm planning to. Time is a bit limited between the movie projects and wroking on Blender development, but hopefully I can extend a chapter about simulation nodes soon