Procedural Modelling In Blender With Geometry Nodes | Joe Baily | Skillshare

Playback Speed


  • 0.5x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 2x

Procedural Modelling In Blender With Geometry Nodes

teacher avatar Joe Baily

Watch this class and thousands more

Get unlimited access to every class
Taught by industry leaders & working professionals
Topics include illustration, design, photography, and more

Watch this class and thousands more

Get unlimited access to every class
Taught by industry leaders & working professionals
Topics include illustration, design, photography, and more

Lessons in This Class

42 Lessons (3h 58m)
    • 1. Welcome To The Course

      4:15
    • 2. Downloading The Right Version Of Blender

      1:54
    • 3. How To Activate The Node System

      6:55
    • 4. Adding Our First Node

      3:42
    • 5. Creating A Basic Shape

      13:25
    • 6. A Review Of The Basic Chair

      3:18
    • 7. Applying The Modifier

      5:28
    • 8. Using Mesh Nodes

      5:14
    • 9. Combining Object Info And Boolean

      7:53
    • 10. A Drinking Glass

      4:08
    • 11. Modelling A Button

      7:21
    • 12. Modelling A Button Using Another Object

      4:59
    • 13. Introducing Our Procedural Table

      2:44
    • 14. Using Vector Nodes To Build A Table

      12:35
    • 15. Combine XYZ

      6:42
    • 16. Naming And Organising Your Nodes

      7:38
    • 17. Finishing The Legs

      13:32
    • 18. Assigning Parameters To The Modifier

      6:34
    • 19. Adding Leg Thickness

      9:22
    • 20. How Math Nodes Work

      7:04
    • 21. Using The Math Nodes

      4:38
    • 22. Fixing The Leg Size

      8:31
    • 23. Finishing Touches

      3:57
    • 24. A Review Of The Table

      7:55
    • 25. Making Our Drinking Glass Procedural

      8:16
    • 26. Preview Of The Forest

      1:21
    • 27. Using Point Nodes

      7:28
    • 28. Attribute Nodes

      6:42
    • 29. Per Vertex Instancing

      3:18
    • 30. Instancing With Collections

      4:42
    • 31. Attribute Randomize For Scale

      3:51
    • 32. Attribute Randomize For Rotation

      2:34
    • 33. Create A Forest Exercise Geometry

      8:33
    • 34. Create A Forest Exercise The Nodes

      7:42
    • 35. Materials For The Forest

      7:20
    • 36. Changing The Point Distribute Method

      6:40
    • 37. Using Vertex Groups For Density

      4:47
    • 38. Using Weight Painting For Vertex Groups

      2:45
    • 39. Using Empties For Control Overview

      1:12
    • 40. Creating New Attributes

      4:36
    • 41. Your Trees Are Too Tall

      3:09
    • 42. End Of Class Challenge

      1:34
  • --
  • Beginner level
  • Intermediate level
  • Advanced level
  • All levels
  • Beg/Int level
  • Int/Adv level

Community Generated

The level is determined by a majority opinion of students who have reviewed this class. The teacher's recommendation is shown until at least 5 student responses are collected.

200

Students

--

Projects

About This Class

Welcome to one of the first, if not 'THE' first course on procedural modelling in Blender using procedural nodes.

In this course we cover how to create both singular objects and entire scenes using a node system not unlike the one that has been used to create materials in cycles since Blender 2.7X. If you are used to creating materials using nodes then you will have a good starting point for learning geometry nodes as the process and structure and generally the same when building node systems. The key difference between the two systems is the nodes that are used.

In this course, we learn how to create objects by creating instances through our nodes, allowing us to build simple shapes with just a couple of different types of nodes. As we move through the sections we will introduce more nodes leading to more spectacular creations.

But of course the point of geometry nodes is not simply to build an object. The point of geometry nodes is to build an object and THEN be able to edit that object using non destructive parameters. We are going to learn how Blender pulls this off and how you can create a new workflow for building objects.

Not only can we procedurally create objects but entire scenes as well. Using point nodes we can distribute an object across an entire seem in a manner similar to using particle systems, only this time with nodes to control the different parameters.

We are not only going to be covering the various nods in this course, but also HOW the nodes are used. So that by the end of each project you will be able to understand what a specific node is responsible for.

We hope you enjoy creating objects with nodes in Blender.

Meet Your Teacher

Teacher Profile Image

Joe Baily

Teacher

My name is Joe Baily and I am an instructor for 2D and 3D design. I specialise in 3D modelling using software platforms such as blender and 3DS max to create virtual models and assets for video games and animations.

My alternative job involves teaching sport and PE in schools and so I have 1000's of hours teaching experience in multiple various fields. My goal here is that I always find great instructors in websites like youtube who are great but never give out enough content to really satisfy my own hunger for learning. Therefore, my goal on skillshare is to provide comprehensive quality teaching on any subjects that I cover, such as blender 3D.

See full profile

Class Ratings

Expectations Met?
  • Exceeded!
    0%
  • Yes
    0%
  • Somewhat
    0%
  • Not really
    0%
Reviews Archive

In October 2018, we updated our review system to improve the way we collect feedback. Below are the reviews written before that update.

Why Join Skillshare?

Take award-winning Skillshare Original Classes

Each class has short lessons, hands-on projects

Your membership supports Skillshare teachers

Learn From Anywhere

Take classes on the go with the Skillshare app. Stream or download to watch on the plane, the subway, or wherever you learn best.

Transcripts

1. Welcome To The Course: Have you heard about a future of the CG industry? Its notes, procedural modelling has arrived in Blender and it looks set to change the gain of the CG in the string. If you want to learn about this awesome new way of creating objects and entire scenes in blender. Then this is the watts course for you. Here whereby you design. Our goal is to give you the best possible educational concepts and resources to upscale in any CG related topic, from 3D modelling to texture painting to animation. Who is this course aimed towards? This course is for users or blender free day who want to upskill in creating objects and scenes completely procedurally. This will allow them to create their objects and then edit post objects using nondestructive methods to improve overall workflow, both in terms of creating an individual objects and also an entire scene. Using the right notes. A basic knowledge of 3D morphing in blender and the use of nodes to create materials will go a long way for you in the early stages. As these will help you to cover the basic concepts of using geometry nodes. Beyond that, it is important that you have blender version 2.92 or newer installed on your device as geometry nodes do not exist in older versions, such as better version 2.91 and older. In this course, we starts off simple introducing the note editor system that those who may not be familiar with notes. We then create our first shape using nodes, which will be a simple share using a combination of just two different swipes of notes that will be used to create an entire object. We create a few more basic shapes, introducing more nodes along the way, such as booleans and the objects in from node a to further manipulate our shapes. Then in the next section, we begin making our objects truly procedural by creating and exposing parameters that will allow us to adjust our models that we create in real time. This is where we really explore the power of procedural modeling using notes. Going through. We will cover the roles of each node that we use to create our models. Explaining how they work and how different combinations of nodes will affect the final outcome. After that, we take things to the next level, once again, by going from creating 3D objects to entire scenes, by using what are known as points nodes. Think of this as the node system's way of creating particle systems. And then up again are we introduce, describe, and demonstrate new notes in this section and how they work, including the aforementioned point nodes to create our object instances and the attribute nodes for controlling things like the rotation and scale of our individual objects. The main goal of this course is to beat the one-stop shop course for you to learn everything he needs to know about geometry nodes in blender. There has never been a better time than right now to begin learning this brand new skill. Not only is it in new to you, but it's also new to Blender itself. And it looks and to change the gain or free day for many years to come. Site, what are you waiting for? Let's get started. 2. Downloading The Right Version Of Blender: If you are one of the early adopters to this class, then you may come across an issue where you can't find your geometry node editor in Blender. There's normally one reason for this, and that reason would be that you are using an older version of Blender. If you are not using a version of Blender, That is, I have a 2.92 or newer. You will not have geometry nodes accessible. In order to get blender version 2.92, you need to click on the download blender button located a blender.org. As of the end of February. This will read as 2.92 and beyond. For now at the time of this recording, it's 2.91.2, which will not have geometry notes. The question here is, how do you get access to 2.92 or 2.9? Free. To do that. Just scroll down to the bottom where it says go experimental and download blender experimental. This takes you to the download page where you can download IFR, the next versions beta or the alpha for the version after that. Now, for commercial work, it's not recommended to use any versions like this. It's always best to use the stable version. But for the sake of education, go ahead and download either of these options. I use 2.3 alpha at the start of this course. And then once you have that all set up, you'll be able to begin using geometry nodes. 3. How To Activate The Node System: Geometry nodes are pretty much brand new to Blender, and they allow us to create procedural 3D models by only using nodes instead of the more traditional editing tools that you will find in objects mode and edit modes for your selected objects. In order for us to access our geometry node editor, we're going to just bring up our timeline here. And then we're going to come to the editor type menu. We're going to open this up. And you should see the geometry node editor located under general. So left-click to change this panel to the geometry node editor. Now, as you would expect from any node system, there are come sleep no notes. To add nodes to this Geometry tree. Click on the new button located here. This add a new geometry tree with two nodes to start with. We have the group inputs and the outputs. Both of these are going to be required for any no truth to create. The output is the final result of the geometry no tree. So any nodes that you place in between these two nodes are going to be accumulated by the end in this group output node. The group input node, on the other hand, is where you can assign values that you can change in the Modifiers tab, which we will be doing in a few moments. You will always need the group inputs and output nodes for your no tree in order for it to function properly. Now, let's take a very quick look at some of the nodes that we're going to be learning about in this course. Now what you see in front of you is a list of all of the different nodes that are used with our geometry node system. This is the current selection of nodes available as of blended version 2.92 beta. As time progresses, you can be sure that more nodes are going to be added to the geometry node system. But for now, let's just quickly introduce what we have available. So in the top corner, we have the main group nodes, the group inputs, and the output which we have already discussed. We also have what are known as attribute nodes. When we talk about attributes, which geometry nodes, we are effectively most of the time talking about things like the location, rotation, and scale of an object, along with other attributes as well, such as the color. Next we have the color nodes. So this is great for the application of materials potentially further down the line. And that in a moment we have the color ramp combined RGB and separate RGB notes. Next up we have the geometry nodes. Now, right now there are only two geometry nodes, but they are both very important and we're going to be learning about these two in particular, very, very soon, we have the joint geometry node, which is going to be used to combine different instances of geometry together. And the Transform node, which as you might guess, will allow us to manipulate an object's translation, rotation, and scale using nodes instead of the values in the 3D viewports. Up next, we then have our input nodes. So here we can input various data like the vector values, traditional values, and object information. Beyond that, we have what mesh nodes located here. This is going to be more fun stuff where we're going to be actually using these nodes to procedurally model our 3D objects. For example, we have the boolean and subdivision surface nodes, which we will be making use of in this course. The next group of nodes are the nodes. Now this might be an unfamiliar terms to you, but point nodes are effectively used as a sort of means of using a particle system to instance objects onto a plane or specific area. You will actually find that this is the most progress parts of the geometry node setup as of version 2.92. So we're going to be taking a look at the point nodes further along in the course. Then we have our utilities. These are effectively things like math nodes to allow us to, we calculate other nodes to gain better control. And then we have the vector nodes located here. Vector node influenced specific attributes that involve using the x, y, and z axes. For example, again, location, rotation and scale. That's just a brief introduction into all of the present nodes for the geometry node system. In the coming lectures, we're going to be introducing many of these nodes to you and how to use them to create 3D models and scenes by using procedural modelling techniques with the geometry node system. Before we add any nodes to our setup here, I want to take your attention to the Modifiers tab. So if we go to our modify our Properties tab, you can see that we in fact have a new Modifier labeled as geometry nodes. Below that you'll see the node sets up that we can select. Now we can create multiple geometry nodes to attach to this modifier. But below that, we will soon be able to add various inputs depending on the nodes that we are using. The now, the one thing we are able to do is we name this node tree. So I'm just going to rename this from geometry nodes by left clicking on the line. And then let's just type here in basic. Since we're just going to start off by creating a basic objects using what geometry node system. 4. Adding Our First Node: So let's get started by adding our very first node to our basic node tree. We're going to start by adding the Transform node, since we're going to recognize very quickly how would this node works in blender. To add a new node a to our setup, hold down shift and press on your keyboard to bring up the Add menu. You can either go to Search and type in what she wants to find. Or when it comes to the Transform node, you can go to the geometry section and select transform. So we're going to left-click and that's going to add our new node. But we need to attach it to the no tree. So I'm just going to hover the Transform node until the new door that connects the glute inputs and group output nodes is highlighted. Then I'm going to left-click to confirm and attach it to my setup. Now you will notice that it will automatically attached to the first inputs for the Transform node and be released on the first output that the Transform node, that is geometry outs and geometry in below that, we have our values afford the translation, rotation, and scale. As she would no doubt have recognized, this looks almost identical to what you see in the side panel here for the location, rotation, and scale. And it works in pretty much the exact same white. We can manipulate the transform values here to change our location on the x, on the y and the z axis. We can also manipulate the rotation on each axis as well. By the way, I'm right-clicking each time to cancel my change in location, rotation and scale just in case you weren't sure. Finally, we have the scale value itself. Again, we can scale our object on each of these individual axes as touched upon in the previous lecture. You can add to what you see in the Modifiers tab. By adding more inputs to the input node, we can take any free input form, our Transform node, for example, we can click and drag and positioning into an empty socket that you will see at the bottom of the loop input node. It should snap into place. Once you get close enough, then release the left mouse button. And now the translation will disappear effectively from the Transform node and be added to the group input node. So you can see here that we are no longer able to manipulate the transform values for the location inside of our transform. Note, the reason why is because those same values are now positioned he in our geometry node for the Modifiers tab. We can do the same with our rotation. And also with our scale. We can do this with any free inputs that we have in our no true. So now instead of having to always come back to our code editor, we can just go to the Modifiers tab itself to manipulate these values. 5. Creating A Basic Shape: In this video, we are going to be creating a basic shape by using two different nodes, the Transform node and the joint geometry node. In the previous lecture, we introduced the Transform node and how it works. This time, we're going to add a second node known as the joint geometry node. Again, we are going to hold down shift and press. I, go to geometry and select joint geometry. Left-click and we're going to position this here. Now this doesn't do anything straight away. But what we have with the joint geometry note is we have to geometry inputs. The way we're going to use this is we are going to take this geometry output from the group input node, click and drag. And we're going to connect it here. Now what we have is two outputs form this geometry node, one into the transform and one into joint geometry. That doesn't look too changed anything here. But watch as I manipulate the translation on the x-axis. So I'm just going to manipulate this. And you can see we now have two cubes. So what exactly is happening here? Well, each time we create a noodle form, this geometry outputs and connect it to another node. What we're effectively doing is we are creating a new instance of the base objects. So in this first geometry slot here, we have our cube objects that was influenced by the Transform node. But in this second slot, we have a second cube that has been generated but is not affected by this transform note, I hope that makes sense. So if I was to basically hit shift D, which allows me to duplicate a node and a position, this one down here. And manipulate the transform on the x-axis again. But in the opposite direction. You can see we now have control over each of these cubes. Now keep in mind that they are both still apart of the same objects. They are just different parts of that object. So what we're going to do here is we're going to be using the transport and joined geometry nodes to create what appear to be the shape of a basic chair. So the first instance of this cube is going to act as our seat. And the second instance is going to be one of the legs just to start us off. That means I'm just going to take this translation value back to 0. And let's just reduce it on the z axis scale to a value of, let's go with points one. And then with our second instance, let's move it on the x-axis temporarily back to 0. We're going to scale it on both the X and Y axis to a value of 0.1 on each axis. And then we're going to just reposition it. So I'm going to move it along the x-axis to about here. Value of 0.8 looks good. And then a value of 0.8 on the y-axis as well. And finally it move it down on the z. So we have the seat of a chair and a leg. Next, we need to add more legs. So how do we go about adding more legs? Form here. Well, effectively all we need to do is repeat the process of adding more instances of our cube objects. So we're going to take the joint geometry and transform nodes here, and we're going to hit shift D to duplicate them. I'm then going to position this about here. Select and then just attach and detach again. Then we need to take this geometry node and attach it to our group inputs. Like so. Now if I take the translation values or list Transform node that we duplicated and begin to manipulate them. You can see that we have another leg. So I'm going to use the value of minus 0.8 on the x axis to create our second leg for armchair. Now we need to repeat the process a couple more times. In order to create the final two legs site, we're going to again select these two nodes. It shift D to duplicate and position. Take the geometry outputs of this joint geometry node and plug it into here. And then plugged this joint geometry node into here. Then we need to connect this Transform node to the group inputs. Just click and drag and position. And this time, let's manipulate the y value, 4.8 to minus 0.8. That's legged number three. And finally, for the last leg, same thing again. Select them both. Shift D to duplicate, attach wherever required. So like so. My need to zoom out a bit now because the node tree is getting bigger and bigger by the second, make sure all the nodes are quickly attached. And this time, we're going to manipulate the x value again, two positive 0.8 and press. And so at this point we've now got our seats and we've got four legs. But let's go a little bit further. Let's add a few more nodes and create the back of our chair. Now, let's treat this as an exercise. This is why I want you to do. I want you to create two more instances of our cube. And just create two small cubes that will act sort of like methyl attachments. So about he and he. And then create another instance of the cube, which is going to be the actual back or vice chair. So you guys want to small cubes here and here roughly. And they're going to attach to the seat or the back of the seat, which is going to be positioned here. So pause the video and see if you can finish creating a chair by adding a few more instances of our cube. Okay? Well, once again, we're going to continue the process of taking a transform and joint geometry node, hissing, shifty and positioning, making sure that everything is in the correct place and connected correctly. And this time we're going to need to do a little bit more manipulation when it comes to both the translation as well as the scale of our newly created cube at the moment, we can't see it. So I'm just going to move it along my x-axis to about here. I'm going to start by reducing the z scale to 0.1. And that actually might be too big. So I'm going to make it even smaller than that, 0.05. Then I'm going to increase it on the X axis. So we're going to create a little bit more length on the x-axis. Just a little bit more. So 0.2 looks fine. Then I need to position it in the correct place. So I want to position it about here. We're going to move it up on the z-axis to evaluate CRO, just for the moment. And then move it on the X-axis to about more go about here. So a value of minus one on the x axis. So that's one of our supports for the back of the chair. Now we need to create the second. And this should be a little bit easier because we're only going to once again need to manipulate the one value, which is going to be the y value for the location, I believe. So. Again, select your two nodes shifty. And make sure everything is attached correctly. Click and drag, click and drag. And then click and drag. And will also keep them relatively scaled in terms of the distance between them. Sake this y value. And just move it to 0.8 on the y-axis. Kay, so we're making good progress. Now. We have just the actual back of the chair to create and lava than this time selecting and duplicating this Transform node. I'm actually going to take this transform node and duplicate it. The reason why is because with this transform now this represents the actual seats. And the dimensions of the seat are almost exactly what I want for the back of the chair. The only change I am going to make is going to be the rotation. So I'm going to with the Transform node here selected, hit shift in D to create a duplicates. And making sure not to position it's anywhere. I don't want to, I'm just going to hit control Z to undo that. So select shift D and position back. He then create a duplicate of the joint geometry node and position. Then connect to here. And then connects the geometry outputs to this geometry inputs. Now interestingly enough, you will have noticed that when we created the duplicates of dish transform, it did not actually duplicate these values because they're now located here outside of this transform node. So when we duplicate a node, when its inputs have already been connected, we end up just creating a default version of that node. In this case, we created another Transform node that has the default values on all three axes for all free transforms. But that's fine. Because now what we can do is we can take the x value here and reduce it to a value of around 0.1 and press enter. Then we can reposition on the x and z axes. And long behold, we have finished our basic chair. So congratulations, if you were able to get food and create this basic shape of a chair using only a cube objects. Now, as the geometry node system progresses in blender, there are going to be much more effective ways of being able to create your shapes using geometry nodes. However, this was a great exercise to start off with as it covers the basics of how and where to attach some of the most basic nodes. From here onwards, we are going to be gradually increasing the number of nodes that we will be using. Were not that often going to end up with a tree that looks like this with a ton of transforms in joint geometry nodes setup in this way. In the coming lectures, we're going to be looking at how we can't manipulate the shape of our objects by using mesh nodes, such as the subdivision surface and also the Boolean nodes. 6. A Review Of The Basic Chair: In this video, we are just going to review each of the nodes that we have created for our basic Share. And just make sure that we are aware of exactly what the role is of each of the individual nodes. So we start off with an overview of what we have created. If we start form this side, working across, we have our group input node where we can position any free nodes into so that we can make them available in our Modifiers tab. The first transform Note that we see here represents the seeds part of our Chair. And the one directly below it represents one of the four legs. We combine these together by using the joint geometry note, making sure that the geometry inputs of each transform is connected to the group inputs. Note that if we do not do this, the geometry does not read and we end up missing a leg in this case. So make sure to attach the geometry note to the group inputs. From there on, it's a process of winds and repeats, just varying the transformed values. So this second joint geometry node allows us to create a second leg where we just manipulates the values on the translation axes. So the x, y, and see, the main difference here is the change in the x axis. Again, this continues with the next two node, another joint geometry to add another leg. And then the transform to position that leg. Then one more joint geometry with another Transform node. Final leg. By this point, we have all four legs on our chair. Afterwards we have free more combinations of the joint geometry transform nodes, which allow us to create the supports that the back of the chair. That would be these two nodes here. And then the final transform would represent the very back of the chair, which is this part of our objects. So this is a very simplistic no tree to use just to get started with, it only really uses two different types of node, the Transform node and the joint geometry node. And uses them in a way where we can repeat each time to create a new instance of the base keep object, and then reshape and reposition that instance to create the basic shape that we have come up with. As we move through this course, we're going to be adding to the complexity by adding new nodes. But as we add each node to our process, we're also going to pay close attention to detail on how these nodes work and how we can combine different nodes combinations together. 7. Applying The Modifier: One of the most important things to remember about geometry nodes is that in order for them to be truly procedural, they have to be editable in real time. This means that h geometry node system is effectively always a modifier. We already know this because we can locate this geometry node sets up here in the Modifiers tab of the Properties panel. But what does that mean if we were to go into edit mode for our object? Well, let's try it out now. So let's go from objects mode to edit mode. You will see that we have the shape of the chair steel in our scene. But now what is also highlighted is the original cube in its original dimensions. If we edit, this cube was made using this geometry node system. But what does that mean for editing the actual objects? Well, let's see what happens if we attempts to edit this cube. I'm going to select the top face. I'm going to hit the icky to insert. And then I'm going to hit the E key and extrude down. Do you see what's happening with the actual chair model? It's being manipulated in real-time as we added the basic shape. If we go back into objects mode, you can see that the change in the geometry has been applied to each individual instance of our key object. You can't see in the legs because the inset and extrusion was actually made on the top face of each leg, but you can see it on the seat of the chair, as well as the back of the chair. It's important to keep in mind that making changes to the base objects after you have created your no tree is going to create a profound impact, at least in this scenario on the final results. And this may or may not be what you intend. The main advice here is that if you are going to combine editing tools in edit mode with the procedural workflow of the geometry node system, it would probably be better to create the edits in the 3D view port first so that you know what you're working with before you start adding in any notes. Now I'm just gonna hit control and C a few times to undo all of the changes that I made in edit mode. And the other thing that I want to show you is the fact that because this is a modifier, it can in fact be applied. Now once you apply a modifier, the procedural nature of those tools will disappear. So it will no longer become procedural, it will become permanent. And then any edits that you make, particularly in edit mode, will become basically destructive. They will permanently, permanently change your model. But if you want to apply your geometry node system, you do so the same way as you would any other modifier. You come over to this arrow here for your geometry nodes modifier, left-click and select, apply. As soon as I do this, the node sets up disappears from the node editor. If I left-click on this Browse to be Links menu, you can see we do still have the geometry nodes system available to use. It's just no longer being applied to this chair object. Instead, if we hit tab to go into edit mode, you can see that we have a fully created chair with the geometry applied to each individual parts. Now what this means is that we can't select these individual parts and then manipulate them. So for example, we could take the top face here. We could hit the icky to inset. And then we could perhaps hit the E key to extrude down. We're able to do this now without affecting any of the other parts of our model. Alternatively, we can also select the different parts of our model. If I press the arrow key on my keyboard to select the back of the chair. I can then grab, rotate, and scale this piece independently. I can also do the same with any of the legs. So for example, select a leg and then manipulates, selects another leg and manipulate the transforms. So every single instance of the key created is effectively what is known as an island. It's an individual set of vertices used to create a point of the model. But because of the way that we created our node system, all of these parts are independent and can be edited independently from each other. 8. Using Mesh Nodes: In this video, we're going to be demonstrating how we can use mesh nodes to manipulate the shape of our objects. So why I am going to do here is rather than just straight up deleting all of the nodes that we have created. I'm instead going to create a new node tree for r cube objects. If we want to create a new node tree, all we have to do is press on the X button located here to unlink the data block. So when we do that, it appears as if we have deleted the node tree that we created. However, if we go here to browse our no trees, you can see that we have the no tree still available in blender. To make absolutely sure that a notary doesn't disappear at any point. Click on the shield icon located here to create a fake user. This why, even if a specific node tree is not being used by an object, it will still be maintained when you exit blender and then re-enter it later on. There were important step if you want to keep your node setups. As for right now, we're going to unlink the data block again and click on the new button. This will add a new sets of geometry nodes. So once again, we have the default setup of our group inputs and group outputs. Here, I'm just going to rename this no tree as mesh. Since the main focus of this node tree is going to be to test out some of the mesh nodes available with our system. The first thing that we're going to do here is we're going to turn our geometry nodes quantifier into a subdivision surface modifier. We're going to use the subdivision surface node, which we can locate by holding Shift and I, locating our mesh nodes and then selecting subdivision surface. Then we're going to position our subdivision surface node over this noodle and left-click. So if we zoom in, you'll see that we have a couple of options that we can manipulate with the subdivision surface node. The main option here is going to be our level. So it's commonly sets one. And you can see the effect in the free viewport. We can manipulate this value to increase the number of subdivisions on R cube. But a better thing here is to attach this option, this property into the group inputs so that we can use it in the Modifiers tab. To do that, as you remember, will be to click and drag and position in the empty slot. Release. And then you have your level located in your modifier, in the Modifiers tab. So from here, we can now again increase and decrease the level value for this subdivision surface node. Now, from here, I might want to do something CLI, transform my cube into a disc shape, which I can do so by increasing the number of levels for my subdivision surface node. And then it just adding a transform node. Which I can do so by typing in the search bar and positioning the Transform node He before my subdivision surface node. Then I can manipulate the scale value on the z-axis to a value such as 0.2, for example. And this creates what appears to be a disc shape in our free DVI ports. Now there are other mesh nodes that we can use, such as the boolean node. The Boolean node is located in the same place that the subdivision surface node is. So hit shift and I go to your mesh menu and select Boolean. Now we're not going to attach it to anything just yet. We're just going to position it about he. Now the way to brilliant node works is, as you might expect, it will take one object and it will either intersect, unionize, or defined the difference between the two objects that are attached. Now currently, we only have one objects here. And that is the object that is created like a desk. In the next video, we're going to demonstrate how the Boolean node is going to work with this setup by combining it with another node known as the object info node, which is going to allow us to choose a nova mesh object to act as the boolean. 9. Combining Object Info And Boolean: In this video, we're going to be using the object info note and combining it with the Boolean node that we have here in our node set up to create a hole in our disk. Now what we need to do here first of all is add our object info node. So hold Shift and press ie. We'll go search, type in objects. And the only option we see here is objects info, left-click. And we're going to position this one about here underneath our subdivision surface node. Now if we zoom in on the object info nodes, you can see that we have a variety of options. 40, location, rotation, and scale of a specific object or its actual geometry. We also have the option to go with either the original or relative transforms. For now, let's just look at the main output that we're going to be focusing on. And that's this geometry output. So we're going to take this geometry output and plug it into the second input here. We're also going to take the output from the subdivision surface, plug it into here, and then take the boolean and pop it in here. Now, by default, this doesn't do anything. The main reason why is this object info node has no object assigned to it. But of course we don't even have a second object in our scene. So let's do that now. We're going to hold down shift and press i mesh. And let's add a cylinder objects. I'm just going to go to my operator panel here. And let's just reduce the number of vertices down to 16 to reduce the amount of geometry here. I'm then going to scale this down to here. Hold down control and I, and apply the scale for my cylinder objects. So next, I go back to my desk, go to this object's option here, left-click. And I can choose from a variety of different objects in my sing. The one I'm going to pick is cylinder. Now that makes a change straightaway. So now it's using the cylinder. And basically what's happening here is we're only being left with the geometry from the disk that takes up the same space as our cylinder, which is the opposite of what we want. We're looking to create a whole. So that means we need to change this boolean type from intersect something else. If we go Union, we're effectively going to be joining the two together. So we are going to be using the cylinder objects to create a cylinder shaped to our disk. Or we could go with difference. Now difference doesn't look like anything in particular is being done. But actually what's happening here is with the different setting. We're punching a hole right through the center of our disk. Now if I was to just apply this, so go to Apply and then move my disk objects or in fact MOOC my cylinder objects. You can see. That we have been able to create a hole in our disk as a result of using the Boolean note. So I'm just going to hit Control Z a few times until we get our node tree back. And now I'm just going to make a couple of changes to the scale and location of our cylinder model. I'm going to select it and scale it on the xy-plane. So hold down shift and press Z to lock to the z plane and just scale it in a bits to about here. Then grab and move it on the Z plane again to about here. Now what you will have noticed straight away is that we still have our hull. Now, there's a reason for that, and it's not the fact that we previously applied the geometry nodes modifier because we did Undo that process we've controlled and see and still have the geometry nodes located here. So what's going on here? Well, what's happening is the cylinder is still being used to generate the hole in our model. However, we are using the original transforms of that objects. If we select our cylinder, you can see that the location is different. So it's no longer 000. And the scale has also changed as well. What this means is that these changes that we have made have not been applied it to the object info note. But in order to do so, we can simply change our setting from original to relative. So if I left-click to go relative, you'll see that the hole in the middle has disappeared. Because now Blender is using the scale, location, and location values of the cylinder in its current state rather than its original one. So what this means is we could perhaps take this cylinder, for example, and create a duplicate movie on the x axis. Go back to our cube. And what we can do here is something similar to what we did with our chair. We can take our Boolean node, hit shift and they create a new duplicates due to sign with our objects in 4-node. Plug it in here, and change the object to the second cylinder that we created. We can repeat this process two more times. So I'm just going to go shift D, shift D to create two more booleans. We can create the object info note a couple more times. Make sure to duplicate these two. So select them both. Its shift D, move on the y-axis and position about here. Then go back to our disk objects. Change the selection for each of these so that we're using a different cylinder each time and connects to the correct nodes. Now again, while doing this, it doesn't appear as if any changes have been made to our main model. But if we were to go and apply this and then move the model, you can see we created a four holes through our desk using this Boolean method. So this is just one example of being able to combine the boolean and objects in phone nodes to use other objects to create things like holes or basic changes to our geometry by using the geometry node system. 10. A Drinking Glass: In this video, we're going to be creating the shape of a drinking glass. Now the one thing that's going to differ here form our previous creations is the starting objects. Up to this point, we've been using the basic cube. But this time we're going to start with an object that is more representative of what we want to create. I'm going to start by deleting the default cube, and I'm going to replace it with a cylinder objects. Now for now, I'm just going to keep all of these settings as they are. And we're going to make our changes using the geometry node editor. We're going to change the timeline to the geometry note editor and click on the new button with the cylinder selected to add our group inputs and glucose output nodes. Then we're just going to drag up and zoom in so that we can see dynodes more clearly. The first thing I want to do is I want to scale this drinking glass up on the z axis. How do we do that? Well, we do that by using our trust the Transform node. Let's bring the Transform node in to our scene by attaching it to the two nodes. And then let's increase the scale by a factor of free. Press enter. And we have a tall drinking glass. Now I'm going to also scale it up on the x and y. So let's just move it's up to about 1.3 on the x and also 1.3 on the y. Now this is a very large drinking glass, but we're not worried about the exact dimensions, which is worried about creating the general shape. Next, what we need to do is we need to basically create the Boolean body inside of the drinking glass. To do that, we're going to add a second instance of our cylinder. So hit shifty and position down here. Then we're going to add ourselves a billion node. So locates your Boolean node, which should be located in the mesh section. Position here. Connect the bottom Transform and also connect it to the group inputs. Sets the value for the Boolean to difference. And at this point the cylinder disappears. The reason why it's disappeared is because the two transforms have exactly the same values. What we're going to do is reduce the scale on the x and y. But rather than reduce the scale on the Z-axis, we're going to just bring it up on the z-axis ever so slightly. So we're going to manipulate this translation value on the Z just to touch. And that gives us a hole in the top. But it also allows us to keep the bottom of our cylinder. And there we go. Nice and simple. We use the first transform to create the basic shape of the cylinder by manipulating the scale. The second transform is combined with the Boolean node to create the actual glass itself or the Boolean within the glass that transforms it form a cylinder into a hollow objects. And we do this by making sure fats, the transformed values for the x and y scale are slightly smaller with our Boolean. And that we also move it up just slightly on the z axis. Very quick, very clean. 11. Modelling A Button: In this video, we're going to be creating a simple object that has a button on it. The first thing we're going to do is we're going to set up our scene so that we have our geometry note editor. Click New, making sure to cube is selected to add our geometry node's. Next we're going to create the shape of the basic object. To do that, we're just going to zoom in. We'll drag this up a bit more so that we can get a good view of the node tree. And then we're going to start by adding a transformed node to determine the general shape. Hit shift, I. Go to geometry and select a transform. We're going to position it about here. And now let's influenced the scale. So we're going to lower the scale on the x-axis to about Queen free. And also increase on the y axis to a value free. So we have what looks like over modes or a control of sorts. And now what we're going to do is we're going to create a button for this remote. There are a few ways that we can do that. But the first method that we're going to demonstrate in this video is to create a new instance of the cube objects and then used that as the button. So we're going to hit shift and D to duplicate. We're going to hit shift and I to bring up the Add menu and this time bring in a joint geometry node position. It's about here. Take the bottom Transform and pop it into this input here. And then connect the geometry to the geometry. Now at the moment they're both exactly the same scale. So we're going to just bring that forward on the x-axis. Just a touch. Lower the value on the y axis to one. And let's also low are the x-axis just a bit. Bring that forward and lower the z scale to about something like this. If we zoom in on our object, we've got the base objects and we've got a button. Now the buttons are a little bit too far out. So let's just lower the transform value here to about 0.17. And I think that's pretty good. Now the one problem that we have here is the fact that it's still just looks like it's one object. There's no indentation here, which you would normally see on a remote or a controller. So what we're going to need to do is we're going to need to create the indentation. And we can actually do that by using this additional instance. Well, we have to do is change this form joint geometry to billion. So we're going to temporarily get rid of the joint geometry node. And then we're going to bring in a Boolean node position here and make the appropriate connections. Now at the moment we've got it, sets it intersect. We could either go Union, which joins them together or difference. And that difference creates the whole union, just joins them together, but that just looks exactly the same as the joint geometry node. What we're going to do here is we're actually going to define it by the difference. And then we're going to add a new instance of this transform load. So we're going to bring the group helped put back here. We're going to bring back our joint geometry node and position it's behind the boolean. Then we are going to take the Transform node here, hit shift dy position here. And plug this in. Connects the geometry from the group inputs into here. And while it looks as though we've just gone around in circles and ended up with the same cube in the same place. What we can now do is just manipulate the scale values for this transform node. So for example, if we manipulate hits on the y axis to a value of 0.95 and press Enter and just plan our view. You'll see we now have that little bit of an indentation on each side. I actually think that's a bit too much it. So let's go with something like 0.98 and presenter. And then let's do something similar on the z-axis. So a value of 0.18, press Enter. And there we go. So now we've got a button on a remote. But we also have the indentation that gives it just that little bit of extra detail. So let's review what we have done here. We started off with the first transform node. And this node here represents the main object and its general scale. You can see that we've manipulated at the scale values board domain objects. We then wanted to create a hole in this objects, which we could do by combining a second Transform node to determine the scale of the whole. And then position each of these into a Boolean node. By setting the Boolean type to difference, we effectively use the bottom Transform to cut a hole in the first one. From there. We then needed to create the button, creating the bus and just involved adding a joint geometry node and a third transform node. This transform note here is very similar to this one. The only difference is that the scale values on the y and z axes are slightly lower. This is to ensure that we have the correct amount of indentation for the button form here we can change the values as we see fits for any of the transform nodes to change the overall look of the model. So main objects, indentation, creating it with the Boolean, creating the bustle, and joining the button with the main objects. 12. Modelling A Button Using Another Object: In this video, we're going to be creating a remote objects with a button. Now you might think, oh, that's exactly what we did in the previous lecture. But the difference with this lecture is going to be the use of a novel object to act as the boolean rather than just instancing the cube itself. To start off with, we're going to set things up by bringing the geometry node at it's our interplay. Click New. And then we're going to add our Transform node by going to Geometry, select Transform and position here. Then we're going to manipulate the scale. So let's do something similar to what we did last time. 0.3 on the x-axis, free on the wire, and one on the Z. Next, we need to add to the objects that we are going to be using for the boolean itself. In the 3D viewport. I'm going to hit shift and I mesh and select cylinder. I'm going to bring up the optimizer panel located at the side. Just expand the view a bit for our work freely viewports. And I'm going to keep the number of vertices as they are. But I'm going to juice the radius to about 0.55, which is the depth, two points, 15. And then rotate on the y axis by a value of 90 degrees. Now at the moment, the cylinder is found inside of the remote. So we're just going to move it along the x axis until it sticks out. So something like 0.25 would do nicely. Next, we need to select the Cube objects and create the Boolean. The next step is going to be to bring in an object in phones node, hit shift and I go to Input and select objects info. We're going to position it here. Zoom in on our node, goes where it says objects and select cylinder. We're also going to change it from original to relative. And let's try creating a boolean for Miss, hit shift. And I go to Mesh and selects Boolean position about here, change to difference and connect the geometry of the cylinder to the second slot. If we were to hide the cylinder up form the viewport, you can see that the objects info node is indeed working because we are creating our Boolean for our remote control. The next step then is going to be to create the button itself. So what we're going to do is we're going to add ourselves a joint geometry node. This time. We're going to duplicate the objects info node. We've shifted the position here and plug geometry into geometry. Now, this presents a similar problem to last time, where the scale is the same as the boolean. So what are the solutions here? Well, let's try adding a transform node to this. Hit shift ie. Go to Geometry, select Transform and position here. Now we know we need to scale on the y and z axes. So let's see if this works. We're going to manipulate the Y-axis. And all of a sudden it's actually going in the correct direction. And let's also do the z-axis. And we have our button. It's a little bit difficult to see because of the lighting. But if we zoom in, you should see that we have the button and we also have the boolean 40 indentation. If we want, we can also increase the scale on the x-axis for the button itself, just so it sticks out a little bit more. This is just one way of creating a setup that allows us to use other objects to create things like buttons and indentations on the main objects. 13. Introducing Our Procedural Table: Over the course of the next few lectures, we are going to be creating a procedural table. Now, while this may not seem like too much of an upgrade over our basic chair, this table is fully procedural. What we have here is a more complex looking no tree. Some of the nodes you will find familiar, such as the transform and joint geometry nodes to create a separate pieces. But we also have some additional nodes here that have different colors that we will be learning about in the next few lectures. And it's these nodes that are going to allow us to make our object truly procedural. So we're going to be looking at things like vector math knows which are the purple ones here. And we're also going to be looking at combining and separating XYZ channels and why this would be useful for us. As well as introducing math nodes, which are a critical part in any procedure, will build that you create. By the time we're finished creating this no tree, we're going to be able to apply the appropriate attributes to our group inputs. And that's going to give us all of these options here. Now, as you can see, these options have been named AT specific to their purpose. So for example, if we want to adjust the sizing of our leg thickness, we can manipulate this first value and that scales up all of the legs on the X and Y axes. We can also increase the height of the table by increasing the height of the leg size. We can, if I just zoom out, manipulate the overall table size on the X and Y axes. And with these in particular, you will see how we are able to increase the size of our table on an axis, but not distort the legs. So the legs move as we increase the size of the table on either axis, but they are not distorted. We can also manipulate the table thickness, which represents the table top by itself, and the overall scale of our table. So all of these things are easy enough to understand when we look at them in the Modifiers tab. But in order to get to this point, we need to understand how each of these are created. We're going to be doing all of this in the coming lectures. 14. Using Vector Nodes To Build A Table: Once again, we're going to be using the default cube as our base for this procedural objects. We're going to start things off by selecting the cube itself and in naming it as table. Then we're going to bring up our timeline and change it to the geometry node editor. Click on the new button to add our geometry nodes. If we go to the Modifiers tab, we can rename the geometry nodes set up to whatever we want. So I'm going to name it and as table, the same name as the object itself. Next, we need to add our first transform node, so we can't manipulate the base of this table in terms of its location, rotation, and scale. So hit shift and I go to Search, type in transform, select and position. If we zoom in, we can see we've now got our Transform node where we can manipulate the location, rotation, and scale of our cube. If you weren't sure about how this affects our objects, just take a look at the transform values in the side panel. If we adopt the change of scale in our no tree, you can see that we are able to adjust the dimensions here, but not the base scale. If we manipulate the location or rotation, you can see that this does not affect the transforms in objects mode in any way. The Transform node is effectively the same as manipulating these values on a 3D objects while it is in edit mode. The only difference here is that we are actually in objects mode while making these changes. For now, I'm just going to reset this back to one. And now comes the time when we introduce our newest node to the collection. So we're going to add a factor math node, hold down shift and I go to Search and type in vector. Then choose the effects up math node at the bottom. I'm going to position here. And you can see that the outputs and inputs for defects or math node are colored purple, the same as the translation, rotation, and scale located on the Transform node. What we can do here is we can take this output form, our effects and half node and plug it into any of our transforms. So for example, I'm going to pop it into the scale value he. When I do that, the options for manipulating the scale disappear in the transform note. But what we could do here, we can now do here in the factor math node, you will notice that the cube has disappeared. And that's because these values here are set to 0. We're going to set each of these top values, 21. In order to restore our cube. So how does a fix a math node work? Well affects a math node has two factors. And effects are, is effectively dividing up the values based on either the free axes or the free basic colors. So either XYZ or RGB. In this case, we are using the first value here as our x value. The second is the Y, the third is the z. So what does that mean for the bottom free values? Well, width vector, math nodes, you can define the type of calculation that you want to use by clicking on this option here. So you can choose simple ones, such as add, subtract the vibe. Or you could use more complicated operations such as tangent, cosine, and sine. Using this node as an example, we set the base values on the x, y, and z axis for the scale. Each value below will allow us to add to the value above. So here we have a scale value of one on the x axis. If we want to use the vector math node to increase this value, we can increase this value here. So if I increase this by a value of one, it would be one plus one equals two. And now if you take a look at the dimensions of the cube, you can see that it's set to four meters, which is double what it was before. So we basically doubled scale by increasing this vector value by one on the x axis. If we were to manipulate our effective value here, we can basically add to our wire scale. And the bottom one allows us to add it to our C scale. Now as we continue to generate more nodes, you're going to see how useful affects a math node can be. For now, what I'm going to do is I'm going to set this back to 0. And let's take a look at a couple of options. So subtraction. As we know what happens when we add to these top values, it should be fairly obvious what would happen if we were to begin subtracting. So if I take this top value here, which is currently set to 0 and set it to one. What do you think is going to happen? If I press the Enter key to confer? Well, what's going to happen is that our cube is going to basically become a flat plane on the x axis because we've taken the base scale of one and we've subtracted a value of one at formats which equals 0, which means the dimension value is set to 0 here. Alternatively, if we go for a value less than 0 for subtraction, say 0.5, then we can effectively half the scale of our cube on the x axis. So what about multiplication? How does that work? Well, let's change our vector math node from subtract to multiply. And you can see straight away that the cube has disappeared. So what's happening here is we are times-ing or multiplying each individual axis by a value of 0, which in Blender is of course equal to 0 on the x, y, and z axis. So we're going to need to increase these vector values of the bottom. I'm just going to click and drag down so that I can select all three values at the same time. And type 0. Now here we have one times one equals one. So this is the base setup for using the effects are math node when sets or multiply. From here, if we want to double the scale of our cube, we can just use the value two on any axis. If we want to half the scale, we can use a value between 01, in this case, 0.5. You can also invert the scale by using a negative value. So for example, if I use the value negative one, the dimension values actually look the same. But what we've effectively done here is we have inverted our entire shape. We're actually going to be using this to solve an issue that we're going to find later on when building the tables legs. Then now let's just set this back to one and demonstrate the next option, which is divide. So in the same way that subtraction is effectively the opposite to adding, the vision is the opposite of multiplication. If we want to reduce the size on a specific axis by half, for example, say the z-axis, we simply double the specs of value here. So we use the value two. That basically means we use a value of one, divide it by two, and we get c of 0.5, which is half the original size of the cube. Alternatively, we can use division to increase our scale by using a value lower than the base. So if we use a value of 0.5, for example, one divided by 0.5 is the same as one times two, which gives us a value of four on the z axis because we're doubling the size on the z-axis. The final one I'm going to show you here is going to be this scale option, since it would take too long to cover all of the straighter y. And we really don't need to were just for now focusing on the ones that we're most likely to use. So add, subtract, multiply, divide, and scale with the scale value. It looks a little bit different. We have our original free vector values, x, y, and z. If we set this to 0, for example, you can see it behaves as normal. But instead of an additional free vector values below, we have this single scale value. This is useful because what this effectively means is we can adjust this one value to adjust all free of the upper values at the same time. So this takes whatever we have said in the effectors. And we calculate it based on this value. If I set the scale, SO2, For example, it doubles the overall scale on all three axes. Alternatively, if we set this to one and then set each of these to two, we can effectively get the same results. So I'm just going to set those banks one. And the main reason why you would use the scale operation instead of multiplication is that you can plug this value directly into your group input. And that way you would be able to affect the overall scale of your model. Whereas the alternative to this, if I was to take this scale value here and just plug it directly into a free socket. You can see that we have the option to manipulate the free transforms or the free axes border scale transform independently. There are times when you want this to be able to independently or provide a each access. And there are times when you will want to manipulate this scale as a whole. Which at this point doesn't actually work because this vector math node is currently no longer connected to our transform. So we just have to reconnect that. And then you'll see that the main scale works. But these values don't, because they're no longer connected. So always make sure that you have the correct connections applied. For now, we're going to just disconnect that. Keep the scale as is, keep the transform as is. And I'm just going to take the scale values that we have created here and just delete them for now. 15. Combine XYZ: So our next job is going to be to scale our cubed to the correct values and then add our first leg. What I'm going to do is I'm just going to set the z value here to 0.1 and press enter. This is a good starting point for the base of our table. Next, we need to add a joint geometry node and a Transform node to create our first leg. So I'm going to hold down shift and I search for transform and pop it about here. Then hit shift and I again search for joiner. Joint geometry, plugged this in here, and then plug Biche Transform node just below. Next, we're going to connect this Transform node at the bottom to this geometry output, like so. So what we can see here is predominantly this transform, this instance. We need to adjust these values. So we're going to set the x value to 0.1, the y-value. So 0.1 as well. What I want to do next is rather than manipulates the translation values form this Transform node directly, I want to use a Nawab vector math node. So I'm going to take our vector math note he hit shifting and position down here. I'm going to change this to subtract and plug it into our translates option. From here, I can manipulate values at the bottom to manipulate the positioning of this leg on the x, y, and c axes. Now, this is where things get a little bit tricky. What we basically want from our object here is the ability to scale the object, but keep the leg positioned in a specific area. So we want to position this leg, for example, in perhaps this corner or maybe this corner. And we want it to remain in that corner regardless of how we scale the objects. To do this, we need to link this scale Node with this subtracts node so that we effectively use the same values that each. We can do this by using a different node known as the combine XYZ node. I'm going to hold down Shift and then press I, go search and type, combine. And it gives us two options. Combine RGB and combine XYZ. We're going to choose combined XYZ and position here. We're going to take this vector outputs and plug it in here for the scale. And also plug it in here for subtracts. It's important not to forget the basic rule that any node connections on this side of a node can be connected to multiple inputs. So if we thing that you see on this side of the node, like this point here, this is an output for this node. You can create multiple noodles for a single output. So for example, we've got two links here. We can add as many more as we want so I can plug it in here. And here, for example. However, inputs can only ever have one connection. So I can't, for example, it's Hague, this transition value here and attempts to plug it into anything else. If I attempt to take this vector and plug it into the transition, it simply replaces is. So keep that basic flaw in mind. Meanwhile, we have a cube that has once again disappeared. So we need to set these values to one on the x, one on the war, and 0.01. on the z. So now we're making a bit of progress. But the positioning of the leg still isn't quite right. Not worried. Oh, because we can manipulate that here. So I'm going to reduce the values for the subtract vector to 0.2 on the x will go to 0.2 on the y. And we'll use a value of one for the z. And now if we take a look, we can see that we've got the base of our table as well as a single leg. Now, what does that mean for the objects at the moment? Just how procedural is this? Well, let's find out by manipulating the combined XYZ node. So if we were to adjust the X value, you can see if I just navigate my view that we are able to increase the scale of our base. But as we increase the scale of the base, you'll notice that the leg moves at the same, right? That the objects expands. What you will also notice as we increase the value on the x-axis is that even though the base of the table is being scaled, the actual dimensions of the leg we have created were mine, the sign, it's just being moved. Compare this to the traditional scaling of the objects on the x axis. If we hit S, then x, the scale, you can see that we are still able to scale the base on the x axis. But now we are also scaling the leg as well. And this is the first time that we really see the procedural potential of geometry nodes. Because here with the combined XYZ node, we can use a single value to manipulate the scale of one piece and also manipulate the location of a second piece based on the exact same value. 16. Naming And Organising Your Nodes: As a beginner, using nodes can be pretty daunting. I noticed myself from when I began using nodes for the creation or procedural textures and materials several years ago. So there are a few things that you can do to make this setup just look more pleasing to the eye. If someone were to just look at this no tree with very little knowledge of what each node does, they wouldn't really understand how it works. One thing that you can do is you can actually label individual nodes so that you can have them describe exactly what they're used for. For example, take this first transform node. This allows us to create the base instance for our table, the actual base here. So it would make things a little bit simpler if it were named as such. If you don't already have the side panel open, then your editor will look like this. Press the Enter key on your keyboard to bring up the side panel. Then go to the item tab. Here you will have information with regard to the selected node. We have the name here, it's set to transform. This is the unique node identifier. We're actually going to keep this transform name as it is. Instead, we're going to give it a label. When we give a node a label, it replaces the name in the actual node editor. So here we're going to give this transform a new name. We're going to call it table face. And actually let's give it a capital and press Enter. As soon as I do that you can see the name of our transform node has changed to table base. Alternatively, another thing that we can do is adjust the color of our nodes. For example, with our table paste no selected. We can click here, allowing us to manipulate the color. So I can open this up, left-click on this white bar, and choose a color for this node. So for example, I can set this to green. Now there are various reasons why you would want to cut out your nodes. You may want to give colors to your nodes to indicate the type of node that is being used. So for example, you might want to keep all of your transform nodes, the color green, especially if you have renamed all of your transform nodes into no tree. An alternative method of using color is two section of your no tree based on the specific roles. So for example, with this node tree, once it's complete, we're going to have several sections. The first section, which you can see he is focused on creating the bass and the first leg. Then we're going to have a second section that focuses on creating the second leg. And the third section is going to be used to create the final two legs. So in this scenario, it might be ideal to color code based on each step of the process for creating this table. Well, I'm going to do is I'm just going to take each node and just set it to green. So by doing this, I can make it very obvious at what parts of the process these nodes are being implemented. In this case, the first stage of our process, creating the base and first leg. Alternatively, we can, as we've already touched upon, rename each of our individual nodes so that we can describe exactly what each node is being used for. So with the joint geometry node, for example, we could rename this by going to the label and using join by select. And that just makes it obvious what this node is being used for. So I'm just going to go through each of these nodes and rename them. So this here is our first leg. And then we now have the joined based elect node, table, base and first leg. Now how do we name these nodes? Well, you can of course named them any way you want, but it's always best to give it an accurate enough description. So this node, for example, it tells us that it's scaling something but we don't know what. So we take look, we can see that it's scaling our table base. So let's label it as such. So scale base. And then that gives us just a little bit more of an idea of exactly what this B is being used for. Now, the one below is focused on defining the position of our first leg. If we manipulate it, we can see that we are able to manipulate the position of this leg of the table. So we need to name this as leg position. And then press enter. Then we have this combined XYZ node where we know that this combines the base table with the leg. So we're going to name this combine base to leg. And there we go. If your name is too long, you can always resize your nodes by just coming over to the edge of a node, clicking and dragging to resize. So here we've got a setup that is a little bit more easy to understand. We've got the base instance of our table. We got our first leg. We've got the node that joins them together. We've got our vector math, no, use to scale with the base of the object. We've got the leg position node here, which is used to position this leg. And then we've got this combine, paste a leg node, which effectively allows us to manipulate the leg position while scaling the base value. We're going to keep this as our method of organizing the rest of this object. As we continue to create more legs and add additional parameters that allow us to truly make this object procedural. 17. Finishing The Legs: In this video, we are going to create the final three legs for our table. Now, creating the nodes for this is fairly straight forward. We've done this sort of thing a couple of times already. So we are going to create a new instance for this node here. We can do so by duplicating it with shift and they and position here. And this is going to be to join seconds. So base, so this is going to be used to join it the second leg to the base of the objects. We also need to create another Transform node. So we're going to take our first leg he shifting and position here and plug this in. Now, this is where things get a little bit different to what we're used to. We could take this geometry output and plug it in here. The problem with this is that while we have created a new instance for our base object, in this case, our next leg which we need to rename here. This second leg is not actually connected to any of these nodes here. So the scale base, leg position and combine nodes. Because of that, if we work to begin manipulating these values, they would not affect this part of the object in any way because they're in no way connected. So what we need to do instead is take our joint based select node located here. And we need to create the connection directly from here to the second leg. Now, that makes it look very weird at this time, but we will solve this issue in a couple of moments. What is effectively happening now though, is because we are linking the second leg to this point. We are now able to use these nodes to influence this one because they're all apart of the same link. Now if we take a look at this leg, we can see that it's positioned in the middle. And it's actually using the correct c value, which is set to one, but it looks like it's scaled far too small. Why is this the case? Well, when we plug this second leg from here to here, we are already using the values located here as our base values. So what we're doing is when we set this value to 0.1 and this polytope 0.1, it's basically 0.01. at times 0.01. which is if you do the maths, 0.01 on the x and y axes. So because of that, we need to set the x values back to one. And you can see that the value on the x axis has been corrected. And then the scale on the wire. But now that we've done that, the leg has disappeared. The reason why is because when we set all of these values back to one, the location and scale of this second leg is in fact identical to the first one. We positioned it in exactly the same place with no deviation to the scale. So the big question is, how do we move this second leg over here? Well, if we attempted to use the Rotate value here on the z axis, you can see that we are able to manipulate the positioning of that second leg. So if we use a value of 90, it looks pretty good, doesn't it? However, this presents a new problem. If we manipulates our combined values again. So we manipulate this on the x-axis. You can see that we are now getting some unwanted behavior. The table is not being scaled in a manner that we would expect. To solve this. We are actually not going to use this rotation value at all. We're going to set that back to 0. And instead, we're going to use the scale value. Now you might be thinking, what's the point of that? We're just going to make the second leg smaller than the first again. But what we can do is we can actually invert the scale on a specific axis. Bear in mind that we are using the location for parties of the table base as well. So if I was to set this to minus one on the x-axis, so minus one. And then press answer. What effectively happens is we flip the positioning of the second leg. You've got to the other side. So what is a positive value on this side of the x-axis is a negative value on this side. And that allows us to alter the positioning of our second leg. If we were to test our combined node here. Remember what happened last time when we created this cross pattern? If we manipulate the X value, you can see that the behavior is much more in lines what we would expect when we want to increase the scale of our table on the x axis. If we manipulate the why, we get the same sort of result only this time scaling on the y axis. So this is the behavior that we are looking for, formed these parameters. That means we can now move on to creating the final two legs for our table. Before I do that, I want to take each of these two nodes and give them a different color. Since this is a different part of the process for creating a table. So we've might join node here selected. I'm going to change this to a yellowish color, something like that, may be a bit lighter. And then let's make this node a similar color as well. So by changing the colors, we now know that the green nodes here are the first stage of the process. And these orange nodes here, or yellowish nodes in the case of the second part of the process, which is to create the second leg. Now, we just need to add one more join node here. So we're going to just add this time joint geometry and position here. Then we're going to create one will transform. And position about here. Makes sure the connections are correct. Don't forget this time. We want to take this output and plug it in here. And that's going to have the same sort of effect that's plugging these two nodes together had. And this time what we want to do is instead of scaling on the x-axis, we want to scale on the y-axis. So we want to be able to invert both legs over to the other side of the y-axis. To do that is very easy because we've already done it on dx. Take this y value and change it to minus one, then press Enter. And there you go. You now have four legs created for your table. If we were to come back to our combined based elect node and manipulate the table on the x axis, we get correct scaling. And if we were to manipulate on the y axis, again, we get some correct scaling. If we manipulate on the z-axis. The behavior again is correct. The focus here though, is on increasing the thickness, the base of the table. So this value is going to have a different purpose to the two values above. But at this point, we've now created the base setup for our procedural table. From here, there are a couple of things we need to do. So we need to first of all, label the new nodes we've created. So join. Final two nodes or two legs, I should say, to represent this joint geometry note here. And then take this transform. And this represents our final legs. Like so. And then once again, we need to change the color. Let's make this, perhaps a pinkish color, will make this roughly the sign. And there we go. A nice colorful setup here that's relatively easy to understand in terms of the law for each individual node. To finish off, we want to create the functionality to be able to scale our entire model as we would just by manipulating the model with the S key in the Friday viewports. Now if we attempt to do that here with this open scale value, only our base of the table is going to be scaled because that's the only node that is being influenced by this vector math node. What we need to do instead is create one more Transform node. So we can do so by going shift a and then just typing in transform search bar. And we can position here then to change it so that we can manipulate all free of these values at the same time. We're going to take our scale bass note here, shifty, and position it here. That creates a duplicates of the same node, which is going to set this vector value back to one. Plugged effects are in here. And then we can use this scale value here to manipulates the entire objects in the same way that we can by pressing the S key in the 3D viewport. It's left again is to rename the nodes, making sure that we have our NO treat nice and organized. So this is going to be our scale Node, our main scale. And this one, he is going to be scale control. So this is the node that allows us to scale the entire model. And this is the node that allows us to basically use a single value instead of the vector values to perform that scaling. All that's left is to just give these final nodes their own color. I'm just going to make them a grayish color. Let's make that a bit brighter. And there we go. So congratulations on completing the table up to this point. But it's not very procedural still at this point because at the moment, we don't have any values that have been exposed here in the Modifiers tab. And we need to find out which of these values can be used in order to manipulate our table in various ways. For example, we want to, being able to control the thickness of these legs on the X and Y axes. We also want another controlled for manipulating the length of the individual legs compared to the base of the object. So over the course of the next couple of lectures, we're going to be looking at how we can expand on this by Setup and then expose some parameters into our group input node, which will allow us to manipulate our table in various ways. From the Modifier tab. 18. Assigning Parameters To The Modifier: In this video, we are going to begin exposing some of our parameters so that we can't manipulate those parameters in our Modifiers tab without necessarily always coming back to our node tree. So often nodes that we've created so far. Which of these parameters do we want to expose so that we can control our table? Would have first one that sticks out is this scale value here. We know from the previous lectures that this scale value will increase the scale of our table as a whole on all three axes. So this looks like a good one to expose. If we take a look at the group input node back here, you can see that we have a transparent connection. This allows us to create new inputs for the group input node. So we're going to do that now with the object scale. I'm going to take that bottom node. And because I have to scale out so far, I'm just going to have to temporarily move the base scale or the scale control, I should say. And then take this empty socket and plug it into here. This exposes the scale value, and we can now see it in the Modifiers tab. So we have is set to one. I'm just going to reposition the scale control back to here. Now, if we manipulate this value from the Modifiers tab, we can scale our object as a whole. So that's the first parameter that we have been able to connect 2D Modifier tab. Now, the more nodes that you create, the more messy things are going to look. So right now I have an issue where we have this scale control node, where the scale is connected to the group input and it's all functioning properly. But this scale noodle here looks like it's connecting to the scale base. Then it looks like it's connecting to the second leg. Then it looks like it's connecting to the first two legs node. In fact, if I just reposition that, it looks like it's going in to the inputs for all three of these nodes exactly. This doesn't look very good and can make things more confusing than they need to be. We need a solution here. Fortunately, there is a solution known as rerouting. Well, I'm going to do is I'm going to take my free nodes back here and just move them back. So I've used box select, click and drag to select multiple nodes at the same time. Then you click on any of the nodes and drag it to reposition. Then what I can do with everything these selected is I can go shift and I and this time I'm going to go all the way down to the bottom where it says layouts. The second option here is the reroute option. I'm going to left-click. And then I'm going to hover my cursor over this noodle that connects to the scale control. I'm going to left-click once it's highlighted. And what this allows me to do is if I press the G key, I can now reshape and reposition this noodle because of the reroute note that I have created. So here what I'm going to do is I'm actually going to take this and push it all the way up above the node setup. I'm then going to create a second reroute at the other ends. So I'm going to go shift and I again, layouts. We routes position about here. Left-click, Hit G, and move up above the notes. This just makes it a little bit easier for me to see what this scale output is being connected to. So I can now see that it comes up here all the way across to the end and down to my scale control. So that's a handy little hint for organizing once you start to create more parameters for your node setups, because those parameters are going to be located in various parts of the node tree. Now that we've done that, we need to expose a few more parameters. So to free parameters that I am going to expose this time are the x, y, and z axes for our combined node here. I'm going to take the x-value first, plug in, say the y-value, plug it in, and then the z value, and plug it in. All of these are going to be useful for once our table is finally completed. So we need to rename each of these values. We're going to select our combined based hillock node and go to the no tab in the side panel. From here, we can select the x, y, and c inputs, and we can't change the name of each. So for the x inputs, I'm going to rename this to table width. For the y input, I'm going to rename it to table length. And for the z inputs, I'm going to rename it to table depth. So this last one is going to be the thickness of the table base. The second one is going to be its length and the first one is going to be the width. Let's just test each of these so we can manipulate the scale, same as before. We can manipulate the width of the table. Like so. We can manipulate the length of the table. And we can manipulate the depth of the table base. 19. Adding Leg Thickness: In this video, we're actually going to do a little bit of a mini challenge. So what I want you to do is I want you to see if you can create two new parameters for the leg thickness and leg size. Now when we talk about the leg thickness, we're talking about the scale of the legs on the X and Y axes. When we're talking about the size, we are talking about how tall the legs are. I want you to see if you can look at the nodes you have created so far. Determine where you can influence the leg size on the free axes. And if you need to add any additional nodes in order to connect them into our group inputs. I will be performing this task in a few moments. But right now, I just want you to pause the video and see if you can figure out how to create parameters that adjust the leg thickness and the leg size. A little hint, we have already used the nodes that might be required in this node tree. So 321. Pause and go. Okay guys, well I'm now going to create the parameters for the leg thickness and leg size. Well, I want to do is I want to bring out the values for the x, y, and z scale. For our first leg. Remember, these values determine the scale for all of Allix. So if we manipulate this on the x-axis, we're manipulating each of the legs on the x axis. That means we need to basically isolate these into the free separate axes because we don't want to plug them all in to a single slot. We can do this by using a combined XYZ node. So I'm going to go shift, I, go to search, combine, and then choose combine XYZ. I'm going to position this node about here and connect these two together. This way, we're able to isolate the x, y, and z nodes. I'm just going to click and drag and set them to one. And you can see here that we basically have a big cube. So we need to make sure that we're using the same values that we did before. That's 0.1 on the x, 0.1 on the y, and one on the z. With the combined XYZ node, we're actually now able to plug these in independently. But the task that we had was to create two parameters, not free. One for the leg thickness and one for the leg size. We'll start with the tricky 1 first, the leg thickness. We're going to plug the x value from the combined XYZ node into the group input. But what we're also going to do is we're going to plug the y value into the exact same input. So we take a look at our group input node. The node labeled as x actually comes out to the combine XYZ node for both the x and y inputs. This y. When we manipulate this x value in the Properties panel, we are able to manipulate our legs on both the X and Y axes at the same time. Now, the Z value is actually easier, or we need to do here is just plugging in by itself into an empty socket. And now if we manipulate that, we can manipulate the leg size for our table. Now this presents a different problem. You can see that as we increase the leg size, the legs actually pierce through the corners of the table. In a few lectures time, we're going to be solving this issue. But for now this behavior is okay. While we sought out a view of the other issues that we have with our common setup. Now, one thing I want to address is the fact that we've got basically two neutrons coming out of a single output. In terms of the x value here. I just want to add a reroute node so that we can combine these two noodles into one certain point. So I'm going to go shift and I go down to the layouts and select reroute. I'm then going to position the reroute node about. He makes sure the x noodle is highlighted and left-click. I'm just going to hit the Z key and glad that over. And then I'm going to click and drag form this new node and position it into the y input. There we go. So that looks a little bit cleaner than what it did before. We basically have a single noodle coming out of this output. And then it splits into two, right before it's joined with the combined XYZ node. From this point, we just have to do a little bit of housecleaning. So this x parameter here represents the leg thickness. Meanwhile, the z parameter is based on the leg size. Let's also rename the combined XYZ node by going to the item tab will name this as leg control. And that's also changed the color so that it matches the other green nodes to something like that. And there we go. So now we have our table set up so we can manipulate these scale. Table width, table length, table depth, leg thickness, and leg size in their current state. That each of these parameters is basically unlimited in how we can manipulate the individual values. So for example, we can take the table depth and increase it as much as we want. But it will eventually reach the point where the base of the table here becomes so big that it just engulfs our legs. Now, we don't necessarily want these values to go too high, so we're going to want to add a bit of additional control. We can do so by defining the minimum and maximum values of each parameter. To do so, go to the nano tab in the side panel, select the appropriate input. So for example, we have leg size here. And then you can define the default value, the minimum value, and a max value. I'm going to reset this to 0 for the minimum value. And I'm also going to set the max value to one just for the moment. So now we can both decrease and increase that leg size value between 01. We can do the same with the others. So the leg thickness between 01, table depth 01. And if we test that, you can see it only reaches the bottom of the legs and then stops. And then we table length and cyber width, we want a little bit more freedom. So we're going to start with the minimum value of 0. But let's bring it all the way up to ten as the max value. Let's do the same with the width. Minimum, minimum at 0, max at ten. And now if we test these, we can increase the table width to a max value of ten and a table length by the same value. So now we just have a little bit more control over these parameters. I'm not going to adjust the scale value because I want to be able to scale it as much or as little as I've acquired. So we are going to lead the scale value as it is just for now. 20. How Math Nodes Work: In this video, we're just going to be talking about a different type of node known as a math node. Math nodes are used to perform calculations for our node setups. They differ ever so slightly from vector math nodes in how they are used. What I have here is just a new file that I've created because I just want to demonstrate math nodes without too much clutter up from the other nodes for our procedural table. So I'm going to create a new geometry node set up. And I'm just going to add a single Transform node. So here we have our transform node with our translation, rotation, and scale values. If I was to add a vector math node by just going to search and just adding a fixer math node, I can position this into any of the free transforms. For example, I can position it in the scale transform. And now I can define the base scale of each axes with these top four effective values. So type in one. And then using this add operation, I can recalculate each individual axis by manipulating each of these values. So if I wanted to double the scale on my x axis, I would simply typing one key to double the length on the x-axis. I can use different operations, such as subtraction to change the way these values are affected by the ones below. That's generally how a vector math node works. A math node is actually simpler than this. So what we're going to do is we're going to add a math node two, this setup shift and I were going to go search Chai P and at math and select the math node here. I'm just going to position here and plug it into my scale input. So let's take a look at how the math node is constructed compared to the vector math node. I'm just going to set this back to add temporarily and just bring this up and zoom in. So these two nodes are very similar in their structure. Each has two separate inputs and a single output. Whereas a fetter MAF node deals with effectors, in this case, x, y, and z. A math node will deal wish great values. So in this example, we have the top value here, which is the initial scale that we assign to our cube. And then we add the value below. It's pretty much the same as with the vector math nodes. So here we can define the vector scale on the x axis with this value. And then we can add to it using this value. The same approach is made for the maths node. The only difference is that this top value represents all three axes. And then the bottom value will allow us to add to each of these axes. As an example, if I just set this to one and the bottom value to 0, we're telling blender that we want to set the scale value on the x, y, and z axes to one. So if we open up the side panel, we can see that the dimensions are at their default, two meters by two meters by two meters. Now, as you will have no doubt have seen by this point, manipulating these values, even in the scale itself, will manipulate the dimensions, but not the base scale. So from here, what we can do is we can take the base value which is assigned in the first slot, and then we can add to it using the value in the second. So if I want to double the size, I can type one and press Enter one plus one equals two. So we're scaling it by two times on each axis. Hence, four meters on the x, y, and z. If I increase this bottom value to two, we're effectively tripling the scale because we're setting the overall scale value to free on each axis, three times two is six. So six on the x, y, and z axes. Again, this is very similar to the white defects or math node works. The only difference is that with the traditional math node scene here, we only manipulate a singular value for all three axes. So with that said, let's very quickly take a look at some of the other options that we have. So we have subtraction where as we increase this value at the bottom, we can, we can decrease the scale. Then we have the multiply function. And when we use the multiply function, our cube disappears because the bottom value is now set to 0. So in this scenario it's one times CuO, which in Blender is in fact 0. So the cube has no scale. In this case, we need to increase this value to increase the scale of our key. And then we have on Divide. Divide is effectively the opposites or multiplication. So if we were to set this to 0, once again, we can see that the cube is disappeared because you can't divide the scale of something by nothing. But if we set this to 0.1, we get a joint cube. Because one divided by 0.1 is effectively the same as one multiplied by ten. It's effectively inverted in the way it calculates the scale. So now that we have a pretty basic understanding in how a math node works and how it compares to a vector math node. Let's go back into our procedural table and see how we can use a map node to enhance the amount of control we have over certain parameters. 21. Using The Math Nodes: So we are back here with our procedural table. And this time I want to introduce a math node at some points in this setup. Now, i Math note will be used to recalculate one of the existing values so that we can gain more control over that value. Because we're using it to control values further down the line of our node tree. We're going to need to create the math node before the node which defines that specific parameter. So for example, we have the table depth value, which we can increase at the moment between 01. Let's say I wanted a bit more control over this. So I didn't want my table dev to increase so much just by increasing the value by such a small a man. What I can do here is I can add a map node in-between the table depth output here and the C input for my combined based leg node. So let's go in and hit shift, and I go search math and select Math. Then I'm going to hover the math node over the noodle, where we have the table DEF connected to the C input and left click. This instantly has an effect on our model. At the moment is set to ADD. So whatever value we have here, we're going to add 0.5. to that value. So the final calculation is actually C of 0.6 because it's 0.1 plus 0.5. But we don't want to use the Add Node here. We want more control. So we're going to use either the multiply or divide functions. But this, I'm going to choose divide. Now when I choose the void, it's now 0.1 divided by 0.5, which is a face, effectively the same as 0.1 times two. So we need to push this value above one. I'm actually going to push it to a value of two and press Enter. And now if I was to increase or decrease more Table depth, you can see we've got a little bit more control. It won't go down as far because we're limited to a maximum value of one. Well, I'm going to do is I'm going to set this to a value of about ten. So here we can adjust the table deaf between 01. And if I ever want to have more control over the actual distance, I can always select the table depth from here and increase the max value. So if I increase this to five, for example, I can increase my table depth here all the way to five and just add the additional thickness. So that looks good. I'm just going to drag this out, create a bit of additional room. And this is going to be our depth control. So we're going to rename it as such. Come to the item tab, left click, and press enter. Then we're going to give it a bit of color. But for this node, I don't want it to be visible. In fact, when we're finished, we want a lot of these nodes to basically take up less space than what they come in the ER. So with this divide node, with the depth control node that we've created here, what we can do is we can press on this arrow here that's going to minimize the node. In our view. It's not going to do anything to how the depth control node operates, but it's just going to minimize the values so that we can make the no tree as a how a little bit more pleasing on the I. I'm now going to add one more of these math nodes. 22. Fixing The Leg Size: In this video, we're going to be addressing an issue that we highlighted a few lectures back with regards to the leg size parameter. So if I go back to the notes tab and select leg signs and just increase this max value to ten. When we increase this leg size past a certain point. You can see that even though we are able to scale the legs, they actually scale form the center of each leg. So today's fail both up and down at the same time. This creates the issue where the legs on now piercing the base of the table. In this video, we're going to learn how we can fix this issue. Now based on the behavior of the leg size parameter, we can pretty much tell that each cube has its origin point located in the center of that cube. So each leg, when scaled, is going to scale from the centre. Now, rather than this being an issue, we can actually use this to our advantage. What we know is that we can scale up and down. But at the same time, we can also move these legs if we wanted to. So why not put those two functions together? As we scaled the leg value for the leg size, we can move it down by the sign, right? This would allow us to increase the scale, but not have it peers through the base of the table. So how do we combine the scaling of our legs with their location? Well, that's not possible without first being able to isolate the z value form the translation vector. So what we're going to do here is we're actually going to add two nodes in between our leg position node and the first leg node. First, we're going to add a combined XYZ node. So shift I, go search, combine XYZ. And we're going to position this just before the translation value. With them going to add a second note here. Wonder we haven't used yet. We're going to be adding a separate XYZ node. So again, shift and I search. So IP in separate, separate XYZ and position he. What we have here is the combined XYZ node, which will take the translation factor and split it into free separate values on the x, y, and z axes. The separate XYZ node. If we're going from this way to this Y, actually does the inverted to what he says. So he, we're taking our free factors and we're going to join them together by connecting these nodes. So if I plug this in here. And this in here, it's the exact same behavior as if these two nodes didn't exist. So what's the point? Well, the point is, we can now take the z value away from this equation and connect it to our leg control. Now if we connect this up directly, so we take the effective output and plug it into the C input. You can see that now the legs are positioned on the top of the table. And if we increase the leg size, it's increasing the size of the individual legs, but it's going in completely the wrong direction. What we're going to do instead is we're going to use a math node. And we're going to connect the combined XYZ and the leg control using that math node. And then we're going to, we calculate the legs so that they scale on the bottom and not the top. I'm going to add my math note first of all. And then I'm going to position the math node here. So we have the math node first, then we have it going into our leg control. I'm actually going to bring this math mode down to about here. And then connect the C value to the value output. Now at this point it's done something very similar to what we did before. The only difference is we are now adding to this scale value. I'm going to change this form, add some Multiply. Then I'm going to set it to one. When I do that, you can see we've got the same result as we did when we directly connected the leg control to the combined XYZ node. However, what we can now do with this multiplier operation is similar to what we did earlier when we created the additional legs. If you remember, we inverted the scale on a specific axis to mirror the positioning of the legs. We're going to do this to once again, mirror the positioning of the legs, but this time on the z-axis lava than the x and y. To do that, just take this bottom value and set it to minus one. Then press Enter. And the legs are now back in the proper position. The only different style this time is when we manipulate the leg size. The behavior is exactly what we want. We're now able to increase the leg size by as much we want to without it piercing the top of the table. Why? Because now as we are increasing the scale, we're also move into legs down in terms of their location values on the z axis. This is what is allowing us to increase the leg size without having the legs pierce the base of the table. So all that's left now is to just rename these nodes and give them appropriate colors. So the combined XYZ node first, let's set that to green. Separates XYZ to green and multiply to green as well because there was still a part of the first stage of the process. We're where we're just calculating how we want the bass and the legs to be created. Now we're just going to name this Multiply node as size control. And this combine XYZ node. Both the main purpose of it is to isolate the z value. So we're going to isolate C. And the separate XYZ note actually does exactly what it's supposed to. It separates the effective values into the X, Y, and Z channels. So we can just leave that as is. Finally, I'm just going to minimize my math node, which I like to do just to clean up my overall look. Fourth, no tree. And there we go. So now at this point, we now have 123456 different parameters that are all working exactly how we want them to. We can manipulate the scale of the overall object's type of width, length, depth, leg thickness, and leg size. So congratulations for making it this far, and I'll see you in the next video. 23. Finishing Touches: In this video, we're going to just add a couple more parameters to our procedural table. What we want to do is we want to add the ability to move the positioning of the individual legs on the X and Y axes. Now, before we actually do this, can you estimate exactly where in our no tree, we're going to need to add nodes in order to control the X and Y positioning for the legs. Just take a minute and look at what each of the nodes are responsible for. And then decide where you're going to position any potential nodes, what those nodes might be, and how they're going to work. Ok. Well, we're going to be manipulating the location on the x and y axis. If we take a look at our nose setup, we can see that we can already control this using this leg position node. So if I manipulate these values, we can manipulate the location on the x, y, and z. But as you can see here, we can't actually manipulate the z-axis as a result of this node. Over here, the isolates see node which we used to take our c value for the translation and plug it into this math node Dan here. So to see, value is not connected to our leg position at all, which makes this value completely worthless. So what we want to do is we want to isolate the top two values. We can do that by adding, you guessed it, a combine XYZ node. I'm going to hit shift and I search. Combine XYZ. I'm going to position it here, plug the vector into the vector. Then we're just going to temporarily reset these back to the way they were before. So point to 0.2. We don't really need to manipulate the c value. Again, it's not connected to anything. But what we can now do here is we can connect these two x and y values to our group inputs independently. So I can take this X value position here. Take the y-value position here. Go to node, scroll down and just rename these. So here we are naming as leg x, and this will be Leg y. So now if we manipulate these values, we can control the positioning of our legs on the X and Y axes. We're going to finish just by tidying this up. Take the combined XYZ. And we're going to rename this by going to the items tab. And let's just rename this as position x, y. And that tells us that this node is being used to define the positioning of the X and Y axes for the legs. Then let's take that color. Make it green, as we always do. Zoom out and admire the no truth that you've created, which has resulted in a truly procedural table object in Blender. 24. A Review Of The Table: So in this video we're just going speed. We're viewing the node tree that we have created for our procedural table and the responsibilities of the individual nodes. So at this point, we already know that the primary function of the glue inputs is to expose parameters that we can manipulate. The group output, which is located at the upper end, is effectively the final result based on the parameters that are manipulated here, and also any parameters that are located here with the individual nodes. The table base note here is a transform node that creates the first instance of the cube. This is the node that we used to create the base of the table. If we zoom out, we can see that we have a first leg node, which is the second instance of R cube. This was used to create the first leg. We then join these two together using this joint geometry now so that we have the leg attached to the base. If we go to the next section of our no tree, we have a second Transform node, the legs. So this allowed us to create a second leg by mirroring the location using the x scale value. We then join this up with the bass objects using this node here. Then we repeated the process one more time by adding another Transform node, which allowed us to mirror the two existing legs over on the Y axis using a negative value widget. We then join up this instance using a novel joint geometry node located here. Then as a means of controlling the overall scale of our object, we added a final Transform node right at the end. This note is specifically for being able to scale our 3D objects. We used a fixer math node for this soda, we could combine all three axes on the scale transform as a single value. We then take this node up here using a reroute. Just for the sake of making our overall node sets up a little bit less messy than what it needs to be. And we plug this into the scale inputs, which is actually our first parameter. So this is how we can manipulate the overall scale of our table. From this point, we created the structure of our table. Now let's take a look at the parameters we created to make this table truly procedural. Starting with the first free, we have the table width, table length, and stable depth. We can use the combined based elect note here to isolate each of the free individual axes and manipulate the width on the X axis, the length on the war, and the depth on the z. With a table depth, we even added a math node so that we can change the way that the table depth value is recalculating the depth of the base of the table. If we take a closer look, we can see that the values for this node R, using the values of the scale base vector and the leg position factor. This means that as we are able to increase the scale of our object, we will move positioning of the legs at the same rights. This allows each of these free nodes to be able to scale the table without losing the positioning of the individual legs of the table itself. If we take a look, once again, our group input node, we then have the leg thickness and leg size options. So we can see down here that we have our thickness control board, the leg control. And by connecting the x and y values from this leg control node, which is a combined XYZ notes together using a reroute. Plugging into this fitness control math node, we are able to control the leg thickness on the X and Y axes. So we adjust the leg thickness. We can scale the legs on the X and Y axes, but not the z. The z value here separated into this size control node. It's also connected to this oscillates. See node located here, where we effectively isolate the z value of the legs location from the x and y. This way, we're able to take the location of the legs and move the legs on the z-axis while scaling them. This gives us the behavior and ability to adjust the scale of the individual legs without them piercing through the top of the table as they did when we initially created this parameter. The combination of these two nodes here is what allows us to separate the z value form the translation of the first leg. So that's a overview of exactly what we have created and what each of these nodes are used for. I hope at this point you have a decent enough understanding on the properties of each of these different types of nodes that transforms joint geometries, combine and separate XYZ vector math node, traditional math nodes, et cetera. Before moving on to the next section, I am going to give you a little bit of a challenge. I want you to see if you can create a different objects. One that is completely different from this base table. See if you can make it truly procedural using the parameters for the group input. And also make sure that you organize your node setup. So here, because we've been able to color code our node setup, we can sell that anything relating to the color green represents the first part of creating our table. In this case, we're taking the table base, adding the first leg to it. And we're creating all of the different calculations that are going to make our objects procedural, even with the additional instances added later on in the node tree. So wherever objects you choose to create is entirely up to you. You could, if you wanted to create a different table or even create a chair by using this procedural workflow. So complete that challenge now guys, and I will see you in the next video. 25. Making Our Drinking Glass Procedural : In this video, we're going to make our drinking glass objects that we created in the previous section of the course. A bit more procedural by exposing some of the key parameters. The parameters that we want to expose are going to be the x and y scale board Boolean, as well as the c translation. We're going to want the x and y scale to represent the thickness of our drinking glass going around its radius. And we also want to determine the height of its base, which we can do so by manipulating the c translation value. We are also going to want to control the overall scale. Let's do that last bit first. We know that we can control the scale of our entire object by just adding a transform node at the very end of the node tree. Let's add that Transform node by going to geometry and select Transform. And then what we can do is we can isolate the scale values specifically. Now we need to turn these form a vector into a float value. So as a reminder, a vector value is basically split into free the x, y, and z axes. But we want to use a singular value, which is otherwise known as a float. If he will remember from when we created our procedural table, we can isolate this scale as a float value by adding a FETS HeartMath node. So go to theta and select vector math, position and connects to the scale. Then change the function from add to scale. And you can see here, we have the choice of exposing the scale as a vector or as a float. We're going to take that float value and plug it into the group inputs. So take drag and connects. We're going to keep this as scale because it represents the overall scale. And now if we go to our modifier Properties tab, you can see that we can manipulate the scale value. The reason why the objects has now disappeared is because the effects of value itself has been reset to 0. So we need to set all of these three values back to one to restore the base shape of the object. Now, we can manipulate the float value in the Modifiers tab to increase the scale. If we wanted to, we could also isolate these vector values using something like a separate XYZ node to manipulate the overall scale of the drinking glass on any specific axis. So let's do that now actually. So let's add another node, shift I. And let's go with combined XYZ. Plug the vector into the scale. Take the x value. Plug it in here, and they're designed with the Y value in the same socket. Let's rename this as gloss outer width. So that represents the Alto width. And if we set this value to one, at the moment, it has it. So day looks like a disk and that's because of the Z value. Let's just increase the Z value to one. And now if we manipulate this gloss outer width parameter, you can see we are able to adjust the size of the drinking glass on both the X and Y axes. So, so far we have the scale, which is all free axes at the same time, and the outer width, which is just the x and y. We can also manipulate the C value, plug it into his own slots. And if we adjust that, we adjust the height of the drinking glass. So let's just rename that as glass heights. And there we go. So now we have free parameters, but the overall scale, the outer width, and the glass heights. Let's just manipulates the positioning of one or two of these nodes just to clean things up just a little bit. Move this up here. Just so we can get a bit of a clearer picture on what is connected to what. And now I want to do is I want to control the thickness of the glass on the inside. So we're going to isolate the x and y scale down here. Let's add ourselves. You guessed it's combine XYZ node connected a scale. And then we're going to set the z value to free. And we're also going to just drag this out a bit more. Connects the x and y to the same group inputs. And we're going to manipulate these values to 1.2 and press enter. And that gives us exactly what we had before. So now we can manipulate this value here to manipulate the thickness of our drinking glass. Be careful not to go beyond a certain value. Because then the Boolean overlaps the object as a whole and you end up with a disk at the bottom. So you could easily go in and clamp this value using math nodes or just a basic value in here. For right now, we're just going to finish things off by isolating the z-value body location. And that is going to determine how high the basis. So what we're going to do is we're going to duplicate the XYZ node we have created here. Connects to the translation. Set that 2.1. And then connect this to the bottom slop. Makes sure that it's actually the correct one. And now if we manipulate this value, you see at the moment we just got a hole at the bottom. If we increase it to 0.01, we get the base. And then as we increase this value, that base comes further and further up until it reaches the top. So let's set that to 0.01. And let's just finish by renaming these values. So this one is going to be our class thickness. And then the one below is going to be the base heights. So from here, what you can do is you can add some math nodes to get further control over your parameters. We're going to leave it at that. Thanks guys, and I will see you in the next video. 26. Preview Of The Forest: In this section of the course, we're going to be learning how to create this a forest of different types of trees that are scattered across a single applying. We're going to be doing this by learning about points, nodes. Point nodes are used to distribute a specific object or collection of objects across another object using a point system. We're going to be taking a look at different types of nodes in this section. In addition, subpoint nodes, we're also going to be taking a look at attribute diodes, as well as being able to use the math nodes to control certain attributes from these new nodes. We're not actually going to be using that many nodes to create this effect. And that's the beauty of this node system, is that you don't actually need something to be super complicated to get its work the way you want. So over the coming lectures, we're going to take things step-by-step in how you can achieve this result in very little time with very little effort using geometry nodes. 27. Using Point Nodes: In this video, we're going to be introducing the two most important nodes for scattering and object instance across the surface of another object. At the moment we have a single cube. Well, I'm going to do is I'm going to add a second object to this scene. I'm going to add a plane object. So I'm going to go shift and I mesh and then select Plain. And then going to scale this up by a value of about 20 and press enter, then hold down control and I and select scale. That way. If we go to the side panel, we can see that the scale 4D plane object is set to one on each axis. With the plane is selected, bring up your timeline and then switch it to the geometry node editor. Click on new to create a node system for our plane. And we're just going to rename this geometry nodes system as scatter because we're going to be using it to scatter object instances around the plane. Next, we're going to introduce a new node. So hold down shift and I. Then go to search or go to the point menu here. And the first one we're going to add is the point distribute node. So left-click and position over your no tree like so. And left-click against confirm. As soon as we do that, you can see that our plane object has been transformed into a series of particles that have been randomly distributed across the area where the plane was once positioned. If we zoom in on the point distribute node itself, you can see that we've got a few options that we can play with. The only two to unfocused on at the moment are the density and the seed. The seed is effectively a random generator that changes how the Pascal's are created by the point distribute node and where they are each positioned. So you can change the seed to randomly change the positioning of all of the individual particles. The density option represents the number of paths calls that are visible. At the moment it's sets one. If I reduce this value to something like 0.1, for example, this significantly reduces the total number of paths calls on our plane object. If I increase it to a value of ten, it's going to do the opposite. It's going to significantly increase the number of particles scattered around the plane area. For now, I'm just going to set this back to one. What we want to do now is take our cube object that we have here and use this as our particle. So each of these little dots that you see, there are particles that have been scattered across the plane and we want to turn all of these into cube objects. I'm just going to make sure that the plane is selected. Bring my points distributed node over here. And then I'm going to add our second node, which this time is going to be the point instance. Left-click position after the point distribute node. Like so. Now as soon as we do that, the particles disappear, but the plane doesn't exactly reappear. The reason why is because we don't have a defined objects. So if we left click here where it says objects, you can choose whatever objects in your scene that you want to use as your point instance. In this case, the cube objects. As soon as I do that, you can see that we have many, many cubes now in our scene or scattered around the area of the plane. Now, there are several ways in which we can edit how these cubes are being generated. But for now, I just want to reduce the overall size of each individual cube. And the easiest way to do that is to just select the main QB objects, hit the Tab key to go into edit mode, and then just hit S and scale down. As we scale down at the Main cube, the instances will be scaled down as well. But this will only really work in edit mode. If I was to go into objects mode and change the scale, you can see it doesn't actually affect the point instance. What we can do here though, is we can scale down, hit control a, and apply the scale. But my preferred method is to simply go into edit mode and scale from there. So I'm going to scale down to about here and left-click. So now you can see that across the area of our plane, we have hundreds of little cubes for our sing. As a little bit of a mini challenge. I want you to see if you can figure out how you can keep all the cubes that you have generated, but also bring the plane back into view. So if you think about it, whenever we use our point distribute node, the plane objects disappears from our sin and is replaced by the particles. If you remember from our projects on creating the basic chair and also the procedural table, do you remember how we could create separate instances of the same objects? Think about the specific node that we used, and if you can figure it out, try and apply that node to this node sets up to bring our plane back into view. I'll just give you a couple of seconds. Okay? Well, if you remember, when we created the basic chair, every time we wanted to create a new leg or the back of the chair, we used the joint geometry node to create a new instance along with the Transform node. But in this case, we don't want to manipulate the transform with the plane itself. We just want it to be visible. So we're going to use the joint geometry node position here. And then we're going to take the geometry outputs and plug it into the second input here. As soon as we do that, we bring our plying back into view. So the first slot represents the actual point distribution of our cube. The second slot here represents the plane itself unedited from any notes. 28. Attribute Nodes: Not only are we learning about points nodes, in this section, we're also learning about attribute nodes, which can be used to control the transforms of our points instances. So what I'm going to do here is I'm going to add our first attribute node to this set-up. Bring up your Add Menu with shift. And I. Then go to attributes and you'll see we have numerous attribute nodes that we can add. The first one we're going to demonstrate is attribute field, where you position the attribute node is very important. For example, we're going to position the attribute fill node in between point distribute and point instance. Now at the moment nothing has happened to the instance cubes. We have with our attribute fill node, a geometry inputs and attribute inputs and a value inputs. We can actually change the type of this form, float, subvector, color or Boolean. But a moment, let's just keep it at floats. Now an attribute is something like a transform, for example, so to location, location, and scale, it could also be something else like a UV map or the color or vertex colors. We're going to keep things simple. We're just going to use the attribute fill node to control the scale. To do that, we're going to type scale in this little box here. This is case sensitive, so do not start with a capital S. We want it to be lower case for all of our attributes. I'm going to press the Enter key. And as soon as I do that, all the cubes disappear. The reason why is because the value is set to 0. If I begin to increase this value, we begin to increase the scale of the individual particles. The attribute fill node is a very simplistic version of some of the other attribute nodes, such as the scale and randomize options. Because with this value, it does so uniformly. So they are all scaled the sign. If I was to change this to the vector value, then we end up with free vectors x, y, and z. By changing attribute fill from floats to Effexor, we can then control the individual axes, 40 scale or the keys. So if I could set this to one, then one again, then four. You can see that we have the cubes instances of add arsine, same as before, but they're now all scaled up on the z axis, even though the original cube objects, which if we just bring up here, you can see that's not being scaled on the z-axis at all. So this attribute fill node is only focused on the particles themselves. And that brings us to another important point. You will notice that we positioned the attribute fill node before we defined the objects that we would be using for the points instance. So this is in fact controlling the particle itself and not dependent on whatever objects we select that comes after. Let's test what happens if we were to change the positions around. So I'm going to take one attribute, fill node, and position it after the point instance. Here you can see that nothing happens if we manipulate the values on the x, y, and z. The attribute fill node has no effect because we've already determined what's the object instance is going to be and also how it's going to be generated. Now while you cannot position the attribute fill node after the point instance node, you could position it before the point distribute. Note, since these are values that are being defined for the particles that are generated. So in this example, you can control the attribute fill four to scale before you distribute the points. I like to set this up after. So I like a workflow where I distribute my points first and then control things like the density and seed values. And then use things like the attribute note to control attributes like this, scale and rotation. We could also add other node types such as math modes to this set-up to gain more control over our scale. While I'm going to do is I'm just going to set this to a float value. Then I'm going to add a math node. So go down to utilities and select Math or search from the search bar. I'm not going to position it in between the two geometry nodes. I'm just going to position. He creates a little bit of additional space so I can position and then connect the value to the value. Then I'm going to set this to multiply. And let's just set this to one as the top value and one for the bottom value. So this gives us what we basically had before with a base value of one. Then we could expose this top input, for example, into here. Go to the Modify tab. And if we set this second value dance of 0.1, we can get a bit more control over the scaling of the individual instances. If you wanted to, you could also use a Fetzer math node to adjust the individual factors. Or even a combine XYZ node to isolate certain values, such as the free individual axes of the scale attribute. 29. Per Vertex Instancing: In this video, I'm actually going to take a step back and we're going to perform a little bit of an experiment. We now know how to combine the point distribute node with the point instance node to create the effect of scattered particles around a selected objects. But what happens when we mute one of these nodes? For example, what happens if we work to move the point distribute note so that it would have no effect on our scene. Well, let's select the point distribute node and find out. If I press the key on my keyboard to mute the point distributed node, the cubes disappear. Or do that. Because if you take a look at the corners of our plane, you can see that we have an instance of the cube at each corner. The reason why is because the point distribute node is used to randomly generate the instance object on our plane. When it's not being used. The instance objects will be positioned on all available verticies of the main objects, which in this case is the plane. So the main object is applying and the instance object is the cube. If we hit the Tab key to go into edit mode, you can see that this plane only has four vertices, one on each corner. Let's see what happens if we increase the number of first vertices for our plying. Right-click to bring up your third Texts Contexts menu, and then select subdivide. As soon as we do that, we can see that along with the additional edges and vertices that we have created, we have also new cubes positioned at those new vertex points. If I open up the operator panel and begins increased the number of cats. Not only do we increase our geometry, we also increase the number of cubes that are generated. So now if I hit the Tab key to go back into objects mode, you can see that we have all of these cubes generated, but they are locked to the location of the individual vertices. Now when it comes to our point instance node, we've already seen what happens when we don't have a point instance node in effect. I'm just going to demonstrate this again. Basically, if we mute our points instance node, I'm just going to zoom out here. By pressing the mkay. Then the cubes are replaced with particles. These particles basically look like sort of diamonds, but they don't represent any object in particular. So this is the effect of using both the point distributes and point instance notes. And what would happen if you were to choose not to use either of the nodes in question. 30. Instancing With Collections: Up to this point, we have been using a single object as our point instance. However, if we zoom in on the point instance node, you can see that we have two options, object and collection. This time, let's create a new collection in Blender and use the collection as our point instance system. To start with, I'm going to add a new objects shift I mesh Ico sphere. Then I'm going to set the radius to something like 0.2. Press enter. By doing this in the operator panel when the object is created, were not altering the scale. So we don't need to apply it the scale by going control, ie, if we manipulate the values here in the operator panel. Next, I'm going to add a new collection by right-clicking in the outline a panel, select new collection. And just rename this new collection as instance o b, j. Then I'm going to position where Ico sphere inside my instance OBJ collection. And do the same with the cube objects. Then select the plane. Once again, choose collection from our point instance node. And when we do that, you will see that all of the scattered points have disappeared because we don't have anything defined here. Left-click and select instance OBJ. So as soon as we do this and zoom in, you can see that we are creating instances of both the cube and the ecosphere. There is just one issue, and that's the fact that the instance is being created at the same location. So even though we have multiple objects, both objects are being created each time in the same point. If we select one of these objects, such as our Ico sphere and hit g to move that object, you can see that it impacts all of the individual particles. So if I look this to the x-axis for example, or maybe the Y. And we position. You can see the effect that this has on each individual particle has been scattered around our plane. However, this is not really the sorts of behavior that you want. If you're trying to randomly generates your parts calls, this doesn't look as random with a cube and an ecosphere sat next to each other at every generated instance. Fortunately, the solution is much simpler than you might think. In the point instance node, we have a tick box that says Whole Collection. When this is ticked, it basically applies the entire collection of objects to each generated instance using their transform values such that the location. However, by untaken This box, like so and zooming out, you'll be able to see that now each instance holds only a single object format that collection. If I was to add a third object to my collection. So I'm going to select instance OBJ, hit shift, I, then go. Monkey would use the size to about 0.2. Reposition on the y axis to about here. And then select my plane objects. What I can do is I can just increase my value. And you will see that we are generating the cube, Ico sphere and Suzanne objects, but always in different locations to each other. This in comparison to setting, it's a whole collection which uses the transform values of the entire collection for each particle that's generated. That's a very important point to consider whenever you are using collections, bought your point instancing. 31. Attribute Randomize For Scale: In this video, we're going to be taking a look at our second attribute node. We're going to be taking a look at the attribute randomized node. Well, I'm going to do with my current set up is I'm going to replace my attribute fill node with an attribute randomized node. I'm going to start by deleting the attribute fill note, hit shift. I go to attribute and select attribute, randomize. I'm going to position here. And then take the geometry, in-situ geometry. And again over here. Then I'm going to set my attribute. So with each of these attribute nodes, you have to set a attribute to be effected. Again, we're going to choose a scale and press Enter. You can see what this does by looking at the scattered objects around our plying. The attribute randomize node will allow us to scale each of our particles. But it randomizes how much they are scaled by. This compared with the attribute fill node, which was used for uniform scaling. We can use the seed value for the attribute randomized node to change how much each of our individual objects are being scaled. And it also changes the overall look of our model. As a result, we have the minimum and maximum values that we can set here. So the closer these two values are, the closer the scale is going to be between the incidence objects. So if I set the max to one and the min to 0.8, the scale of each of our instance parts calls is going to appear very similar. The greater the difference between the minimum value and the maximum value, the greater the potential difference between the scale of each individual particle. We can also use our Multiply node here as well to manipulate the control of each. So I'm going to take this Multiply node and set it up to the max. Then I'm just going to close this, duplicate it. And position with the min. Then take the top slot, which is going to be this one here. Let's position into this new group input. We're just going to take the bottom one. Popular on top. Name it as min for minimum. Max for maximum. And now we can't manipulate the values form the Modifiers tab. Don't forget that much likely attribute fill node, the attribute randomized node can be changed in terms of the type of data used. This time we have free options, float, vector and Boolean. So we could change it to the Fetzer value, for example. And then we could begin isolating the scale on the x, y, and z axes. For now, I'm just gonna sit that backs afloat. And let's move on to the next video, where we're going to be using the same attribute randomized node, but for a different attribute altogether. 32. Attribute Randomize For Rotation: In this video, we're going to be changing the wider we use the attribute randomized node by changing the attribute. Now in this example, I'm going to keep my current attribute randomized node. Because what we were about to do is affect a different attribute altogether. So we don't need to replace this. Instead, we're going to select it and hit Shift the two duplicates, then position straight off that the original node. Now you can see the effect that this has on our Quinn instancing. But that's because we once again have the attributes set to scale. We're going to left-click here and we're going to give it a new attributes. We're going to use rotation. I'm going to select rotation and press enter. Now all of our particles appear small again. And if we zoom in, you will notice that some of the parts calls have been affected by a change of rotation. Well, I'm going to do is I'm just going to increase the min and max values for the scale just so we can see a bit more clearly what's going on. Do something like that. And you can see how some of these objects instances have been affected by the attribute randomized node by setting it to rotation. What you can do here is you can change from float to something like factor. And then you can begin manipulating the individual axes. For example, say if I only wanted to manipulate the rotation on the z axis, when I could do is keep the minimum values set to 0. This indicates 0 rotation. And the bottom values here they're set to one. And that basically means that it's rotated once around a specific axes. So 360 degrees. We're going to set the x value to 0 and the y value to 0 as well. What this does is it now allows the attribute randomized known to only affect the rotation of the instance particles on the z axis. 33. Create A Forest Exercise Geometry: Now that we have a good idea of how to combine point nodes with attributes and math nodes. We're now going to have a little bit of a challenge for you. In this challenge, I want you to create the following scene. I want you to create a forest using two different types of trees. Now, the models that you use to create your trees can be as simple as you want so long as they resemble trees. I'm actually going to keep objects very simple. But what we're going to do is we're going to create those objects, position them in a collection, and then use that collection to spread the trees around a large plane, much like you see here. We're going to be using the attribute randomized nodes to randomize both the scale and rotation of the trees that we create. So what I want you to do now is pause the video for a couple of minutes and see if you can create a scene that looks like a forest with at least two different types of trees scattered around a large plane. Free to one. Pause and go. Ok guys, I'm now going to perform this challenge myself, but I'm going to do so in a new file. I'm just going to save what I've done so far. Go file new general. The first thing I want to do is create the objects that I'm going to use for the points instancing, which are going to be two separate trees. With the cube that we have in our scene. We're going to go straight into edit mode. We're going to use face select and select that top face. Then it just grab it and drag it up on the z axis. We're going to scale this down to about here. Then select the bottom face and scale it down, but not as much as the top face. So this is the base of our thirst tree. Now without going into objects mode, we're going to add a novel objects or another mesh objects, which is going to be a part of this tree. Hit shift i. And I'm going to select cone. I'm going to open up the operator panel and drag it up on the z-axis to about he. Then I'm going to duplicate this cone with shift and day. Bring it down on the z-axis to about here. And hit S and scalar. I'm going to do that one more time with shift day. See to look at to the z-axis dance whereby he and S to scalar. So this is the first of the two trees that we're going to be creating. Let's rename it as tree one. Now, I'm going to create my second tree. So let's move this over on the x-axis. Shift I, create a new cube. The start of the process is going to be designed. Just select the top, bring it up on the z-axis, and scaling. Do the same with the bottom face, but not as much. And now I'm just going to add an ecosphere to act as the leaves of the tree shift. And I select Ico sphere, increase the radius to two meters, and then bring it up on the Z axis to the top. Then we're going to go into objects mode and rename this one as two. And there we have two different trees that we can use with our collection. Before we go any further, we need to address an issue that we have not highlighted yet. And that regards the objects or virgin. I'm very quickly going to just save what I've done so far. I'm going to save it as forest dot blend and click Save as. Then I'm just going to go back to my previous file. And if we take a look at our scattered objects underneath applying, you can see that what's happening each time we create an instance of these objects. Half of the object is positioned above the plane and half of it is below. And that's because the objects origin of each of these objects is located in its center. If we go back to our what forest file, what we want is for the objects or gene to be located at the bottom of the tree. To do this, we're going to go tab to go into edit mode for one of the trees. We can select the bottom face, hit shift and S to bring up the snapping menu. And we're going to position the cursor to selected this bottom option here. Then go back into object mode. Objects, sets origin, and then origin to free the cursor. Alternatively, what we can do is if we select this first tree here, I'm just going to hit the period key on one number parts of zoom in on it. We can go to options. Choose to affect only the objects origin. In April snapping by clicking on this button here and then selecting face. What I can do now is I can hit G, snap it to the face, and lock it to the z-axis by pressing Z. Then press left mouse. To confirm the new positioning of my objects origin. Go back to options and turn this off and also turn it snapping off. So those are two quick ways of positioning your objects origin at the bottom of your tree. Next, we're just going to open up the side panel and position both objects on the top of the blender grid. So I'm going to select this one, set the z value to 0. And now what we can do is we can add these to a new collection. I'm going to right-click Add New Collection, rename it as trees. Then position both trees inside of this collection. We've now set everything up so that we can begin using geometry nodes. The only thing missing is the plane itself. Hold down shift and I go mesh and create a plane. Then we're going to scale it up by a value of 20 on both axes. And because we've moved the 3D cursor, we've moved where the plane is created. Let's just change the location back to 0. Then we're going to select each of our objects and just move them off to the side. Bring up our timeline, change it to our geometry node editor, select the plane object, and then select New. Now we finally reached a point where we can begin adding our trees to our ground plane. 34. Create A Forest Exercise The Nodes: In this video, we're going to be taking the tree objects that we created in the last lecture. And we are going to be scattering them around this plane object to create our forest. In the geometry nodes editor, we need to start by creating a point distribute node. Hit shift, and I go to the points menu and select points distributes. Then position about here. You can see the change made to our plane object in the 3D viewport. Next, hit shift and I again go to the point menu and this time select points instance. We're going to place the points instance node He just in front of the group output. We will create a bit of distance between the first two nodes and the second two nodes. And then change the type from object to collection. At the moment the plane has completely disappeared. We're going to turn off whole collection, go to this collection option and select our trees collection. At this point, we are now generating both types of trees. It doesn't look that great. Oh, we need to make a few adjustments. The first one I'm going to do is I'm going to add a attribute node. So I'm going to add attribute randomize and position he. Then I'm going to hit shift these duplicates and position another one straight off with this first one is going to be for the scale. So I'm going to take type scale where it says attribute, and then press enter. With the second one. I'm going to set this to rotation. Go to where it says float and change it to vector. Then I'm going to take my max value and set it to 0. And then this second max value to 0 as well, because I only want to rotate these on the z axis, which is the one at the bottom. I can adjust the seed at any point to change the effects of that node. So for example, I can take this seed value and adjust where my point distribution is being applied. I also need to reduce this density. So I'm going to reduce it to a value of 0.1 just for the moment. And the variation between the different trees in terms of their size is too great. I'm going to take the minimum value and set this to 0.8 and press enter. One thing that we're missing here is the plane itself. What we need to do is select these nodes that we have created and drag them up. Move the group output node back here, hit shift, I, go to geometry and select joint geometry node by plugging it in at the end of our node tree. And then taking this geometry output. And plugging it into the second slot of the joint geometry node. We can bring our plane object back into view. At this point, I think the trees are still generally too large and there aren't quite enough of them for our forest. I'm going to make a couple of changes. The first is going to be to add more control to the min and max values. For this attribute randomized node. We're going to do that by adding a math node, shift I to bring up your ad menu. Then go to utilities and select math. I'm going to position the first math mode here and plug the value into the minimum. Then I'm going to set the first value to one. Changed the math function from AD, multiply. And let's reduce this second value to 0.2 and press enter. You may have gotten the idea of plugging this value output into the max input as well. But this isn't going to give us the effect that we desire. When we do this, we're going to get much smaller trees, but they're all going to be the same size. If you take a look from this view here, you can pretty much see that they are the same size as each other. The reason why is because we're using the exact same value for both the minimum and maximum here. What we need to do instead is just duplicate this node. I'm going to drag it up slightly, hit shift a, and bring it down. Be careful not to connect it to any other nodes like I have here. I'm just going to fix this issue very quickly. And I'm going to plug this bottom Multiply node into the max. Now that's going to do the same thing as what happened just a moment ago, where we have all of our different trees at the same level of the same scale. But now we can at least manipulate the values in each of these multiply notes. For example, I can take this top value and I can bring it down by a couple of points. To bring down the minimum scale of why trees. I'm going to set this to a value of about 0.7. And so the minimum value for this scale is going to be 0.7 times 0.2, while the maximum possible value is going to be one times 0.2. That why we get some good scaling for our individual instances. Next, I'm just going to close each of these. And finally increased the density. So I'm going to increase this to 0.6 and press enter to see what we get. And I think we can go a little bit higher. Let's go 0.7. And there we have our forests now, you can go as high or as low as you want. But be warned, in this configuration, you are going to get particle instances that are going to overlap. So for example, you can see we have two trees here. They're not in the exact same space. But because we're using the geometry of parts cool objects like these, that geometry is going to be overlapping at certain points if you set the density to high. So think about what density value is suitable for you. That will conclude this challenge on creating a voiced by using particle nodes. Thanks guys, and I will see you in the next lecture. 35. Materials For The Forest: To follow up on the previous two videos where we created our little forest. We're going to assign some materials and rendering an image. Now we're not going to be using nodes at all for this, which is going to be assigning some base materials to the plain objects as well as the instance trees. So let's start with the plain objects. Let's go to the materials tab and add a new material. I'm just going to set this to Brown's, press Enter and just set it to a sort of muddy color. So something like, something like that. By the way, you can't view your materials by going to your material preview for few ports shading located up here, and you can see the color of your separate objects. Next, we need to assign materials to our trees. Now this is much easier than it looks, because all we need to do is assign materials to the original objects. With this first tree, we already have a material created. I'm going to name this as tree and press enter. And I'm going to set this to a similar color, perhaps slightly lighter than our ground plane. So something like this. Then I need to add a second material for the leaves. I'm going to come back up here. Click on the plus button, select New. And then we're going to name this as leaf. Set the color to, let's go with a darkish green. And it doesn't apply to our object straight away. I'm just going to zoom in on the object itself. What we need to do here is we need to go into edit mode for the selected object and select the geometry that we want to assign a material to, which we can do by pressing the elk on the separate islands that we created when we made the object in the first place. Make sure that the tree bark itself is not selected, which is not here because it's not highlighted. And click assign. This gives that nice green color to the leaves of our tree. Let's repeat this process with our second tree. We're going to set the base color to the tree material. Then we're going to hop into edit mode. And with the ecosphere selected, which you can do so by pressing the arrow key. We're going to go. This plus button here to add a new material slot. And then we're going to select, leaf, click assign, and job done. Now if we take a look at the forest itself, you can see that the materials have also carried over to the instance objects. So now we have what looks a little bit more like a forest. I think that ground plane is a little bit to reflexive. So that's just with its selected come down here and adjust this roughness value. So I want to increase this to about 0.75 and press enter. If you know how to. You can, of course, create much more complex materials that look much more realistic than this. But considering the shapes that we used for the trees in the first place, this is a very low poly scene. So I think the material was on much suited to the geometry that's been used. When you're ready, you can take a render of your finished Creation. So if you select your camera and press 0 on your number pad, or press on this button here to toggle the camera view. You can preview what will be rendered when you go to this render button at the top and select when the image. Now at the moment that's not quite enough of our forest. Because we're taking a picture of what would appear to be a landscape. One thing that I suggest is to play about with the focal length, which you can find in the object data properties tab with the camera selected. So the lower this value, the further out the shot, so you get more of your forest inside of the render border. The greater the focal length, the more you focus on a specific parts of your forest or objects. So play about with the focal length. See what works best for you. And then when you're ready, See if you can position your camera by going to this View tab in the side panel. So if you're here, you can go to view under few lock. You can choose cameras, review. And then as you navigate, you can reposition your camera and change what you're going to render. So I might want to go down to a bat's. Here, for example, select my plane and perhaps increase my density just a bit. And then perhaps I'm ready to render. So at this point, I can go to my output properties. The fine that the resolution which you can do here. And you can also come up to your render Properties. Choose your render engine. So between EV or cycles, EV is the much faster but less realistic version, which is probably more suitable for arsine. And you can define certain parameters, such as the render samples, whether or not you've got ambient occlusion. So if I just turn off camera view and zoom in a bit, you can see the effects of ambient occlusion underneath the cones here. What I'm gonna do is I'm just going to increase the distance so that it's much easier for you to see. So you can see we've got shadows being created as a result of enabling ambient occlusion. This compared to it being turned off. You can see it's a much better result. You can also manipulate things here, such as the bloom, which isn't going to affect the current scene. Or even screen space reflections. Which creates a little bit more of a reflexive property on the surface of our separate trees. 36. Changing The Point Distribute Method: In this video, we are going to be tackling one of the most common issues when we are using point density nodes will I'm going to do here is create a very basic setup using point density. I'm going to add a plane object to this basic seen scaling up by a value of about ten and then hit control a and apply my scale for the plane objects. Then with applying objects selected, I'm going to just set things up in the geometry node editor. And I'm going to add a point density node to the setup. His shift, I go to points and select point distributes position here to create our points density. As we know, we can increase this value. But what we want to do right now is we want to use the cube objects, which we can do by adding a point instance and selecting the cube. Now at the moment it's too big. I'm just going to select the Cube, go into edit mode and hit the AES key to scale down. Then we're going to select the plane to make the node setup visible. And we're just going to use a joint geometry node located here. Connect the outputs to the geometry and purchases so we can see the plane. Now, a problem that we have when using point distribute and point instance is that some of our instance objects will actually overlap each other. If you go back to the scene you created for the forest, you will see this as well with the trees. So there are several instances here where we have two 60ths partly occupying the same space. The question is, how do we solve this issue? Well, at the moment there is one solution to this. And that is to change the random method for the point distribute node. If we take a look at the point distribute node, you will see it is set to random. We want to change the way we scatter the points. So if we open this up, we will see that we have to distribution methods. The second one is Poisson disc. If we were to select a Poisson disk, we get an additional parameter, which is the distance. This represents the minimum distance between our scattered particles. If we increase the distance value even by a little bit, you will begin to see that some of our parts calls will begin disappearing. The reason why is Blender is making sure that certain particles do not overlap each other. Now by going up to a value of 0.4, can you now see any key? That's our overlapping. I don't think I can. So let's see what happens if we increase the density value. Let's increase it to a value of ten. Even by increasing the value of the density to ten, which is much higher than what it was before. We're still not getting any overlapping of our instance cubes. If we go even higher to a value of say, a 100, we still don't have any overlapping. So this method is a great way of making sure that your instance objects do not overlap the same space. Let's now apply this to the forest that we created in the previous videos. Here, I have my forest with some material supplied and a little bit of editing with regards to the lighting. So I've just enabled things like ambient occlusion, bloom and screen space reflections, just to make the overall scene look a little bit nicer. What I want to do here is I want to make sure that none of these trees on goings be overlapping. So you can see why here we have three trees that are effectively overlapping in a similar space. What we're going to do is select our plain objects. You can see we've got a really high density here. So we're going to go up to the distribution method and change it to Poisson disk, then increase our distance value. Now, this plane is much smaller than the one we had in the example. So with the density sets of 0.01. we've dramatically reduced the number of trees in our forest. That means we're going to need to use a smaller value for our distance. Let's use point c11 and press enter. That looks a lot better. But if we go so low, you can see we end up with the same issue. So we wanna make sure that we don't go so low with the distance value that it doesn't really affect our particle instances because if the instances are too large, 40 distance than it won't make a difference. Let's increase this value 2 COO free. That's making good progress almost there. Let's go 0.06. And then let's increase the density form here. And as we increase the density, we get more and more trees. But with our distance value, we are able to continually sleep create our trees, bought a forest without them overlapping each other. I think I'm going to just bring this down just a tiny bit to 0.05. citadel were a bit closer together and increase that density a bit more. So something like 4 thousand. And now we've got ourselves a forest where the trees were all have their own space. 37. Using Vertex Groups For Density: The goal of this video is going to be to create our vertex groups to define exactly where we're going to position our trees on the plane. At this point, all of our trees are being evenly scattered across the entire surface. But what if we wanted to create areas where we didn't want any trees to appear. There are a couple of ways in which we can do this. And these revolve around the creation of vertex groups. So we create a vertex group in a specific area. Then we define the vertex group here where we have the density attribute. The first step here is going to be to create vertex group itself. We're going to make sure the plane is selected and hit tab to go into edit mode. At the moment, we don't really have an awful lot of geometry for the plane objects. So we need to add some geometry. Hit the right mouse button, subdivide and set the value to something relatively high. So 50 cards, for example. That should give us plenty of geometry to work with. Then we need to create the vertex group itself. What I'm going to do just for the moment is go to my modifies tab and I'm going to hide the geometry nodes modifier. Just so we can see the plane itself. Then we're going to go into top orthographic view by pressing seven on our number pad, or by manipulating the interactive access that you see up here. And then I'm going to go into third text selects, select a vertex. And all I'm gonna do here is I'm just going to hold down Control and press the plus button to expand my view once you expand the selection. So I've selected all of these vertices and I'm going to assign them to a vertex group. To do that, go to the Properties panel and go to where it says objects, data properties. The first option you have will be to create vertex groups. We're going to click on the plus button to add a new vertex group. And we're just going to rename this as clearing. So it's a clearing in our forest. We then go into click assign, and this is going to assign all of these selected vertices to this vertex group. So left-click and all of these should now be assigned. Next we're going to go back into objects mode, go back to our modifier and make it visible. And now we're going to go to our points, distribute node. Left click where it says density attribute. And we're going to type in the name of our vertex group. So if you'll remember, it was labeled as clearing with a capital C, we need to remember that this is going to be case sensitive. So we're going to use capital seeing for clearing and press enter. Now you can see here that we have been able to position all of the trees or at least as many as possible into this specific area. But that's not exactly what we wanted to do. We wanted to do the opposite. So how do we reverse this? So that we have all of our trees on the outside of this vertex blue. Well, the fastest way is to simply invert this. And we can do that several different ways. But the way I'm going to show you is to actually go to white paint mode. So here you can see with our clearing vertex group selected, that any region that is colored red or is basically not blue is going to have the trees scattered in that region. What we can do is we can go to the whites menu and then come down to where it says inverts. We're going to invert the active vertex group. As soon as we do that, the area that was previously read is now blue. And what was blue is now wed. And in real-time, the trees had been repositioned on the outside of this clearing. 38. Using Weight Painting For Vertex Groups: Considering the importance of being able to accurately create vertex groups. And the facts that we have already moved into the weight pain mode anyway, we might as well just demonstrates the second method of creating a vertex group. And that is to use the white paint tool. What we're going to do is we're going to add a new vertex group. And I'm going to name this as river. So what I'm going to do in my talk orthographic view is I'm just going to paint a river going down at this side of the forest. You can define things such as your weight value, which is good when sets one, radius is going to be the size of your brush. So we increase this to 100. The radius of the curve increases, but we want this to be around about 40. And we also have the strength. So how powerful is the Brush itself going to be? So these are the values that I'm going to use, 141. Then I'm just going to click and just move my cursor down to the bottom. If I was to hide my geometry nodes, you can see the white painting on the surface of the object. So I'm just going to increase the size of my river, going all the way down. And this is probably easier if you have a pen and graphics tablet. So I'm going to go to about here. And that would do me bring my forced back into view. And then what we can do is we can define this new vertex group which is weaver in our points density node. So from here, I'm going to, instead of using the density attribute for clearing, I'm instead going to use it for river. As you can see, we get the same issue again where it's basically positioned on the river itself, but we can just go weights and select inverts to reverse that affects. And that's how we can use white painting to create customized shapes on our textures or planes to define the location of our points, instances. 39. Using Empties For Control Overview: So each scene creation is all about being able to make adjustments in real time and having complete control over your scene. So in the next couple of lectures, I'm going to be demonstrating to you how you can use a different object altogether to control the scaling of your particles or your point instances by determining the location and scale of that specific objects. So what we're going to do is we're going to create an object. We're going to base it in the center of our map that we have here. And as we reposition that object, we can scale up any of the points that are located in the same area. We can increase that objects influence by increasing its size using scaling. The object in question is going to be an empty object. So let's see how we can connect an empty object to the scaling of the individual points for our forest. 40. Creating New Attributes: To start things off, I'm going to be making a couple of changes to the setup that I already have. I'm going to keep the attribute randomized node, but I'm actually going to change the attribute of this is going to use, I'm going to switch it from scale to rotation. Now, as you can see, this makes a very notable difference with regards to our set up. But what we're going to do is we're just going to disconnect these math nodes, select them, and delete them. Then we're going to change the attribute type form floats to vector. We're going to position the max value on the x-axis to 0 and also on the y. And for now we keep the value on the z-axis to one. You can adjust the seed if you want as well. Then we're going to add our next node in the setup. This is also going to be an attribute randomized node. So hit Shift D position and select. With this randomized node, we're actually going to be turning this back into a float. And we're going to be setting this to a brand new attributes. The attribute in question is going speed labeled as size. I am going to press Enter to confirm. And this is going to represent the minimum scale of my tree objects. So I'm going to reduce the max value to 0.6, increase the min to 0.4. Now, at this point, the size attribute is one that we have just generated and we created a values for it. He, because of that Blender, does not know what to do with this attribute. So our next step is going to be to tell it what to do with said attribute. Of course, we're also going to need a second one of these attribute nodes to represent the maximum scaling of the trees. So we're going to hit Shift D to duplicate and position here, rename this as size B. Set the Min value to 0.7 and the max value to one. Our next step is going to be to mix these values together. We can do this by adding an attribute mixed node located here. We can position is of that the second of these attribute randomized nodes. And actually there are three of them. If you include rotation. And we're going to position this one. He well, we're going to do is we're going to take one of our new attributes and mix it with the other to create the new results, which is going to be our scale. So what you can do is you can hover over an attribute, hold down Control and C, and that will copy it. You don't get any indicator to tell you that it has been successfully copied. But if you come over to the blank space next to the a input, if you go Control and V, you can see that it pastes in exactly what you copied. We're going to do the same with size be Control, and C to copy control, V to paste. Then we're going to set the results to scale, which is an attribute that exists. So press Enter and you can see a small change occurs with regards to our point system located in the free DVI ports. If we adjust this factor value, we are effectively adjusting which of these two randomized nodes is given more priority. So if we set it to 0, then we're focused purely on the size attributes. If we set it to size be ors, or a factor or one, then we are setting it to size B. For now, I'm just going to set it back to 0.5. 41. Your Trees Are Too Tall: In this video, we're just going to be covering a very important topic with regards to your point, instances relating to the actual plane that we are projecting them on. And that is the topic of applying your transforms. Now when using geometry nodes the same as using specific tours in the 3D view ports. The behavior of these generated points is dependent on the transform values of the objects that they are applied to. So if I was to go into object mode for my plane objects, then go to the Item tab in the side panel. You can see that the scale is set to 20 times on all three axes. And this is what's causing the issue with our trees because they are also being scaled up to 20 times their original size. So you think, Oh, okay, The solution here is to just apply the scale. But be very careful if you choose to do that. If you don't double-check your settings. For example, with my setup, I have a max density of 4 thousand. The problem he is that if I applied a scale, it's going to give all of my trees the correct scaling. But as a result of that, it's going to significantly increase the amount of trees on my plane and that could potentially crash blender. So if you're ever looking at this situation where you're about to do something like apply the scale. Make sure to double-check your settings before you do so. For example, I'm going to set my density to 10. Just for the moment. Then what I can do is I can come back into my 3D viewport, hit Control and I, and select scale. And I can do so safely with that lower density. Left-click, zoom in. And you can see even with the density value set to 10, we have a lot of trees on our plane. Can you imagine what would have happened if I had attempted to apply the scale for 1000. Even this seems too much. So I'm going to reduce this to five and increase the minimum distance. Remember, we're using the Poisson disk method. So if we increase this, then it will gradually decrease the number of trees on our playing. Until we reached a point where we have a little bit of space in-between our trees. I'm just going to reduce this value so that we can generate just a few more trees. And that looks perfect. 42. End Of Class Challenge: Congratulations on completing this class. It is now time to finish on our end of class challenge, where we're going to be assessing the skills that we have been developing throughout this class on using geometry nodes for procedural modelling. Borders challenge. You must complete the following projects. Creates an exam hall with tables and chairs positioned accordingly. Things to consider. Create all objects, including the hole itself, using geometry nodes to some extent, position your objects across your scene using point nodes. Ensure the objects that you creates can be edited correctly in the Modifiers tab for that object. Add materials and lighting to your scene. Both are very important for creating that final result. At other objects, such as a clock on the wall or pencils on the desk to add more detail. And choose modular pieces to create the exam hall. Remember, larger objects can be divided up into modular parts that you can create procedurally using geometry nodes. Complete this challenge by using all of the skills that you have learned in this class. Thank you very much for joining me and I hope to see you next time.