WEBVTT

﻿1
00:00:00.000 --> 00:00:01.000
Hey there.

2
00:00:01.140 --> 00:00:04.620
So Blender 4.3 is released and it comes packed with a lot of new features.

3
00:00:05.100 --> 00:00:06.720
That also goes for geometry nodes.

4
00:00:07.160 --> 00:00:10.880
To give you a good overview of what these new features are and how you should best

5
00:00:10.881 --> 00:00:13.940
go about using them, I want to walk you through them in this video.

6
00:00:14.160 --> 00:00:16.100
So first up, there are gizmos.

7
00:00:16.840 --> 00:00:17.360
That's right.

8
00:00:17.560 --> 00:00:21.680
The fancy little widgets that you have in your 3D viewport to control objects and

9
00:00:21.681 --> 00:00:23.820
manipulate them are coming to nodes as well now.

10
00:00:24.040 --> 00:00:28.280
For now, that doesn't directly mean much for the average user, but it's more aimed

11
00:00:28.281 --> 00:00:32.560
at geometry nodes users that are building their own tools to give them the ability

12
00:00:32.561 --> 00:00:36.360
to build those tools in a way that they're interactive in the 3D viewport.

13
00:00:36.600 --> 00:00:39.137
Down the road, more and more tools that are built into

14
00:00:39.138 --> 00:00:42.260
Blender will also have their own gizmos coming out of the box.

15
00:00:42.740 --> 00:00:46.880
So in the end, users that just use geometry nodes hidden away behind a

16
00:00:46.881 --> 00:00:51.500
modifier interface will be able to benefit from these gizmos, but also geometry nodes

17
00:00:51.501 --> 00:00:55.780
users that build their own custom node trees will be able to use these gizmos to

18
00:00:55.781 --> 00:00:59.280
manipulate the effect of the nodes themselves in the 3D viewport.

19
00:00:59.600 --> 00:01:01.720
So let's go a little bit over how that works.

20
00:01:02.220 --> 00:01:05.644
At the moment, there are just three different gizmo nodes,

21
00:01:05.744 --> 00:01:09.200
the linear gizmo, dial gizmo and the transform gizmo.

22
00:01:09.740 --> 00:01:12.119
Essentially, what these gizmos do is just provide

23
00:01:12.120 --> 00:01:14.861
you with a different interface to control values.

24
00:01:15.680 --> 00:01:18.160
Let's build a basic example for a grid plane.

25
00:01:18.840 --> 00:01:21.160
First of all, let's add the linear gizmo node.

26
00:01:22.720 --> 00:01:25.000
On its own, it doesn't really do much yet.

27
00:01:25.100 --> 00:01:29.440
It just provides us with the interaction for this arrow in the 3D viewport,

28
00:01:29.780 --> 00:01:31.680
but it does not control anything.

29
00:01:32.120 --> 00:01:34.500
And in the end, it just snaps back to its original

30
00:01:34.501 --> 00:01:37.860
position, which is given in the linear gizmo position input.

31
00:01:39.420 --> 00:01:41.968
And other than you might expect, there is not an

32
00:01:41.969 --> 00:01:45.020
output giving us the value that the gizmo changes.

33
00:01:46.220 --> 00:01:51.420
Instead, there is just an input socket, which will affect what the gizmo controls.

34
00:01:52.020 --> 00:01:54.734
So to actually control the size of the grid, we need

35
00:01:54.735 --> 00:01:57.160
some other value that we can control with the gizmo.

36
00:01:57.440 --> 00:01:59.880
For now, let's just add in a value input node.

37
00:02:00.440 --> 00:02:02.909
And this we can then connect to the grid input

38
00:02:02.910 --> 00:02:06.760
for the size x parameter, and also to the gizmo.

39
00:02:07.760 --> 00:02:11.800
Now that the value input of the gizmo is connected to something, you can see that

40
00:02:11.801 --> 00:02:16.260
there is a double line drawn instead of the regular link between them.

41
00:02:16.480 --> 00:02:20.420
This communicates that there is now a different kind of connection happening.

42
00:02:21.280 --> 00:02:27.320
So information from the gizmo is basically flowing back to this value node.

43
00:02:27.960 --> 00:02:33.300
So when I now interact with the arrow, you can see it changes the value here.

44
00:02:33.820 --> 00:02:37.960
This way of controlling values with gizmos in the nodes might seem a little bit

45
00:02:37.961 --> 00:02:41.680
convoluted at first, but you will see later how this is very useful.

46
00:02:42.140 --> 00:02:46.200
Okay, so since this gizmo is supposed to control the size of the grid in the x

47
00:02:46.201 --> 00:02:50.220
dimension, let me fix up the position and the direction inputs of the gizmo.

48
00:02:50.221 --> 00:02:54.726
Let's use a combine xyz node and plug the value that we are

49
00:02:54.727 --> 00:02:58.220
controlling in the x input, and then use that for the position.

50
00:02:58.520 --> 00:03:01.320
For the direction we can just type in 100.

51
00:03:02.180 --> 00:03:05.500
You will also notice that the gizmo does not always just show up.

52
00:03:05.600 --> 00:03:06.660
It depends on the context.

53
00:03:07.300 --> 00:03:09.035
The behavior is a bit different depending on

54
00:03:09.036 --> 00:03:11.060
whether or not you have a node editor open.

55
00:03:11.420 --> 00:03:14.752
With a node editor, the gizmos will only show up if

56
00:03:14.753 --> 00:03:17.680
you have the node selected that corresponds to them.

57
00:03:18.260 --> 00:03:21.880
So either the gizmo node itself or the node that they are controlling.

58
00:03:22.280 --> 00:03:26.120
If you always just want to see the gizmo, you can also toggle this checkbox.

59
00:03:26.720 --> 00:03:29.213
Since the grid is in the center of the object, the

60
00:03:29.214 --> 00:03:32.740
position of the gizmo should actually be half of the size.

61
00:03:33.660 --> 00:03:38.640
So let's add a multiply node right here to multiply with 0.5.

62
00:03:38.940 --> 00:03:40.260
And now it's in the correct spot.

63
00:03:40.600 --> 00:03:45.440
But if I interact with the gizmo now, you can see that it doesn't stay to the size.

64
00:03:45.920 --> 00:03:47.060
Only if I let go.

65
00:03:48.140 --> 00:03:50.500
The reason for that is that the position is correct.

66
00:03:50.860 --> 00:03:55.560
But while I'm interacting with it, how much the value changes depending on my

67
00:03:55.561 --> 00:03:59.083
movement is derived from what is happening

68
00:03:59.084 --> 00:04:02.780
between the value I am controlling and the gizmo.

69
00:04:03.080 --> 00:04:06.730
And the value that I want to control interactively

70
00:04:06.731 --> 00:04:11.520
in the viewport is not the full size, but half of it.

71
00:04:12.020 --> 00:04:16.940
So if now instead of the value directly, we connect the output of this multiply

72
00:04:16.941 --> 00:04:22.460
node, you can see that the double links still end up at this input node,

73
00:04:22.820 --> 00:04:24.720
but they flow through the multiply node.

74
00:04:25.060 --> 00:04:28.660
And when I interact with it, now everything stays attached as it moves.

75
00:04:29.420 --> 00:04:33.614
So Blender tries to smartly figure out the relationship between

76
00:04:33.615 --> 00:04:36.360
your interaction and the value that you're interacting with.

77
00:04:36.361 --> 00:04:39.700
This works for all sorts of simple math relationships

78
00:04:39.800 --> 00:04:42.700
like multiplying, adding, and so on quite nicely.

79
00:04:43.160 --> 00:04:46.840
And the flow of information always takes the first input of a node.

80
00:04:47.140 --> 00:04:51.880
So here now you can see that the value that is controlled with the gizmo is the

81
00:04:51.881 --> 00:04:56.140
first input of the math node, or whatever is connected to that first input.

82
00:04:57.380 --> 00:05:00.220
Alright, so let's do the same thing for the y direction.

83
00:05:00.520 --> 00:05:05.040
Just going to duplicate the setup, plug this into y, change the direction,

84
00:05:05.760 --> 00:05:07.000
and reconnect the size.

85
00:05:07.520 --> 00:05:09.640
And now we already have the setup for both directions.

86
00:05:10.640 --> 00:05:13.140
We can quickly give the different arrows the correct colors.

87
00:05:13.820 --> 00:05:16.660
Next I want to turn this into a handy little node group.

88
00:05:17.240 --> 00:05:20.700
So I'll just select these nodes, press Ctrl G, and there we go.

89
00:05:21.180 --> 00:05:24.687
Now that this is part of a node group, the values of the

90
00:05:24.688 --> 00:05:27.400
node group itself can also be driven with the gizmos.

91
00:05:27.780 --> 00:05:31.340
So if I get rid of these input nodes and just leave the node group on its own,

92
00:05:32.220 --> 00:05:36.040
you can see that controlling the gizmos will directly control these values.

93
00:05:36.480 --> 00:05:39.428
So we nicely have contained the gizmos inside of

94
00:05:39.429 --> 00:05:42.040
this node group and can just use them like this.

95
00:05:42.260 --> 00:05:46.600
And here again, only the gizmos for the active node will show up in the viewport.

96
00:05:47.180 --> 00:05:52.240
But if I go one step further and expose these as group inputs to the modifier

97
00:05:52.241 --> 00:05:57.340
level so that they show up here, even if now we get rid of the node editor,

98
00:05:57.640 --> 00:06:00.823
we'll be able to control these parameters from the 3D

99
00:06:00.824 --> 00:06:04.160
viewport for the active object and its active modifier.

100
00:06:05.040 --> 00:06:07.082
This makes it very convenient when you're using a

101
00:06:07.083 --> 00:06:09.540
modifier that is set up with gizmos in this way.

102
00:06:09.960 --> 00:06:13.680
But for now, let's open the node editor back up and make some changes to the setup.

103
00:06:14.280 --> 00:06:16.156
First of all, I want to clean this up a little bit.

104
00:06:16.180 --> 00:06:19.545
We can actually duplicate this group input and just

105
00:06:19.546 --> 00:06:22.860
connect the size x and y values directly from here.

106
00:06:23.280 --> 00:06:26.560
So we have two parts of the node tree that are a little bit split up.

107
00:06:26.760 --> 00:06:30.800
The main data flow with the grid and then the gizmo information down here.

108
00:06:31.100 --> 00:06:34.506
I want to be able to control both of the x and the y scale

109
00:06:34.507 --> 00:06:37.960
with a single gizmo that goes diagonally to scale up the plane.

110
00:06:38.720 --> 00:06:42.171
You can easily have multiple gizmos control the same

111
00:06:42.172 --> 00:06:45.020
values or also one gizmo control multiple values.

112
00:06:45.460 --> 00:06:49.260
To get the gizmo I just mentioned, let's duplicate one of the linear gizmo nodes.

113
00:06:49.640 --> 00:06:52.220
And for now, let's just connect it to both of these.

114
00:06:52.760 --> 00:06:57.060
So you can see if I change this gizmo, it affects both the x and the y size.

115
00:06:57.440 --> 00:07:02.020
For the position, we can just add the positions of the x and the y together.

116
00:07:02.260 --> 00:07:03.960
And we can also use that for the direction.

117
00:07:04.240 --> 00:07:07.260
But you can see just like we had it before, it doesn't quite stick.

118
00:07:07.620 --> 00:07:12.260
The reason for that is simply that since this is a rectangle, the ratio of changing

119
00:07:12.261 --> 00:07:16.680
the x and the y size should depend on the dimensions of this rectangle.

120
00:07:17.180 --> 00:07:20.540
To fix this, unfortunately, we need to do a little bit of trigonometry.

121
00:07:20.960 --> 00:07:23.628
To get the correct ratio between the x and the

122
00:07:23.629 --> 00:07:26.000
y component, we can just use an arctangent.

123
00:07:26.160 --> 00:07:31.400
Let's go with arctan2 so we can connect the x and the y component like this.

124
00:07:31.900 --> 00:07:34.260
And this way we essentially get the angle of this arrow.

125
00:07:34.620 --> 00:07:38.200
So to get the correct ratios, now we just need a sine and a cosine.

126
00:07:39.660 --> 00:07:44.420
And to apply these ratios correctly, we just divide the values that we want to

127
00:07:44.421 --> 00:07:47.120
control by the sine and the cosine respectively.

128
00:07:50.400 --> 00:07:51.500
And there you go.

129
00:07:52.000 --> 00:07:55.900
Now everything is perfectly attached, no matter what the ratio is.

130
00:07:57.080 --> 00:07:58.845
Alright, let's quickly go over another gizmo

131
00:07:58.846 --> 00:08:01.741
type and add some more functionality to this.

132
00:08:02.220 --> 00:08:06.182
Let's add a Geometry Transform node and switch the mode

133
00:08:06.183 --> 00:08:09.780
to Matrix so we can control this with a Transform gizmo.

134
00:08:10.680 --> 00:08:14.760
Again, we need something to control, so let's add a Combine Transform node,

135
00:08:15.080 --> 00:08:19.260
which combines a translation rotation and scale into a Matrix output.

136
00:08:19.940 --> 00:08:22.444
And this Transform output, we can just connect

137
00:08:22.445 --> 00:08:24.660
both to the transformation and the gizmo.

138
00:08:25.060 --> 00:08:29.160
And when I then select the Transform gizmo, you can see that it already works.

139
00:08:29.740 --> 00:08:31.400
But there is something going wrong.

140
00:08:32.140 --> 00:08:34.822
The gizmos that we previously had for the size

141
00:08:34.823 --> 00:08:38.321
of the grid are not attached properly anymore.

142
00:08:38.860 --> 00:08:40.848
The reason for that is that they are not

143
00:08:40.849 --> 00:08:42.880
actually attached to the geometry of the grid.

144
00:08:43.100 --> 00:08:45.200
But there is a simple way to change that.

145
00:08:45.560 --> 00:08:47.928
You might have already noticed that there is a

146
00:08:47.929 --> 00:08:50.781
Transform geometry output on the gizmo nodes.

147
00:08:50.860 --> 00:08:52.400
So far, we haven't been using that.

148
00:08:53.020 --> 00:08:56.561
This output is actually a tool to attach the Transform information

149
00:08:56.562 --> 00:09:00.140
of the gizmo to a geometry, exactly for cases like this.

150
00:09:00.540 --> 00:09:09.520
So if I make a of the outputs of the gizmo nodes to the geometry of the grid.

151
00:09:10.180 --> 00:09:13.800
And now you can see that Blender is clever enough to figure out that these are

152
00:09:13.801 --> 00:09:16.880
attached to the grid and should follow the same transformation.

153
00:09:17.480 --> 00:09:21.020
We should also do the same thing here for the Transform node afterwards.

154
00:09:21.600 --> 00:09:25.840
Since we are already controlling the size of the grid with the custom gizmo,

155
00:09:25.980 --> 00:09:30.000
I don't want to expose the scale operations of this Transform.

156
00:09:30.001 --> 00:09:33.560
So in the node settings, let's just turn all of them off.

157
00:09:33.880 --> 00:09:36.530
This way, we can only control the rotation

158
00:09:36.531 --> 00:09:39.000
and translation of the grid with this gizmo.

159
00:09:39.380 --> 00:09:43.920
To make this nicely contained in the node group, let's also create inputs for those.

160
00:09:44.720 --> 00:09:47.367
Now that these are exposed, we should also hook them

161
00:09:47.368 --> 00:09:50.420
up to the position and rotation of the Transform gizmo.

162
00:09:50.780 --> 00:09:55.360
So now, if I go outside of the node group, you can see we have a nice little asset to

163
00:09:55.361 --> 00:10:00.560
control the dimensions and rotation and translation of this grid very easily.

164
00:10:01.000 --> 00:10:03.115
But the Transform gizmo right now is not

165
00:10:03.116 --> 00:10:05.640
actually following the rotation as we set it up.

166
00:10:06.260 --> 00:10:08.694
The reason for that is that the Transform

167
00:10:08.695 --> 00:10:12.481
orientation setting in the viewport is set to global.

168
00:10:12.660 --> 00:10:15.045
If we change this to local, it will accurately

169
00:10:15.046 --> 00:10:17.840
change into the Transform that we set, like this.

170
00:10:18.160 --> 00:10:20.380
Next up, there's the for each element zone.

171
00:10:20.680 --> 00:10:23.600
Since the beginning of implementing Geometry nodes, people have been asking

172
00:10:23.601 --> 00:10:26.640
for loops to iterate over different elements of a geometry.

173
00:10:27.220 --> 00:10:31.720
And even though we had the repeat zone in Geometry nodes for a couple of releases,

174
00:10:32.220 --> 00:10:34.988
now there's a new zone that allows you to iterate

175
00:10:34.989 --> 00:10:37.440
over the geometry in a completely different way.

176
00:10:37.680 --> 00:10:42.420
The repeat zone is essentially just a serial loop to copy over the same

177
00:10:42.421 --> 00:10:45.400
functionality in succession a dynamic number of times.

178
00:10:45.600 --> 00:10:49.720
The for each element zone works a bit differently and then it executes the same

179
00:10:49.721 --> 00:10:52.460
functionality for each element of a geometry.

180
00:10:52.560 --> 00:10:53.840
And that can happen in parallel.

181
00:10:54.080 --> 00:10:57.640
So what that means is that you can iterate over the elements of a geometry,

182
00:10:57.840 --> 00:11:02.400
so the points, faces, edges, and so on, to execute the same functionality,

183
00:11:02.780 --> 00:11:05.980
and then output everything together merged into one geometry.

184
00:11:06.520 --> 00:11:11.960
In this example here, I'm creating a tree library this way by just having a grid of

185
00:11:11.961 --> 00:11:15.943
a bunch of points and then executing the tree generator

186
00:11:15.944 --> 00:11:18.800
once for each point while randomizing the inputs.

187
00:11:19.200 --> 00:11:22.180
Doing this wouldn't have been possible in this way before.

188
00:11:22.181 --> 00:11:24.261
It would have been a lot more complicated to achieve.

189
00:11:24.740 --> 00:11:27.860
So let me just quickly go over the details of how this zone works.

190
00:11:28.540 --> 00:11:31.089
To show the for each element zone, let's go over how

191
00:11:31.090 --> 00:11:34.160
to create this kind of library of randomized trees.

192
00:11:34.580 --> 00:11:38.860
Let's start out by using the grid plane asset that we just created for the gizmos.

193
00:11:39.780 --> 00:11:43.700
The only thing that I added on top was an additional gizmo to control the resolution.

194
00:11:44.320 --> 00:11:48.100
This resolution is going to be controlling the amount of trees that we're generating

195
00:11:48.101 --> 00:11:51.402
because what we're going to do with the for each element zone

196
00:11:51.403 --> 00:11:54.500
is iterate over all of the individual points of this grid.

197
00:11:55.000 --> 00:11:58.880
So let's get started doing that by first of all adding the for each element zone.

198
00:11:59.420 --> 00:12:04.020
As all the other zones in Blender, it comes with an input node and an output node.

199
00:12:04.340 --> 00:12:06.120
And they already have a couple of settings.

200
00:12:06.760 --> 00:12:09.960
First of all, let's connect the grid plane with the input.

201
00:12:10.360 --> 00:12:14.200
And on the input node, you can see that we can select the different domains to

202
00:12:14.201 --> 00:12:17.160
control what kind of element we want to iterate over.

203
00:12:17.300 --> 00:12:19.260
In our case, the points will do just fine.

204
00:12:19.520 --> 00:12:22.114
In case we would want to limit this to only a specific

205
00:12:22.115 --> 00:12:24.800
selection of points, we have the input right here.

206
00:12:25.300 --> 00:12:28.621
So now whatever we do inside of the zone will be

207
00:12:28.622 --> 00:12:32.600
executed once for each individual point of this geometry.

208
00:12:32.920 --> 00:12:36.580
And in this case, I want to generate one tree for each point.

209
00:12:36.880 --> 00:12:40.300
For now, let's just create a cube so I can show you the basics.

210
00:12:40.780 --> 00:12:43.790
When I just add this, it's not actually part of the

211
00:12:43.791 --> 00:12:46.181
zone yet because it's not connected to anything.

212
00:12:46.300 --> 00:12:48.340
We need to connect it to the output of the zone.

213
00:12:48.660 --> 00:12:51.640
Now, right away, there are two lists of outputs.

214
00:12:51.900 --> 00:12:56.860
There are the main outputs where the main geometry is going to be passed back out.

215
00:12:57.420 --> 00:13:02.920
So if I connect this to the output of the modifier, you can see this is just the

216
00:13:02.921 --> 00:13:05.980
grid plane that we plugged in to the zone in the beginning.

217
00:13:06.500 --> 00:13:11.640
But here we have the option to add additional attributes to attach to the geometry.

218
00:13:12.100 --> 00:13:16.420
But instead of the main geometry, we want to generate new geometry in this case.

219
00:13:16.780 --> 00:13:20.260
So let's connect the output to this additional geometry output socket.

220
00:13:20.700 --> 00:13:23.900
This one has an equivalent on the inside of the zone.

221
00:13:24.360 --> 00:13:27.200
And if I connect the cube here, it pops up right there.

222
00:13:27.580 --> 00:13:32.900
If we go ahead and inspect the geometry in the spreadsheet editor, you'll notice that

223
00:13:32.901 --> 00:13:35.941
this is not actually a single cube, but a cube for every

224
00:13:35.942 --> 00:13:39.000
single point of the grid, just all in the same place.

225
00:13:39.340 --> 00:13:44.560
All the cubes for the individual points are merged together in this geometry output.

226
00:13:44.880 --> 00:13:46.800
Now, let's get them all in the correct places.

227
00:13:47.180 --> 00:13:50.607
For that, we need to access the position of each individual

228
00:13:50.608 --> 00:13:53.300
point and then move each cube into the right space.

229
00:13:54.100 --> 00:13:56.700
Let's just use the transform geometry node for that.

230
00:13:57.060 --> 00:14:01.660
To get the position of each individual point, we need to use the position input

231
00:14:01.661 --> 00:14:05.920
node and then pass it in from the outside of the zone.

232
00:14:06.300 --> 00:14:09.522
This will make sure that the position is stored on

233
00:14:09.523 --> 00:14:12.860
each point and then passed into the zone as a value.

234
00:14:12.861 --> 00:14:17.300
You can see here, because of the shape of the socket, that on the outside of the

235
00:14:17.301 --> 00:14:21.500
zone, this is actually an attribute, so a different vector for each point.

236
00:14:21.780 --> 00:14:25.800
On the inside, though, we are only dealing with one point at a time.

237
00:14:25.960 --> 00:14:30.840
So here, this will always just be a single value for each point.

238
00:14:31.260 --> 00:14:35.520
And that means you can actually connect it to the translation of the transform node.

239
00:14:35.840 --> 00:14:40.060
And as I connect it, you can see that all of the cubes jump into place.

240
00:14:40.480 --> 00:14:44.700
If I select the grid plane, we even still have access to the gizmos.

241
00:14:45.340 --> 00:14:48.861
Now that we have the basics set up, let me replace this

242
00:14:48.862 --> 00:14:51.221
cube with the birch node group that I have prepared.

243
00:14:51.860 --> 00:14:54.740
This is just a simple tree generator node group.

244
00:14:55.220 --> 00:14:57.540
And it also comes with some gizmos attached.

245
00:14:57.800 --> 00:15:01.940
But right now, we're just generating the exact same tree every single time.

246
00:15:02.000 --> 00:15:03.100
And that's not the point.

247
00:15:03.440 --> 00:15:05.180
What I want to do is randomize this.

248
00:15:05.181 --> 00:15:08.912
So something that we can very easily do is just use the

249
00:15:08.913 --> 00:15:12.360
index of the point for each iteration of creating a birch.

250
00:15:12.600 --> 00:15:15.220
And this way, we already get some variation.

251
00:15:15.580 --> 00:15:20.240
But on top of just changing the seed, we can also change the other input parameters.

252
00:15:20.800 --> 00:15:22.740
So let's use a random value node.

253
00:15:23.220 --> 00:15:25.940
And then we can connect it, for example, to the branch start.

254
00:15:26.440 --> 00:15:28.580
But right away, we get an invalid link.

255
00:15:28.800 --> 00:15:32.820
The reason for that is that the ID input uses a field by default.

256
00:15:33.140 --> 00:15:35.580
But here, we need to make sure to output a single value.

257
00:15:35.780 --> 00:15:39.500
So we can just replace the ID input with the index.

258
00:15:39.860 --> 00:15:43.800
And now we get some random variation of the branch start for each tree.

259
00:15:44.000 --> 00:15:45.840
So let's just use a reasonable range.

260
00:15:46.360 --> 00:15:48.280
And then I want to do the same for the height.

261
00:15:48.660 --> 00:15:52.099
But the height, if I go into the birch node group,

262
00:15:52.100 --> 00:15:55.100
you can see it can still be controlled with the gizmo.

263
00:15:55.500 --> 00:16:01.980
So if I just Since there is nothing to be controlled.

264
00:16:02.520 --> 00:16:05.940
To keep this control available, instead of connecting the height directly

265
00:16:05.941 --> 00:16:09.140
to a random value, we can just use a multiply node.

266
00:16:09.500 --> 00:16:14.340
And instead of connecting the random value to the first input, it propagates the

267
00:16:14.341 --> 00:16:16.960
gizmo, we just connect it to the second one.

268
00:16:18.240 --> 00:16:21.900
So now we still have control, as well as randomization.

269
00:16:22.840 --> 00:16:25.361
And because of the way that the gizmos are set up,

270
00:16:25.362 --> 00:16:27.821
everything just works and is attached properly.

271
00:16:28.180 --> 00:16:31.989
And we can still just select the initial grid plane and control

272
00:16:31.990 --> 00:16:35.060
with our gizmo how this library is supposed to be set up.

273
00:16:35.740 --> 00:16:39.220
Now, lastly, I want to go over some additional aspects of the zone output.

274
00:16:39.740 --> 00:16:44.960
Instead of outputting all of these birch meshes in one single geometry,

275
00:16:45.620 --> 00:16:47.460
turn them all into individual instances.

276
00:16:48.240 --> 00:16:50.560
For that we can just use the geometry to instance node.

277
00:16:51.280 --> 00:16:55.420
Now each birch tree is its own instance of a mesh.

278
00:16:56.200 --> 00:16:58.560
And you can see a list right here in the spreadsheet editor.

279
00:16:59.060 --> 00:17:02.640
And our output geometry contains these 64 instances.

280
00:17:03.600 --> 00:17:06.641
And with these extension sockets, we can add additional

281
00:17:06.642 --> 00:17:09.900
information as attribute data on the output geometry.

282
00:17:10.680 --> 00:17:17.120
So for example, if I connect the actual height that has been in the zone to create

283
00:17:17.121 --> 00:17:22.080
a new socket here, on the outside, you get information about the height of

284
00:17:22.081 --> 00:17:25.480
the individual trees on the instance domain as an attribute.

285
00:17:25.880 --> 00:17:29.860
But to make that work properly, we need to go to the node settings and

286
00:17:29.861 --> 00:17:33.340
then change the domain to instance to match our output.

287
00:17:33.780 --> 00:17:38.620
And then if I connect a viewer set to instance, you can see right here in the

288
00:17:38.621 --> 00:17:41.447
spreadsheet that now every single tree also

289
00:17:41.448 --> 00:17:43.960
outputs its actual height as attribute information.

290
00:17:43.961 --> 00:17:48.641
By clicking while holding Ctrl, you can easily rename this in the node interface.

291
00:17:48.680 --> 00:17:51.600
It's also useful to know that you can output

292
00:17:51.601 --> 00:17:54.120
multiple sets of joined geometry together.

293
00:17:54.420 --> 00:17:56.580
If you do that, it creates this separator line.

294
00:17:56.680 --> 00:18:00.228
The reason for that is that all of the attributes you

295
00:18:00.229 --> 00:18:03.360
output belong always to the previous geometry output.

296
00:18:03.820 --> 00:18:05.160
So the order of them matters.

297
00:18:05.360 --> 00:18:07.980
But that's it for now for the for each element zone.

298
00:18:08.300 --> 00:18:12.840
One last thing to mention is that there are also different types of for each zones

299
00:18:12.841 --> 00:18:15.183
planned, like for example, to iterate over

300
00:18:15.184 --> 00:18:17.480
different parts of a mesh like mesh islands.

301
00:18:18.080 --> 00:18:22.440
But do consider that using any kind of loops in your node interface is likely

302
00:18:22.441 --> 00:18:24.200
going to come with some performance penalty.

303
00:18:24.480 --> 00:18:28.500
So whenever you can solve a problem without using the for each element zone,

304
00:18:28.720 --> 00:18:30.660
it's probably more efficient to do so.

305
00:18:30.940 --> 00:18:32.000
Just keep that in mind.

306
00:18:32.420 --> 00:18:37.060
Another new feature is that you can now name your geometry from within geometry

307
00:18:37.061 --> 00:18:40.080
nodes to get a better overview in these sheet editor.

308
00:18:40.460 --> 00:18:42.629
We can get a good overview of what that means

309
00:18:42.630 --> 00:18:45.241
by slightly adjusting the tree library setup.

310
00:18:45.580 --> 00:18:48.154
So right now in the spreadsheet editor, it's a bit

311
00:18:48.155 --> 00:18:50.701
hard to have an overview of all these different trees.

312
00:18:51.240 --> 00:18:53.340
So let's give them all an individual name.

313
00:18:53.760 --> 00:18:58.360
So let's add the set geometry name node right before we turn it into an instance.

314
00:18:58.800 --> 00:19:00.740
And for now, let me just set this to birch.

315
00:19:01.120 --> 00:19:04.270
And now you can already see how all of these trees

316
00:19:04.271 --> 00:19:07.260
are now named So let's use the value to string node.

317
00:19:08.040 --> 00:19:09.540
You can set this to integer.

318
00:19:11.220 --> 00:19:12.840
And then connect the index.

319
00:19:13.220 --> 00:19:16.340
So this way we just get the number of the birch as the name.

320
00:19:16.840 --> 00:19:22.980
With a join strings node, we can now add this together with just the string birch.

321
00:19:23.500 --> 00:19:25.180
And we have ourselves a nice readable name.

322
00:19:25.660 --> 00:19:28.640
For the delimiter, I'm just going to use a space input.

323
00:19:29.000 --> 00:19:31.920
And then lastly, let's just add one to the index.

324
00:19:31.921 --> 00:19:34.400
So we start counting at one instead of zero.

325
00:19:34.500 --> 00:19:36.620
For that we can also use the integer math node.

326
00:19:36.980 --> 00:19:37.720
And there we go.

327
00:19:37.800 --> 00:19:41.180
Now all the birches have a name from one to 16.

328
00:19:41.680 --> 00:19:46.520
So when I now duplicate the grid asset that we created, distribute a bunch of

329
00:19:46.521 --> 00:19:52.520
points on it, and then instance the birches that we generated on those,

330
00:19:52.860 --> 00:19:57.800
you can see here in the spreadsheet editor, in the instances overview of the

331
00:19:57.801 --> 00:20:00.930
geometry that we are looking at, you'll see all of the

332
00:20:00.931 --> 00:20:03.341
instances and the name of the birch they are instancing.

333
00:20:03.560 --> 00:20:06.635
And here at the top, we have a hierarchy overview

334
00:20:06.636 --> 00:20:08.980
over all the geometry sets that are used.

335
00:20:09.340 --> 00:20:13.100
So this is our main geometry, which right now is unnamed.

336
00:20:13.580 --> 00:20:18.980
But we can, for example, set this name to forest, and it pops up right there.

337
00:20:19.160 --> 00:20:22.880
And in the hierarchy, it contains all of the individual birches.

338
00:20:23.020 --> 00:20:28.660
But since all the different instances reference the same 16 birches,

339
00:20:28.800 --> 00:20:30.760
in the hierarchy, only those show up.

340
00:20:30.940 --> 00:20:35.460
And here the number on the side tells you how many times they are being instanced.

341
00:20:35.620 --> 00:20:38.296
And by clicking on these birches, you can

342
00:20:38.297 --> 00:20:41.041
inspect the geometry of the individual ones.

343
00:20:41.080 --> 00:20:45.220
So you can see here, all these individual birches don't have any instances,

344
00:20:45.240 --> 00:20:47.280
but they do have a mesh that we can inspect.

345
00:20:47.580 --> 00:20:51.855
So now with blender 4.3, you can also inspect the

346
00:20:51.856 --> 00:20:55.160
hierarchy of geometry nodes using the spreadsheet editor.

347
00:20:55.560 --> 00:21:02.380
So for example, birch 1 is instanced 66 times in the forest, and the geometry of

348
00:21:02.381 --> 00:21:07.900
birch 1 that is being referenced these 66 times can be inspected here.

349
00:21:08.200 --> 00:21:12.520
With a new warning node, you can create your own custom warnings to allow the user

350
00:21:12.521 --> 00:21:14.820
to understand more about something going wrong.

351
00:21:15.000 --> 00:21:16.880
There are three different modes to this warning.

352
00:21:17.000 --> 00:21:20.820
It can either be a critical error, a warning, or just an info.

353
00:21:20.821 --> 00:21:24.900
How this node works is pretty straightforward, and the warnings get

354
00:21:24.901 --> 00:21:28.760
propagated up to the modifier level through all the node groups that you're using.

355
00:21:29.240 --> 00:21:31.521
There is one thing I do want to mention about this though.

356
00:21:31.560 --> 00:21:36.340
You may have noticed that there's also a boolean output coming from the show input.

357
00:21:36.580 --> 00:21:39.364
This is essentially just a pass through and not

358
00:21:39.365 --> 00:21:42.341
actually required to get the right behaviour working.

359
00:21:42.460 --> 00:21:45.776
The reason this exists is just to give you a tool to control

360
00:21:45.777 --> 00:21:48.980
when the inputs of this node are actually being evaluated.

361
00:21:49.140 --> 00:21:52.060
If you don't use it, it will always just be evaluated.

362
00:21:52.460 --> 00:21:56.140
So it might even happen in cases where the warning doesn't actually matter.

363
00:21:56.460 --> 00:22:00.880
So to give Blender more insight on what information in the node tree this warning

364
00:22:00.881 --> 00:22:05.500
is actually attached to, you can use the pass through to control whatever check

365
00:22:05.501 --> 00:22:07.660
you're doing with, for example, a switch node.

366
00:22:08.020 --> 00:22:12.500
So in the case that you're using the pass through, if the output of this switch node

367
00:22:12.501 --> 00:22:15.598
is not actually being used, Blender will just

368
00:22:15.599 --> 00:22:18.320
not even evaluate the inputs of the warning node.

369
00:22:18.680 --> 00:22:21.639
This is usually not super important, but it's useful

370
00:22:21.640 --> 00:22:24.140
for you to know when you're optimising your node tree.

371
00:22:24.680 --> 00:22:28.220
Another big new feature that is more important than it might seem on the

372
00:22:28.221 --> 00:22:31.960
surface is the ability to pack bakes for simulation nodes.

373
00:22:32.540 --> 00:22:35.712
Previously when using simulation nodes, you always had to

374
00:22:35.713 --> 00:22:38.660
store the cache on disk after you baked everything out.

375
00:22:38.860 --> 00:22:40.480
Now that is no longer necessary.

376
00:22:40.780 --> 00:22:43.860
By default, everything will just be packed into the blend file.

377
00:22:44.120 --> 00:22:46.974
This is especially useful, for example, if you're

378
00:22:46.975 --> 00:22:49.260
just baking a single frame of the evaluation.

379
00:22:49.580 --> 00:22:52.080
You might want to do that for performance reasons, for example.

380
00:22:52.320 --> 00:22:56.720
So after a big chunk of the node tree is not going to change anymore, you can just

381
00:22:56.721 --> 00:22:59.542
add a big node set to still and then just bake

382
00:22:59.543 --> 00:23:02.020
it into the packed data of the blend file.

383
00:23:02.340 --> 00:23:05.006
That way, the next time you load up the blend file,

384
00:23:05.007 --> 00:23:07.720
all of the nodes before don't need to evaluate anymore.

385
00:23:08.040 --> 00:23:10.620
Because everything is just cached into the blend data.

386
00:23:11.160 --> 00:23:14.311
You can select whether to store the data on disk or

387
00:23:14.312 --> 00:23:17.560
packed, on the modifier level and the node instance level.

388
00:23:17.680 --> 00:23:21.480
By default, the node instance just inherits the behaviour from the modifier.

389
00:23:22.320 --> 00:23:25.272
There is one more huge topic that I've been kind of avoiding

390
00:23:25.273 --> 00:23:27.760
so far, because it's a bit separate from geometry nodes.

391
00:23:28.140 --> 00:23:31.486
The elaborate rewrite of the grease pencil feature in Blender

392
00:23:31.487 --> 00:23:35.120
now finally allows you to geometry nodes on grease pencil data.

393
00:23:35.540 --> 00:23:39.760
This is a huge benefit because grease pencil has a lot of tooling functionality

394
00:23:39.761 --> 00:23:42.540
that was not previously possible just using curves.

395
00:23:42.720 --> 00:23:47.120
But essentially, what that means is that grease pencil, in terms of geometry nodes,

396
00:23:47.640 --> 00:23:50.080
is more or less just handled like curve data.

397
00:23:50.440 --> 00:23:53.273
So almost all of the nodes that previously

398
00:23:53.274 --> 00:23:56.100
used curves can now also work on grease pencil.

399
00:23:56.460 --> 00:24:00.280
The reason why I'm saying almost is essentially just that grease pencil,

400
00:24:00.380 --> 00:24:05.140
besides what curves store in data, also has the functionality of layers.

401
00:24:05.800 --> 00:24:10.580
So in the context of geometry nodes, grease pencil can mainly be understood as

402
00:24:10.581 --> 00:24:14.060
instances of curves rather than curves directly.

403
00:24:14.660 --> 00:24:17.172
If you really want to treat grease pencil just

404
00:24:17.173 --> 00:24:19.480
like curves, you will first need to convert them.

405
00:24:19.620 --> 00:24:22.262
But there are nodes to convert back and forth

406
00:24:22.263 --> 00:24:24.360
from grease pencil to curves and backwards.

407
00:24:25.020 --> 00:24:27.347
So yes, now you can also just create grease

408
00:24:27.348 --> 00:24:29.901
pencil data from scratch in geometry nodes.

409
00:24:30.260 --> 00:24:32.819
Additional nodes give you the ability to merge grease

410
00:24:32.820 --> 00:24:35.820
pencil layers based on their name or an A group ID.

411
00:24:36.280 --> 00:24:39.327
The name of the layers, in this case, is using the same naming

412
00:24:39.328 --> 00:24:41.880
functionality that I've mentioned earlier in this video.

413
00:24:42.360 --> 00:24:47.000
But yes, since grease pencil data now essentially is just curve data under the

414
00:24:47.001 --> 00:24:49.067
hood, this opens up a whole new world of

415
00:24:49.068 --> 00:24:51.500
possibilities that have not been there before.

416
00:24:51.940 --> 00:24:55.840
So that's it for the big new features for geometry nodes in Blender 4.3.

417
00:24:55.841 --> 00:25:00.180
For a complete list of all the changes, also for all the other areas in Blender,

418
00:25:00.520 --> 00:25:03.640
make sure to check out the release nodes page on blender.org.

419
00:25:03.920 --> 00:25:06.329
And I hope for geometry nodes, this gives you a

420
00:25:06.330 --> 00:25:08.680
better understanding of how to use the new features.


