 Howdy guys. All right, so in this video we are going to walk through the creation of this procedural bridge here for Houdini Engine version 2. We're going to cover things like how to create these handles, right? So you can offset the two sides of the bridge and place it wherever you want. It's basically, you know, the entire placement of the bridge itself. It lets you, you know, put it on any angle or anything like that. Everything updates appropriately. All procedural. Let's actually make it a little bit longer now. There we go. Yeah, and we're going to go walk through, you know, all these different global parameters here. We have the ability to, you know, change the overall look of the hang shape here. That's what I called it. All right, you can change, you know, things like the bridge width overall. We have our lower hang intensity here, all right, which is separate from the upper hang intensity. I usually keep it a little bit like that. And, you know, we have control over just about every aspect of this. We have, you know, the scale seed here changes the overall minimum and max scale. We have our removal weight. So we remove lots of playing so we can basically add them all back in. Yep, you have control over the rotation, individual scale, lots of cool stuff in here. We have the post. One of the coolest things here as I go through the technique about how to create the proper vectors for, you know, creating these, these angles here. So this is kind of like the X spread and the ropes all follow appropriately. Then we have the Z spread. So that's how far they lean back, how far they go forward, stuff like that. And we have stuff for all the ropes and the tie downs here, which are these guys. And then finally, I cover how to procedure the layout, all your UVs inside of Houdini. So we get pretty good overall layout for the UVs. And that is not that. It is actually this guy. Now, this is kind of a quick test using just the UV layout node. And I really just wanted to do it to show you how to organize and how to use this to lay out UVs into specific shells. I'm going to do a follow up on this and show you guys a better way to do that. But it's good to understand how to use that UV layout node in a very custom way. It's just a performance hog. And so I have to do something with Vax instead. But we're going to cover all that stuff. So let's get started. All right. So let's get things started with our rope bridge by creating a geometry container. I'm just going to make this a single geometry container. I'm not going to do a subnet. I don't really need multiple parts inside of Houdini engine for this. You can if you want. I'm going to call this IP rope bridge. I'm going to call this video because I have another one going. All right. I'm just going to right click on this create digital asset. You're most welcome to also use the version digital asset. I'm just more used to doing this. All right. So I'm going to put the namespace on it and then put a version number at the end here like so. And usually go and capitalize these guys. All right. So then we want to go and save this. I'm just going to save it next to my hit file, my HDA folder. You're most welcome to save it wherever you like and hit accept. Destroy all spare parameters because we don't need them. And then let's go and hide all of our default parameters here because we do not want to see those guys. All right. So the first thing I'm going to do is create a folder. I'm going to call this the handle appoint handles folder because I want to set up some handles for this inside of the Houdini engine so we can drag around the two end points of the bridge. All right. And so I'm just going to call this handle points for the actual label. And then we need to float vector threes because we're controlling two points in an ad node. So I'm just going to call this PA for point A and give it a label of point A. And then we're going to do PV for point B like so. And now I need to make sure that I initialize this. And it's important to do this because if you don't do this, then your points are just going to end up at the center of your HDA. And that's just a little jarring for level designers when they first place the HDA into a scene. So I'm going to initialize it to five and negative five. Hit apply. And then let's go set up our handles now. So to do that, we go to the interactive tab into the handles tab here. And then we want to go and create a handle. And the one that we want to use for this HDA is the transformer. So the last one in the list here. And I'm going to give it a name of point A. And then we need another one. So let's create the handle for point B. So it's a point B. And then we need to connect them to our parameters, right? By themselves, these particular handles don't do anything. They actually need some sort of binding to some parameter on your HDA. All right. So that's why we created these float threes first. So select your point A X form there and then score all the way down to the bottom of the list here. All right. And we're looking for these TX, TY and TZs, these bindings. And so what we can do is click this little drop down over here and go find our point A X. All right. So we're going to control the X position with that. And then we're going to control the Y position. And we're going to control the Z position. So all components of that vector. Cool. Make sure you hit apply. And then let's set up the point B over here. So again, you want to go to your TX and bind it to the PBX like so. And TY goes to the PBY. Do that one more time. There we go. And just drag this guy all the way to the bottom. And then finally, our TZ goes to our PBZ. Hit apply and accept. Well, we don't really need to accept unless you want to get rid of the type properties window. You can always leave it up. I'm going to accept because I only have one screen for the video. All right. So let's drop down an add node after diving into our HDA here. And let's go ahead and create two points and then check them on. So we actually have them. So that creates two points in our scene view here. Now, what I want to do is I want to connect them to those two float three or vectors that we created on our parameters. So quick way to do that is just right click right here on your HDA, go to parameters and channels and go to parameters. There we go. And then it makes it easy for us to copy the parameter and go and paste it over here. There we go. So it's relative reference. Cool. So now you can see those points are spaced out there. One last step for this particular process to go to the polygons by group tab on the add node here. And that will create a line for us. So now we have a primitive or a curve. Awesome. So with that all set up, you can see now if I hit enter, so if I just go up one level and then select my HDA, hit enter on the keyboard, you can see now our two handles are driving the positions of those two points. And that's exactly what we want to do. And these handles then get displayed inside of the Houdini engine for Unity and for Unreal. So now we actually need to do something with this. So what I want to do is create the kind of hanging shape for the bridge here. And so to do that first, I'm going to create a resample node here like so. Just wire it in. I'm going to set the length to something like 0.5. You can set it to whatever you want. We're going to be adjusting this later on. And then for the attributes, I want to turn on the tangent attributes here. And rather than the tangent U, I want to send that into the normal. And you can see that that actually creates our flow normals for us as well. All right. So with that done, I'm going to create a subnet now and drop this down. And this just helps me keep my systems contained. So it's easier to manage the HDA or your network. I'm going to call this the bridge shape like so. Go. All right. I'm going to dive inside and let's go now and drop down on null node. And I really do this is actually that important. I do this just to give myself some information about what's coming in. All right. So I'm going to select those guys hit shift L on the keyboard just to organize them. And really that's just my OCD coming through. You don't have to do any of those those steps there. It's just what I do whenever I start these things. All right. So let's create the kind of the droop shape. So I'm going to get our wrangle node here. And I'm going to call this the hang shape. Perfect. All right. So then let's go in here and start typing some back. So this really pretty easy. I'm going to say app P dot Y. So the Y direction of this guy, we're going to droop all those points based off of some curve. So I'm going to say is minus equals to our horse to a CH ramp. And we'll call this the hang shape. Like so. And we're going to use the F at curvy value. So that value that we created from the resample node. All right. So then to expose that ramp so we can control it, we just hit this little button over here. And that now allows me then to control my bridge. But I want this particular shape to be that droop shape. And I want it the curve to look like this. So that means we need to do a one minus here. Like so. Cool. So with that done, then I just need to go and select all the points holding down control on my keyboard and selecting all those little handles there and set their interpolation type to B spline. That will give you a really nice curve. So it would also be nice to have control over the intensity of this this sag or this hang. So I'm going to put some brackets around these guys and we're going to multiply it by a global value. So we'll call this intensity. So and then expose that slider. Now we have control over that intensity. I'm just going to droop it down just a little bit more. Cool. All right. So now we got that all done. You'll notice that our flow normals aren't set. And you know, when you start doing this, the lengths of these particular segments are different. So we should just drop down a resample node anyways and resample it again. And we'll do a point five and we will just regenerate our normal and our curvy values. So now we have those flow normals there. All right. And then what I need is to create my other vectors for my curve directions. So I'm going to call this dirrs. And I am going to then use a preset that I have. So this curve dirr. So I'll let you guys take a minute and just copy that code down. Basically what we're doing is we're taking the current normal. We're flattening it in Y. All right. And then we're doing a cross product to find the right direction. And then we're doing another cross product of the normal and the right direction to get the up vector. And you can always view these. If you select the node and hit X on the keyboard to visualize your directions. And then you can go to the visualizers tab here. And we just want to pick the class. So this is on the points. And we want to get the right or we want to view the right. We want to set the type to marker and then the style to a vector. That allows us to view that particular direction. All right. So it's always good to give these guys a name. So I'm just going to call this writes and writes. And then we can just duplicate it. All right. So now we have two visualizers in here. So I'm going to go to write to and I'm going to call this up and up. And this will be up. And that should have shown us the up vector. Oh, one thing you need to make sure is turn on the active. Sorry about that. All right. So yeah. And then you can colorize these if you want. So we can go back to the right one and make it red. This is the standard colors there. So yeah. Now we have all the vectors we need to then pump into a sweep node. So let's drop down a sweep node now. And in this case, we'll just use the ribbon operation because that's really all we need. We will turn all these primitives into planks here pretty soon. So we don't need any columns here. And I'm just going to set the width to a value of one just to keep it normalized for now into a unit. All right. So that's looking pretty good. I don't need that visualizer anymore. You can always just keep it off to the side. It doesn't hurt anything. All right. And then let's just drop down our output node. So who do you need to know exactly what to output? Beautiful. So let's hop up and out there, select our HDA and then just hit enter on the keyboard to expose our handles. Now you can see now we are controlling that. So the next thing I want to do now is take this HDA. Let's make sure we save it. And I'm going to hop into Unreal. All right. So here I have, you know, the quick example. I'm just going to delete this one out of there. And so now I want to just point out that I'm actually using Houdini version 2 here. So you have this new menu over here. So make sure that you get the latest version. I'm also using Houdini 18.5.492. I believe it was. Yeah, 492. So it's the latest and greatest. It's from the Daily Builds as well. So this isn't the production build. All right. So let's go now and get our HDA that we've been creating. So I'm going to go to HDA and I'm just going to drag and drop it into my HDA folder here inside of Unreal. Perfect. Then we can just drag and drop it into the scene and bring that up there. And you can see our points actually did end up in the middle there, which is weird. Those defaults should have worked. Again, this is Houdini engine version 2. So some things are still a little buggy, though it's actually pretty functional. So yeah, there we go. So now we've got two handles that allows us to control the bridge and where we can place it. Awesome. So with that done, let's now focus on actually building all the bridge parts. Let's now focus on creating the wood planks. All right. So what I'm going to do is I'm going to be using the center of each one of these primitives and placing a wood plank onto those points because later on we're also going to want to just instance some sort of parts onto it. So I'm going to go and create any subnetwork here and I'm going to call this build planks like so. And let's just take the geometry that's coming out of this subnetwork and pump it into the first input there. All right. So let's go and get this set up here. And this is just going to be geo in and go and organize those guys. Otherwise it bothers me. All right. Then I hit shift s on the keyboard just to get the wire design there. Okay. So first thing we want to do is create the center point that we're going to copy on to. And so to do that, I'm going to use a wrangle node here. And so I'm going to call this create a center point like so. And to do this, it's quite simple. We just want to run over our primitives. So each primitive here. And I just want to go and add a new point. So we say add point. We want to add it to the incoming geometry or index zero. So the first input here and use app P. So app P in the primitive context is the center of the primitive. So if I hit W on the keyboard, you can see that we have a point now in the center of all those primitives. So let's just get rid of the primitive here. And we're going to say zero at primnum. So the current primnum that we're working on and then one to remove all the associated points with that primitive. So we're left with just these points. So then we can use an add node to turn that back into a curve. So we can do stuff with it. So just do the by group. And there we go. So now we have all that back as a curve. Pretty cool. Really a quick way to, you know, get a center curve out of all your primitives. All right. So then with that, let's create our flow normals again. So this time I'm going to use a polyframe node and just for the tangent type in. So now we have our flow normals. You kind of see them there. Pretty small. You can always change the size of these if you just go to your guides and just set the scale number to one. There we go. Cool. And then let's do our directions. So again, I'm just going to use my preset that I have. I'll call this node dirrs. Just to give myself a little more information. And then we'll just drop this down and get the curved error code like so. All right. So now we've got all that stuff set up. And if we were to go and copy our visualize node from our shape subnetwork there and copy it, we can verify that we have all of our vectors that we need. Cool. So with that, let's go and create a box. We need to actually create the geometry for the plank. So let's take a look at this guy. Go back and do my shaded view hitting W on the keyboard. Now for the size in X, I'm going to keep this at one because remember our geometry coming in is a width of one. So we'll control this stuff here pretty soon with our parameters. So I'm going to set this to a value of like 0.05 for Y. And then remember our Z length is actually that resample length, right? So up here when we resample, our Z length is 0.5. Each one of these segments is roughly a length of 0.5. So in our Z, we can just type in something like 0.4 just to make it a little bit smaller. Cool. So let's turn that guy on there. And let's give this a little bit of detail for now. We'll do something with it later on. So I'm going to do a polybevel. And let's go and hook this guy up here. And let's just add a little bit of bevel here. It won't need much because it's such a small object. And you know, I want to randomize that bevel. So I think what I'm going to do is convert the box over to polygon mesh. And then our polybevel node, you notice we're getting bevels for everything. So if we go to the exclusion dropdown here and set our ignore flat edges, you can see it can have control over when it does an actual bevel based off of that edge angle there. Cool. So then I can use a randomize, actually a randomize node, and we can randomize this. So I'm just going to call this bevel. And I'm going to set the dimensions to one because we only need a single float value. And it's going to go between 0.5 and 1.5, a random value between that. So you can see in your geometry spreadsheet here, now you have these bevel values. All right, so then in your polybevel node, you can actually go to this little drop down for the distance and say scale by attribute. And then type in that bevel attribute. And you can see that our bevels are all just a little bit different. And then you can go and control, you know, that offset there, make it bigger. Yeah, it's pretty cool. All right, so then we can go and copy this to our point. So if we just drop down a copy to points node, and just feed these two nodes in to that guy there, we get our geometry copy to those points. Pretty cool. All right, so with that done, let's now go and I'm going to drop down an assemble node because I want these guys to have a random color. And a quick way to do that is just create this name attribute. So if you notice now in your primitives and your geometry spreadsheet, we have this piece attribute. So what I can do with that is I can drop down a color node here and randomize the color based off the primitive name. So we just drop this or change this to random attribute, random from attribute. And we want to do the name. You can see now we get a random color. All right, so now that we got a random color, what I can do is actually change that into a grayscale value that we can use as a blending value. So I'm going to do, we're going to call this my value remap. And in this particular wrangle node, I'm going to roll over my points, which means I'm going to have to actually do a promote here. So let's do an attribute promote and promote that color value from primitives to points. So let's go from primitives to points color value. So now you can see we don't have any color on our primitives, but we have it on our points over here, the point class. So let's do that. It'll just make it easier in this wrangle node to deal with. So we're going to say at CD is equal to, and I'm going to clamp it first, and then we're going to make it equal to a ramp value. And that name of the ramp is going to be called value remap. All right, because I want to remap some value. And we're going to say RGB2HSV. This will allow us to get the value from one of the channels. So in this case, I'm going to do dot B, the blue channel. We're going to remap that between zero and one, like so. And then turn on our, or create our parameter here. So now we have the ability to, you know, remap our values. So you can do, you know, different things with this, just give it a little bit of variation there. You can always go to the color node as well, and just change your seed value. So you can promote this to get different looks. Awesome. All right, so let's now go and create a color. And this is going to be basically the base color of all those planks there. So I'm going to put it on the point class. Very important to take note of. And, you know, that default value is usually pretty good. So this little swatch right here is usually pretty good wood color just for these debug type meshes, at least. All right, so then I want to do a blend. All right, and I'm not going to use the labs nodes just because it's always good to learn how this stuff is actually done. So I'm going to call this blend colors. As a technical artist, it's important to actually know how these things are done and not become super reliable or reliant on the labs nodes. All right, so let's do other color. I'm going to go and extract or get the color from the second input here, index one, so our grayscale value. And that attribute name is CD. And we want to get it from the PTNM. So PTNM because the point numbers are the same for both of these meshes. All right, so then let's create a white color. So I'm going to say vector white is equal to just one on one, like so. Then I'm going to do an at CD times equals, so the current color coming into this first input here, which is this color that you see on the in the scene view. And we're going to do a lurp. And I'm going to lurp from my white color to the other color. And we're going to create a blend float value. So I'm just going to call this blend, like so. And with that, let's make that spare parameter. Now we can blend in that grayscale value to get some variations there. Very cool. All right, so let's go now and just organize this up. So I just select all these guys hold a on the keyboard, and that basically organizes them for you nicely. Again, you don't have to do that. We'll just nitpicky that way. Just like to keep these guys organized makes it easier to read. All right, so now we've got our plank. So let's just wire that into our output now. And let's save our HDA and let's go back to Unreal. And you can just select your HDA that's in the content browser here, right click on it and say rebuild all instances. And there you go. So now we have our planks. And that's all working awesome so far. So let's make sure that we save our U asset there. And let's focus on creating some parameters now that we've got quite a few things that we can control here. We're going to add a little bit more variation as well to our planks. So let's go back to Houdini over here and get that done. All right, so let's dive back in here and let's open up our type properties and start exposing some things. All right, so the first thing I want to do is go and make this guy collapsible. So I'm going to hit apply. You'll notice in Unreal here it's a tab and I really don't want that. So I just want to make that collapsible, which is supported now in or hng in v2, which is great. So the next thing I want to do, let's make another collapsible folder over here. So I'm going to call this the planks folder for now might change. Do planks. Let's make sure we put the s on there. Again, I'm going to make it collapsible. So apply. All right. And so what I want to do is actually just promote this length value. So I just do an alt, middle mouse click, and that will expose it to your type properties. But not only if you have this open, and the default will be 0.5, which is working pretty well. And I want to set a couple other things. So I'm going to call this planks width actually, or maybe it's not so much width, it's actually more of a depth. So we'll just call it the planks depth. And 0 to 5 might be a bit much we can do. You definitely don't want 0. So let's do 0.1 to 2. I think we'll be fine. I'll just lock those guys out. So let's hit apply. So now that we've done that, we need to make sure that we copy this parameter and make sure we propagate that down to this other resample node here. Right, because I want those two to be the same values for this whole thing to work. So again, let's test that out before we go too far. So we're going to go to parameters, go to our planks, and now we can control that plank value. One thing we do need to do is actually also let me get rid of that guy there. We also need to then put that on the box as well for the z value over here, and then subtract 0.1 from it, basically. So we could always paste that relative reference, or you could just reference this planks depth. Right, so you could just do ch. Two quotation marks go up a couple levels there, and we want to get this planks depth value. Then we're going to subtract 0.1 from it. All right, so let's test that out again. I'm going to go and select my parameters here. Yeah, so now the planks are accommodating that new size, which is good. And you know, even I think we could just keep this to like one, two, I think it's too much. Let's actually just put this on one there. Awesome. Apply and accept. Let's get rid of this. The other thing, actually, I do want to promote that width. So let's go to type properties here. Let's make another folder here. We'll call this our global folder. These are things that are global to the whole bridge. So in this case, the bridge width. All right, so let's go up one and in my resample, that's where we have the width value. We're actually not the resample. It's in the sweep node here. Let's go to the sweep node. This is where we are controlling the bridge width. So again, alt, middle mouse, click to send that value over here. And we can call this bridge width. Now, you don't have to go and rename these, but it's a good idea to give them custom names, for sure. And so we definitely don't want zero point, or we definitely don't want zero. We want something like 0.5 for the minimum and the max, maybe five. And that's all in meters. So just keep that in mind. So maybe six feet is enough. So two. All right, I'm just going to pull this off to the side there. Let's see here. Let's go and test that out now. Let's go to our parameters. And we also need to make it collapsible. So let's go to global, collapsible, apply. There we go. So now we have control over that width of the bridge. Let's make sure we go and view the final here. So now we have the bridge width. Again, the planks aren't updating because we are controlling it through this box here. And so we can now just get our bridge width here, copy parameter, paste that in for the X size. So now we have control over that and our depth of the blinks. Yeah, cool. All right, a couple more things I want to do for the planks here. Let's get rid of that guy there. I want to actually make it so you can remove a certain amount of these guys. And so before we go and create the center point, let's remove, just do like some sort of weighted random selection and remove a couple of planks from there. And to do that, I'm going to drop down an attribute wrangle node and we're going to do a random selection here. And again, I want this to be a weighted selection. So we have control over how much is removed. So I'm going to create a new variable called weight. And this is going to be tied to a float parameter called weight as well. There we go. So let's actually promote that. And let's just default that to 0.5. So basically half the premise will be removed. And so I'm going to do another float called rand val. And that is equal to rand at prim number. So we should actually be running over primitives in this case. And then we want to do a seed value as well. So we're going to do a seed value. There we go. And then finally, we're going to say if our rand val is less than our weight, in this case, I'm going to mark it for removal. You could also just remove it here. So we could just do a remove prim. We could say at prim num here and one to remove all the associated points. And let's go and do that there. And it looks like it is not wanting to do that for me. So let's try a different approach here. That should have actually worked. But I'm going to verify this by doing an at group and then giving it a name. We'll call this remove. And that is equal to one. So now let's take a look at our primitive groups here. And primitives. And it doesn't look like, yeah, we're getting any selection here. Oh, there we go. Yeah. So now we are. Let's test that again there. Comment that out. Oh, it was working. That is weird. It just wanted me to select it. I must have the display flag somewhere else. All right. So now we have, you know, a weighted approach to removing stuff instead of it being completely random. And we have a seed value so it can change it. So really cool stuff. Yeah. So now our whole system still works because we're just removing primitives. Right. So now we have our planks in that place. We shouldn't actually add a normal node here for this as well. I just put this all the way down. Yeah, much better. All right. So the next thing I want to do is go and promote some of those attributes now that we have. So let's go and into our type properties. And let's go into our planks folder and let's promote these two guys. So let's just promote that. Alt, middle mouse click to promote the seed value. I'm going to call this my remove weight and removal weight like so. We'll call this the remove seed value and our removal seed, something like that. And for the seed value, zero to one will be fine. It's pretty touchy. And then for our removal rate, zero to one is actually all we want for that. So to apply and make sure everything's working. So let's go and display our parameters here. And yeah, there we go. Very nice. Cool. So the next thing I want to do is focus on some random rotation. Currently, these guys are all super straight. And that is a dead giveaway that this is a procedural asset. And so I'm going to go and use a regular mode for this. I do like to do the ringles. So we're going to do rotate for the name there. And I'm going to create a new variable called max angle. So this will be the maximum rotation that the plank can actually achieve. So let's do max angle here. And then let's do float rand val. And this is going to be equal to rand at ptenum because we just need some random value to randomize the rotation. So that goes from zero to one. And then I need a float angle. And this is going to be equal to radians. And we're going to fit our rand val between our maximum or minimum or I should say the max angle but negated to the max angle. So anyways, let's actually do it. So you guys can see. So we'll say negative max angle to max angle like so. And it needs to be in radians for the quaternion to work. So let's do a float four or I'm sorry vector four. There we go. And we'll call this rot. And this is going to be equal to a quaternion. And we'll give it that angle and add up like so. And I forgot to type the whole thing. I was getting ahead of myself there. And I need an n. There we go. So finally then we can just apply that rotation to our normal. So I can say q rotate. And we'll do the rot and at and like so. So let's expose our max angle value. And so now we should have control over the angle there. And it looks like, well there we go. We just need to do a little bit more there. So yeah, now we have a little bit more control there. It just makes it look a little bit more natural. I think I'm going to put it on something like four as the default. Yeah, much better. Cool. So with that, I think I'm pretty happy with that. Let's expose that rotation value. So let's get this guy here. Just do a middle mouse click or alt middle mouse click. And we'll call this our max angle. Yeah, max rand angle. How about that? Do the same thing up here. We might want to put planks in front of that as well because we might have another random rotation. And this needs to go from, yeah, zero to maybe 10 as the max. Cool. Let's test it out. There we go. Now we have a little bit better control there. Very nice. All right. So let's jump all the way out. Let's just make sure we save. You can always, if you are on your network, you can always save from here as well just by right clicking this guy. All right. So let's save it. And we'll go back to Unreal here. And let's do a rebuild all instances. And there we go. So now we're getting some cool randomized features, which is awesome. Yeah, we change the bridge width. And we can change that depth there as well. I actually kind of liked it a little bit skinnier. That's nice. And we can change our removal rates or weights. There we go. And our rotation. So we are on our way. All right. So now that we've got all that done, let's focus on getting some of the core ropes and stuff like that in place. So now let's focus on building the post at the end of the bridge here. And I want to have control over basically how far they're leaning in the extraction and how far they're leaning in the Z direction. All right. So let's go take care of that. I'm going to double click this guy to dive inside. I'm actually going to move this guy off to the right here off to the left there. And I'm going to call this out planks. And then I'm going to create a new subnetwork here. And I'm going to call this guy build bridge vectors. So in order to put these posts on here, we actually need to build up some vectors, some very custom vectors. So we're going to be doing some quite a bit of X here to get this going. And so and this is again just one way to do this with you as with anything Houdini, there's tons and tons of ways you could accomplish the same thing. You could probably do it all with nodes. I'm just, you know, more comfortable with the back. So I'm going to call this null node geo in. All right. And first thing I need to do is turn this into two curves based on the the borders here of this particular piece of geometry. So on that add node there, I'm just going to delete the geometry would keep the points and turn on the by group and then just set this to skip every nth point. And that basically gives us the two side curves, which is perfect there. And then we need our flow normals back. So we just use the poly frame. And in this case, what we can do with this guy here is whoops, I went into the wrong one there. But basically what we can do is we can actually set up, you know, most of our directions just with the poly frame now. So let me dive back into here for you guys. So all I need to do is just on this poly frame node, turn on all the options here. And then we're going to do a right. And we're going to do in. And then we're going to do up for this. All right. So we should probably take a look at see what the result of that is because it's not going to be perfect right away. So if I just select my poly frame node and do a X or hit X on the keyboard, let's set up our right. You could always go and copy. Let me just do this one more time. So we beat it into your brains. So I'm going to set rights. And we're going to set that as a marker. And we want that to be a vector. So you can see what we're going to need are the these vectors. So they're facing away from each other. At least that's what I did. I'm going to color this red. And then make a duplicate of it and go to right to make sure it's on. Type in up for the name and label and then up for the attribute that we're using. And yeah, there we go. So now we got it. So that one's pointing down. So we need to reverse that one. So there's a few things that we need to do in order to get these guys all set up. So the first thing that we can do globally is drop down our angle node and just reverse the up vector. So we're going to say reverse up. Now you could do with a wrangle node. I'll show you another way here in just a second. So I would say v at up is equal to negative v at up. And let's wire that guy in there. So now those guys are pointing the opposite direction. And so you could also use a point expression node here as well, if you don't want to type. Of course, I mean, this is just typing vex as well. And so we would have to put in the custom and do up and then set it to negative at up like so. I think you get the same result. Right. So just a couple of different ways to do that. Right. I find that just to be faster using the wrangle node. Again, it all comes down to what you're comfortable with. Okay. And then with that, let's split these into two curves. So we can work on these guys independently, the two halves independently. So I'm just going to split on zero. All right. So that's primitive zero on, you know that by turning on this primitive number display. So let me turn off my point numbers. Right. So there you go. All right. So now I've got primitive zero coming out this guy and primitive one coming out the second output there. So that way we can start to work on this work on each one individually. So let's just drag the visualizers so we can see what our current setup is. Now, what we need to do is actually reverse the right direction here. So let me type or drop down a wrangle node here. And I'm going to call this set adders and groups. There we go. So the first thing we know we need to do is just reverse the right direction. So v at right is equal to negative v at right. There we go. And we'll just feed that guy into there. Cool. So now that's set up appropriately for us. And then let's do a couple things for the end points here. Right. So let me turn off my primitive numbers and turn on my point numbers. So we want to do something on the first point on the last point here. So I can actually do that by just looking at the point number. So I can say if a pt and num is equal to zero, then you're the starting point. So I'm going to put you in a group and say i at group start is equal to one. And else actually we could say if at pt num is equal to the number of points coming in to our first input there minus one, that means you're the endpoint. So I'm going to say i at group end is equal to one. All right. So now we got two point groups set up starting end. All right. So there's our end, there's our start. You can see I'm highlighting here. All right. So now I've just done that and did it all inside of single wrangle node rather than using a group by range and trying to sift it all out or sort it all out. All right. So then on the first point what I want to do is I want to set the vector. Actually I want to do this for both. So I want to say v at up is equal to zero one zero. So just up in the world space there. There we go. Right. Because we're going to be copying posts to these points and the rest of the points are basically going to be used as like as rope. All right. So these guys need special normals and vectors in order to be able to copy the posts appropriately. Cool. So then I need to flatten out the normal. So I'm going to say at n.y is equal to zero. And I also want to normalize it just to make sure it's a unit length there. So say normalize at n. And we want to do the same thing down here. But we also want to reverse the normal here. So let's just paste in that code and then before it let's actually reverse it. It needs to go the other way. Here we go. Yeah. So now we've got the end here pointing the opposite direction as the start point. Cool. So with that done now we need to basically set up the the vectors here so that we can control how far it's leaning in z and how far it's leaning in x. So let's drop down a wrangle note here. And we'll call this post angles like so. And I'm going to make it so that this guy only runs over our grouped points, right? So that way we're not running over every single point. Which is great. So then let's set up two float parameters. So one for angle x. That's going to be equal to radians because it has to be in radians to do the quaternion rotation. And so we convert the degrees. And the reason why I do that is because when you go and put this into Houdini engine, end users or level designers here are using their tool, they're used to thinking of rotations and degrees, right? So we want to convert it back to radians just so it's easier for the end users. So I'm going to call this post angle x. And this one's going to be z like so. So we're going to control those particular rotations. So I'm going to say if this particular point that we're working on is in point group end. So we're going to say zero for the incoming geometry and for the group name and the current point number, right? Because we want to treat the end and start differently. But we want to work on all of those guys in the same wrangle node. So we have both the end and the start groups coming in. And so I need to write a little bit of code to basically decipher or to kind of partition up where the code goes. All right, so let's get the other one set up. So we just need one more if statement here set up. And this one's going to be working on the starts. So to commit code, you might notice that I'm not really, you know, clicking out of it there very much while I'm writing code. I just do control enter when I'm done. And that basically commits the code. And then let's, who do you cook the wrangle node without me leaving the editor here? All right, so let's create a new quaternion. And so this is going to be rot x. And this is going to be equal to quaternion. And we want to use angle x. And we want to rotate on at n. So that's our main pivot basically. And so then we say v at up is equal to a q rotate. And we want to use that rot x quaternion in the v at up as the pivot as well. So now let's expose that there. And let's actually visualize this as well as we're working on it. So we can verify. So let's type in something for like 10. Yeah. So there you go. So now we're rotating this guy. So this is basically controlling that x lean. Cool. And then we just need to do the same thing for the other side sort of the start. But we just need to make gate the normal for this guy. Cool. So now we have control over the both sides. So the same. You can always add a little bit of noise in there too if you want them to be a little bit different. I'm not going to do that in this video at least. All right. Let's do a vector four. And this one's going to be our rot z. There we go. And that's going to be equal to a quaternion as well. And this time we're going to use our angle z like so. And we are going to do v at right for the pivot. And then our at n is going to be equal to a q rotate. And that's going to be rot z and n. So you probably see a pattern here when you're dealing with rotations, custom rotations here, you just build the quaternion and then use q rotate to rotate the normal that you want. All right. So that looks like that needs to be negated. Yeah. Because I want positive values. So I want the end user to always put in positive values and just take care of it in the vex code. Right. So I'm going to do a negative angle z for this guy. Yeah. So now it's always positive. So that's controlling that z lean. All right. So let's copy that code there and let's paste it in right here. And then let's remove the negative. So now they should be, yeah. So if we did that, you can see we are leaning perfectly on the both sides. All right. So with all that done, we just need to go and copy this to the other side. That's why I'm splitting it up because each side needs a little bit different of a treatment. So for this particular side, we don't need to invert the right. So let me actually visualize all this stuff so you guys can see. We don't need to convert the right or reverse the right on this side. It's already fine. So yeah, that's fine there. Cool. And you can see that our angles are going in the wrong direction here. So let's just do this. All we need to really do is go to this post angles or angle node, copy the parameter for our angles. We just need to negate them. So let's just copy the post angle x and the post angle z there and just paste them as a relative reference and then negate the value. So now we have a way that's actually merged us together. Let's do it merge here and visualize our vectors here. So now we have a way of just using these single values here to rotate perfectly on both sides. Yeah. And we can always drop down a box here just to test this out. So let's do like 0.251 and 0.25. And I'll use a match size node and we will do a min for this. So it just sits right on the ground there. And then we'll drop down a copy of points node like so. And the target points we want to set up as our end and our start. There you go. Very cool. Let's turn off all of our component displays and test out our values here. So let's test out our lean to the z and our lean to the x. Looks good. All right. So we are good to go. Let's actually let's get rid of this test post because we need to set up something a little different for the final posts. But we had to do this part. We had to get all of our vectors set up. So let's just get this organized here so I can be happy. There we go. Cool. We are now set up to basically build the rest of the bridge. So with that, let's move on to the next section. All right. So what we're going to do now is focus on just building out the official posts here. Now that we've got all these vectors built for us. So I'm just going to move this over to the side here. And we're going to drop down a subnet. And I'm going to call this build posts. We're also going to do all the rope curves in this node as well. Because I want to show you guys setting up the multiple outputs in these subnets as well. So it's always good. It's a good thing to know. So I'm just going to get this set up here. I'm going to call this curves in. And hit shift s on the keyboard to get my wire design. Cool. So with this done, what we can do right off the bat is start to build the post itself. And to do that, I'm going to actually, this time, rather than using a box, I'm going to use a line. And I'm doing this because I want to procedurally generate the UVs for this. So we're going to approach this a little bit differently. And I'll most likely update the whip planks as well. So to do this, I need a line and a grid. So this grid is going to serve as the profile that we feed into a sweep node. And so for this grid here, what I want to do is I'm going to set this up to, I don't know, something like 0.15. And let's actually just copy this over here and paste over there. So then we just have the one value to adjust. Let's do a space bar G on the keyboard. And we then want to get rid of all these extra subdivisions. So we'll just do two and two for the rows and columns in the grid there. And then what I'm going to do is drop down a polybevel node here, because I want a little bit of bevel on the actual profile there. So I'm actually going to switch this over to points. And we're just going to bevel the edge there. Something like that. That looks good for now. And then let's drop down a polyframe node so we can do our flow normals for our line, just so the sweep node works appropriately. All right, there we go. And then let's do a sweep node. And let's feed these guys into there like so. And it looks like we need to orient our grid. So let's do that and put it on the XY plane. Also, there we go. So I think I'm actually going to make this a little bit tinier because in the sweep node, we can go and apply scale on the curve. And I want to taper this a little bit, just give it a little bit of a stylized look. So there we go. Actually, it felt pretty good there. All right, so we'll leave it there. We'll have to expose those guys to the HDA parameters here pretty soon. Inside of the UVs and attributes tab, I want to go and compute my UVs. So I'm going to save my scene here and hit five on the keyboard to go to the UV view. And we're going to take a look at this. And I don't want to normalize this. And then for the seams, I don't want to snap to the nearest tile boundary. I actually want this to be the same exact size as it is in 3D space. Okay, so there we go. Then we have UVs. Awesome. So we want to go back to perspective view. Let's now take care of the caps. All right, so we need the caps up here. And that's another reason why I'm also producing it this way because then I can UV the caps independently. All right, so let's do a polycap node. There we go. And we are going to need the patch. One thing I should note, you'll notice that this is just a polyfill node. Even though it's a selection in the node library as polycap, it's really just a polyfill node that just has a preset on it. So you can actually set this up yourself. It's just a single polygon, basically. It's all it did. So I just wanted to point that out. All right, so we need to produce that patch group. And what I'm going to do here is go and split off the patches or the caps. So I'm going to select the patch group and invert that selection. So now we have the patches coming out of the second output here. And I'm going to go and blast away Primitive 0. So if I were to put a null node in here, just so you guys can visualize this and turn on your primitums, you can see we don't need the bottom one. And it's always going to be on the bottom there. So let's remove Primitive 0. So we need to get rid of that guy. There we go. So I don't need this null node anymore. Excellent. Let's drop down a polyextrude node and let's give it a little bit of height and a little bit of inset as well. So just a little bit and then a little bit inside it. Cool. All right, and then finally we need to generate some UVs. So let's drop down a UV project node. All right, and with the UV project node selected hit enter on the keyboard to see the projection plane. So all we need to do is just do a negative 90 here. And we now have UVs. All right, because we're working in the center of the world, this, you know, works completely fine. We're going to move it and copy it to points later. So let's merge together the posts now and the caps. So now I have UVs for these guys, which is great. Awesome. So with that done, let's now go and I'm actually going to put this into subnet. So I'm just going to do that and call this a post. Just keep things nice and organized in here. And I want to then copy this to the points. So we're going to do a copy to points node. And we're going to feed that guy into the first input, that guy into the second input. Now right off the bat, you can see that we don't, we only want to copy to our start and end groups. So for our target points up here, let's just do end and start. There we go. So now we've got some posts. Beautiful. All right. So one thing that we're going to have to do, because now what I want to do is focus on the ropes. So currently, we have the bottom ropes already created, or at least the curve for the ropes. I need to create that top curve as well. So what I'm going to do here is I'm actually going to go back into the post network here, the subnetwork. Let's organize these guys by doing a shift L on the keyboard. What I need to do is actually include the line in here as well. So that initial line, because this represents the height. We may actually carve it a little bit. So the top rope actually comes out a little bit lower than the top of the post itself. So let's go and get an object merge node here. And I'm going to call this get line. And let's go now and just drag and drop that into there. Set the transform to none, because we don't need to import any transformation information. So now I've got the line over here. So let's carve it first. So we have control over the placement of that top rope. And you'll notice that it's actually carving on the bottom there. So let's do the second you. And we'll just pull that down just a bit. Excellent. So I need two groups now. So the first one is going to be our post line. So I'm going to call it. It's going to be primitive. So I'm just going to select everything. This is the way we can separate it after we copy it to the points from the actual post geometry. And then the second group I'm going to create is a group to isolate out just the top point there. So I'm going to call this my top point and set the group type to points and put in base group of one, right? Because if you look, turn on your point numbers, you can see we have zero down here and one up here. I just want to isolate that out so I can also blast away point zero. Excellent. With that, we pretty much have everything that we're going to need, I believe, for this. So let's merge these two guys together. So I'm going to put down another merge node. Just merge these guys together. And then we'll output that. So we have a line right in the middle there that's going to get copied onto those points. So I'm going to do an output node down here. There we go. Excellent. So now if we look at our copies and go in a wire frame by hitting W on the keyboard, you can see there's a line in the middle of each one of those posts. And now we're going to separate that stuff out. So I'm going to go now and do a split. So I can split away the post geometry from those lines. So I'm going to do a post line. So that gets me the line. So I'm going to invert the selection. And if I put a null node down, you can see now I have the post geometry on this side. And I have the lines over here, which is perfect. So now all we need to do is just blast away that bottom point. Like so. All right. So let's do top point and then just reverse it. So we get just those top points there. And with that, we can then use an add node. So if we do an add node, and we set this to skip every end point, I believe. Let's do it. Or groups of end points. So we don't need to delete geometry. Let's just go into our polydonsav, go to by group. There you go. Groups of end points. Perfect. Now with that, we can now go and resample it. And on this resample node, let's include all the data so that we need to build up our directions again with all this stuff. And I'm actually going to set this to that 0.5 value, which we could get from our type properties. So we're going to do ch and then do those guys. And then we want to do the plank. I think it was the plank depth. Yeah. There you go. All right. So with that done, let's go and create our tangent. Make this the normal. Those are our flow normals. And this is our curve U value. Beautiful. And then we need to go and get the shape as well. So let's go up to the bridge shape. And let's just copy this hang shape node. Then go back into our build post here. And just apply that there. There you go. So now we're going to basically connect this hang shape to a single float ramp in our parameters, but we can control the top value. So it looks a little bit different than the bottom sag. Awesome. So at this point, I also, I'm going to need to be able to determine left and right here. So let's do this. I'm going to make a little more space up here. Create a group node. And in this group node, I'm going to group just the zero primitives. So if I turn on my primitive numbers, we're going to group this guy. I'm going to call that left like so and put in a zero here. This way you can split off and work on the individual sides when we do the side ropes. All right. And then we're going to actually need to do that for this side as well. There we go. And then let's merge these two guys together. All right. Now I have our ropes or at least our rope curves. This is looking good. Alrighty. And then let's now go and build our the side ropes here. Sorry, I was thinking about that for a second. All right. So let's do a resample. And what I'm going to do is I'm going to, for this one, say that we are going to resample actually based off of maximum segments. And the reason why I'm doing this is because I need to have the same amount of points so I can create these side ropes, right, rather than a length, because these two lines or curves are different lengths, right? So we'll get a different resample value if we use the maximum segment length. All right. So then let's do a split here. And I'm going to split on left. So now we have the ability to work on just the left or the right side. And for this, we only really just need to do an add node here. I'm going to delete the geometry to keep the points. So we'll do a by group. And inside of here, we need to do a skip every end point. And if we move the slider here, at some point here, we'll get completely vertical lines. Now, if you look at the number that's choosing, it's going to be one plus this number. So we can just copy this particular parameter here and paste it in for this parameter and just do a plus one. So now your procedural full on. Yeah, perfect. We've got all of our directions in place looking good. So let's just do an alt left click drag to make copy of that guy. So now we've got the right side there and let's just merge them back together. And there we go. So now we've got all of our direction vectors all set up. It's actually kind of funny that they are displaying there, because I don't have a visualize node down here. So this must be a bug in Houdini 18.5. All right, so now we basically have all the curves. If we were to merge together this node with this node. Yeah, let's hold on. So let's take care of this display issue here. Let's see if this fixes it. Nope. Let's drop down another visualize node. Yeah, where are those guys coming from? That is pretty funky. Let's put this under the output here. Go up a level. There we go. I just had clicked the visualization. So you can always click that on if you have visualizers on your geometry. All right. So with that done, I need let's actually cut this output off here like so. And I'm going to take the post geometry as output zero. And then let's create another output node like so. You can also all click and drag this, but it'll give you an error right off the bat. And that's because we have output zero, output one. This one's trying to be output zero as well. So you'd have to put this to in this case because you have three of them now, right? All right. So now we've got all the curves for the ropes. And we have our posts. Pretty cool. All right. So with that, you know what? I'm going to start assembling this stuff together. So let's set this up before we close out this chapter or section here. So I'm going to drop down an object merge node. And let's drop down an all node. And for this first output here, we'll call this out posts. And I'm going to call this the assemble node. You guys probably see me do quite often. There we go. So we got that in there. Let's go and add another slot into our assemble object merge node and add our planks now. So we're starting to assemble the whole thing together into one piece of geometry. Let's send that out to the output. And you can also just make sure we have normals down here. So for now, I'm just going to make them all just completely hard angles. Cool. There we go. So now we've got that stuff. And we also have the ropes coming out of here, but we need to actually create the geometry for it. So we'll do that here in the next chapter. Let's now put the display flag on that output node. And to save our scene. And let's also save our HDA. All right. And let's go back to Unreal. And let's, let me get rid of my test one there. And let's go now and do a rebuild all instances to update it. And there we go. So now we've got our post added on. How cool is that? There we go. Yeah, very nice. Okay. So I'm going to close it out there and move on to the next steps. All right. So let's do the ropes now. So I'm going to do another subnet. I do like to keep these guys pretty organized lately. So I'm going to call this build ropes. And let's just go ahead and get the output or the null node set up for this. So we'll say out ropes. And there's pretty cool little techniques. Pretty easy. Nothing crazy about it, but a quick way to make ropes procedurally. So let's do a null node here. And I'm going to call this curves in. Shift-Dest. Change my wire designs there. All right. So now we've got all these curves set up for us. Let's go now and turn all these into ropes. So the first thing I want to do is delete a bunch of attributes off here. It'll just mess with the sweep node. So let's do an attribute, delete. And let's go now and delete away our current normal, our right, and our up. Those are the ones that will be the culprits. And also we need to get rid of the texture UVs because we're going to produce some UVs for the ropes using the sweep node. And I've found if you have UVs coming into a sweep node already on your points or your curve, it overrides the sweep node. And so it's just one of those things that, you know, the more experience you have with the sweep node, you'll start realizing. So that's why I'm doing this upfront. Cool. So let's do a new polyframe node to regenerate those float normals for us. And then let's do a for each connected or actually we can just do primitive right because these are all individual primitives. So let's just loop over each one of those individual curves using this for each primitive loop here. There we go. And let's go and set this to single pass so we can just focus on the one. All right. So let's turn on our point display and then drop down another resample node here. I'm going to give this just a little bit more points to work with. It'll make the rope geometry a little more dense, but it'll look better. All right. So I'm going to do then a sweep node. And in this sweep node, we're going to go and select the round tube. So let's actually turn off our primitive display there. In our point display, we can actually turn on our shaded on wire to see this a little better. Let's also reverse the cross section seems looks like it's going the wrong way. Awesome. So instead of actually outputting all the quadrilaterals here, we just want to do the rows. That'll basically give us the cross sections here. Right. And we also want to set the columns to three because I'm going to twist these guys and then re or basically turn them back in the curves using the points from these triangles. And so I'm going to apply some full twists here. And that'll create a really cool looking pattern. And so let's just start with 10 there for now. So at the end of this here, I'm going to go and create a new ad node. And we're going to do a delete geometry with key points. And I'm just going to leave it that way. So we get a spiral kind of like a DNA sequence type thing. Right. Cool. So then at the end of that, all these guys should be set up. So let's turn off our single pass now. So now I've got, you know, all these guys with little spirals. Let's do a sweep node now. And on this sweep node, let's just do actually we need to do in the ad node, we need to turn those back in the curves. Hold on a second, I had myself there. Let's go to polygons by group. And then we want to do the three or value of three or groups of endpoints and skipping every end point. That'll create the spiral curves for us. So yeah, forgot a step there. All right. So then let's go back into the sweep node that we created. And we'll set this guy to the round tube type. You can see we're already getting a really cool rope design that's really fat. And you can play around the resolution of this. I'd keep it kind of low, at least for now. I mean the radius doesn't need to be so high, which also means we need to go back up to our previous sweep node here and just drop down the radius there as well that basically controls the how tightly bound these guys are. And then we can go to our twist down here and just keep upping that. But you're going to notice that you're going to run out of resolution, which means that you have to go and add more to your re-sample node. And that'll get you a little bit more resolution around your rope there. And some of these guys aren't cooperating quite nicely. Have to find a good value there for all these. Let's leave it at point one for now. And let's actually reduce the amount that we have there. So that's in our build post up here. I need to start exposing all those guys to the HDA. And for the twists, I think I found a value of 18 worked well. Let's do 18. Yeah, it seems like it's got everybody there perfectly. Some of these guys are a little bit rough there. So after playing around the settings a little bit, I finally got into a pretty good spot here. It's a little rough for my taste. I would go and maybe re-sample the sides a little bit differently. Maybe we take this re-sample node up here and we do re-sample on the sides differently. Do I not have the sides anymore? Get rid of that group. Let's take a look here. So we have left patch. Are there any point groups I can use? We can probably do something with those starting ends pretty soon. Let's go and then create a group then for our sides. We had it up there at one point. Our side curves, where did they go? Yeah, they're right here. So let's just group these guys and I'll call these sides. Everything's hooked up just fine there now. So now with that group created, I can now re-sample differently on those ones. So let's try this. It's going to re-sample on the sides only. And oops, I had the group selection on there. It's on our point display. So now I should have control just over, yeah, that's what I'm looking for. So I can do that one. And then for this one, we can do an exclamation mark, which stands for not sides. So now I have control over the re-sample for this one as well, individually. Looks like what's what we're going to need for these ropes here. Let's take a look. Yeah, let's see here. So those side ropes really need a lot more, don't they? There we go. Yeah, so you can see it's really starting to form a nice look. We could also twist them separately as well. So let's do that as well. So let's do a sweep node. And I'm going to set this one to not sides. Yep, there you go. And then let's just move this off to side, duplicate it with the alt left click, and then we'll just get rid of that exclamation mark. There we go. And so I think it's just the amount of twisting that we need to reduce on these ones. So let's go to 10. And then let's merge them back together. Always lots of experimentation with this stuff, but you start getting used to the techniques and then just customizing it for, you know, your needs. Yeah, that's what I was looking for. Individual control. Let's actually go down here and just frame all. So yeah, now we have control over the side twist and the top twists. We get really custom looks for both. Let's see if we reduce now the resample. So I don't need as much. Be a lot of geometry. Cool. So we fixed all that. There we go. So now we got something that looks like, you know, pretty cool ropes. We can also on the side ropes there now, since we have separate one, just reduce the radius of this here, make it a little thinner. Do the same. We can do the same thing down here. Here and do sides. So this one's going to be not sides. Let's actually verify that here. See if the group got transferred. Nope. All right. So I'm just going to leave it like that. You can go and, you know, separate all that stuff out and create different groups with that. So at least we have some ropes now. Let's color these guys a little bit. Give them a little bit of like a brown color. Yeah. And let's add it to our assembly. Oh, this is really starting to come together. We're going to have to go and, you know, scale out these planks a little bit. Be cool to get a little bit more variation on that. They're sitting like right on top of the ropes, which isn't totally realistic. That does not look safe to me. It also looks like they're right in the center. Let's go fix that. Oh yeah. I didn't put a match size here. So let's do a match size and set the justify wide to minimum. That way it's sitting on the rope. Yeah. Still, that does not look structurally sound. So we'll do something a little bit different here in a second. But anyways, you know, that's a quick way to make ropes really, really fast. Well, looks pretty cool. It's actually now going to save this. So we're going to just save node type and go back to Unreal and always test just to make sure everything's working. Yeah, there we go. It's starting to look cool. It is taking a bit of time for it to actually generate the, so we're going to probably need a debug display. That is definitely a long quick time. So let's do that really quickly before I close out this chapter. So I'm going to go back and do my video here for my, sorry, my hit file here. And let's do, we're going to have to just duplicate. Actually, let's do a switch here because if I just feed this in here like so, I should just get ropes. And actually I need to move this guy over here and just make a duplicate. So that does all those guys. And this one is going to get rid of the grouping. So we just get tubes, which should be more performant for Houdini engine. And then we'll just, what we'll do is we'll add a switch here so we can switch to the final resolution. You can always go and reduce the amount of geometry too. It was just taking a while for it to cook. Yeah, I think that'll work just fine. For now, let's test that out. So I'm going to go and save my HDA, go back to Unreal, and rebuild all instances. Let's test out the speed now. Yeah, much better. So we'll just expose the toggle there. So when the artists or whoever's using this particular HD is ready to bake it down to a final prop, they can just switch to the final and then cook it from there. So there we go. Pretty cool. So now I got some ropes. Thanks so much. All right. I think it's time now to go and start promoting some parameters up here. We need to make a new folder for the ropes now as well. So let's do, let's call this ropes folder. Let's give it a label of ropes like so. And let's now go and promote some of these parameters here. We might actually be able to speed some stuff up from a cooking standpoint. All right. So I'm going to call this the debug switch. And let's just go and promote this. So this will allow us to switch between our low res and high res. I'm going to call this the debug or ropes. Let's just do an R. We'll call this debug switch. And we'll say use hi like so. And we'll just keep it off by default. And this will be a toggle. Yeah, hit apply. Cool. All right. So a couple of other things we want to do. I want to control the resample rates here. So let's see this guy's 0.08 and this one's 0.03. All right. So we'll do this here. I'm going to do a separator. So for the first one, let's do an alt middle mouse click and the second one, same thing. And then let's just move those guys into there. And so for the first one, we're going to call this the R underscore length rope or actually say length sampling, something like that. So we'll say length sampling. And then for this one, let's just actually copy this here. We'll call this the side sampling. There we go. And yeah, I think these guys are a little bit too much. We'll put this up to like 0.5 for the max and 0.001 for the min. We'll go hit apply. Perfect. That would be nice also to have control over the size of these things as well. So that's all controlled in here. So we'll call this the length size. Let's put in another separator. Let's make sure our ropes folder is also collapsible and hit apply. There we go. All right. So these are the radius or radii for the different ropes here. So let's go and alt click that one. Alt middle mouse click that guy and then alt middle mouse click this one. We'll call this the R length radius. So R length rad and then length radius. And this will be the R side rad side radius like so. And again, put in a nice minimum value so you can't get to zero and then 0.5 for the max. Let's do that because if it was zero, then you wouldn't see anything and it just makes it feel like it's broken. There you go. Hit apply. Cool. You can also control the twisting and stuff like that. I'm going to leave that stuff out for now. And then I think finally we just need the last radius here. Yeah, let's do this one. This will be our final radius. Lots of parameters here so far. So 0.01 and 0.5 for the max. Excellent. We can also promote the color as well. Let's do that. Let's put in a separator here. Make it easier. All right. Let's accept all that stuff there. The one thing I know I definitely need to put up there is the the shape hanging shape. So let's get that up there. So let's go to bridge shape. And in here, let's promote this guy. So then we have this is going to be our global. So we're just going to promote that by doing an alt-minimus click. And then we have two intensities. So we're going to do one that is the lower, so I'm going to call this the G for global, lower hang val. So let's say lower hang value or intensity. There you go. And I'll put the max to something like five. And we'll do 0.1 for minimum. It's got to be something. And then we also have the upper. So if we go into our build posts, this is where we built the other hang shape. And now what I want to do, let's actually do this. I'm going to right click here. Go to parameters. And I'm going to select my global. Oh, I need to apply it first. There you go. All right. So I'm just going to right click this, a copy parameter, and we're going to connect it. I want those shapes to be the same. I just want the intensities to be different. So let's alt-minimus click this second intensity here. And we'll call this the upper hang. So I'm just going to copy these parameter names here and just change out the lower to upper. There we go. And let's get the label as well. And call this upper. And let's do 0.1 for our minimum and five for the max. That's the chair we need it. You never know, though. And apply and accept. So those were two very important ones I wanted to get out there. Excellent. All right. So I think we're good to go. Let's go and actually save this now and go back in Unreal. And I'm going to do a rebuild all instances. There you go. Cool. So now we have quite a few more controls at our disposal. If we go to the Houdini parameters, let's hide the transform. So you see that we actually have this really nice curve now that allows us to control that kind of global shape. But then we have our intensities now where we can also increase the sag for the top and the bottom. So it really allows you to get some really cool shapes there. You know, all procedural. Everything's being UV mapped so far. Actually the planks need to be set up for that. All right. So let's check out our use high. That takes a bit for it to cook. So it's too much geometry. But it is working. It just takes a bit for it to actually cook it. It's looking pretty cool so far. Let's play around with some of these parameters. Might be able to get it to go a little bit faster. So let's just do .08 for our side guys there. Yeah, they all still look pretty good. Let's make the length radius a little bit bigger. Let's do .025. Make it really stand out. And then looks like we need to do another radius in here. So we have a side radius of .005. Yeah, that just kind of straightens it out. So you're going to have to mess around with it. Yeah, I'll include all my updates and stuff like that in the final HDA for you guys. So this one looks like it needs to be like half of the length sampling. Our length radius of .015. It looks better. It'd be also nice to get the little knots, you know, for where these two different rope pieces attach. But I'm going to keep moving forward. So there's that. I'll start exposing more parameters. You know, the process is actually quite boring. And I just don't think that you guys want to watch me promote every single parameter in here unless I get to something that, you know, is really important for you guys to see. I'll put it on the video. But for most of these guys, I'll include the final HDA so you guys actually have access to it. And then you guys can see all the parameters I promoted for everything. So yeah, it's coming up pretty cool so far. All right, let's keep moving forward. Okay, so next thing I want to do here really quick is actually build a better plank that has UVs and also take care of, you know, a random scaling value. I also want to make the ropes there just a little bit bigger. And actually, I forgot, let's go into the build ropes real really quick. I didn't actually, oh no, I did. So yeah, I actually just hooked this up to the length read. So I can control the debug version in the Unreal Engine. So if I go to my parameters here, and I do the length, so let's go to ropes. Now I do the length radius that will fatten up those debug meshes. Yeah, cool. And it also allows you to see your re-sampling, which is nice as well. So do something like that. See what the height looks like. Yeah, that needs a little bit more work for sure. But the technique is the same, it all comes down to dialing and all those values. You know, at the end of the day, you're most likely going to be using this geometry for the final game version. It's just the high res needs to be tweaked a little bit so that you can transfer it. Or you can just take a tiling rope texture and just pipe it down these guys. Anyways, let's take care of the new plank now. So I'm actually going to just push all this stuff off to the side here, make a new sub-network, and we'll call this plank. The reason why I'm doing this is because I want some UVs on it as well. So let's drop down our null node. We'll call this, actually we don't need a null node for this one because we're going to be building geometry in here. So all these, all these guys can just sit off to the side here. So I'm going to start this with a line actually. So let's do this. And this line is going to be set in the extraction, like so. And then I'm going to use a match size node to center it up in the world. There we go. Perfect. And I'm doing that because I'm going to, you know, I want it centered up in the world so I can copy it to the points. Cool. So then I need my grid. So let's make a grid here and let's set it to the XY plane and make the size. Oh, let's just do 101 for now and two and two for the rows and columns. So we have a nice clean grid. So let's take a look. Let's do a poly bubble. I'll give it some a little bit of a bubble on those points. So let's just bevel the points, something like that. And then let's go and hook up the sweep node. This will allow us to then sweep that shape. Yeah, so let's reverse it. Cool. So yeah, our sizes are definitely a little bit off. So what we're going to need to do here is actually go to our original box here. And so the size in X is our bridge width. And that's actually going, I'm going to randomize this here pretty soon. So I'm going to leave that alone. 0.05 is our Y size. So let's go back in here and change our Y size to that. Yeah, there you go. And then our depth that's hooked up to the parameter there. So then let's put that in for the X and that was definitely a little bit too much. That's because it needs one more of those guys. There you go. Cool. So let's make our bubble a lot smaller. Awesome. So with that all set up, we can go to our sweep node now and take care of our UVs. So let's do that. We'll do computer Vs. I don't want to normalize them. So let me save my scene here and show you what's happening here. So I don't want it all snapped like this to the zero to one ratio or zero to one space. I want it the actual size in 3D. So we got a nice clean UV mapping. Beautiful. So now let's take care of the caps doing that same technique that we did for the post. So I'm going to use a poly cap node. Go and we are going to then output the patch group so we can split on that and UV just the patch sides there. And also let's actually invert that. But we can also use a poly extrude node to bump it out a little bit, give it a little bit of an inset. Which will look nice. So let's just go out a little bit and then just a little bit for that inset. Something like that. And then let's do a UV project. There we go. Now let's select the UV project node, hit enter in the scene view there and let's rotate the projection plane in Y so we get our UVs projected perfectly. Cool. So let's merge those two guys together. Put that merge node and pipe that guy in. There we go, set that guy up. And now we have all our UVs and we'll lay these out here in just a little bit. But at least they're there and I don't want to have a bunch of UV layout nodes. I just want to do it at the end. Because it's a performance hog I've noticed. So let's do that. So now I have a new plank geometry which is perfect. And I'm going to actually, yeah let's just cut this off. Hold Y on the keyboard and left click drag. Let's pipe it into our match size node so it's sitting right on the grid there, not in the center. That way when it copies the point it's sitting on top of the ropes. All right, there we go. We are all set up there. And we don't really need this anymore. I'll leave it there just for now. Just in case I want to delete all my work. All right, so the next thing I want to do is you know on a per point basis I want a different size and the width there. And so to do that I need to do a for each point node or loop here and loop over each one of these points because each one of the points is going to have a specific random scale value that we're going to sign here right now. So to do that we're going to do an attribute randomized node and this is going to be Rand width scale like so. I'm going to call this W scale. All right and I'm going to set this to that main width so the minimum size has to be the bridge width that we set. So we're going to say that's our minimum size plus a little bit extra so it's sitting just a bit over the width of the rope so I'm going to say plus 0.1 and then let's do let's actually yeah let's do this let's copy this here and we'll make two float sliders here to control I'll say plus one just to get that randomized but we'll create two float sliders for this so you can control this addition. All right so now if you actually were to go to your geometry spreadsheet here you'll notice that we have a width scale and it's random right so on a per point basis right because in this loop here we're looping through each point we can actually extract the data that's sitting on the point there using a point expression and so to make this easier on myself I'm going to drop down on null node and this null node will just be an easy way for me to finally point that I want to extract data from. All right so with that all set up let's dive back into our plank here and the thing or the node that's controlling the width of our plank here is this line node right and this is cool because as I change this let me actually zoom out here you know the UVs are updating constantly for us right so we're constantly getting our UVs generated for us which is great so I can use this value then to extract that point data and to do that we use a point expression so we say point and the node we want to get the data from is that loop point node so we say dot dot forward slash dot dot forward slash to jump up and out right to get up and out to here so we can get access to this node and then we need to say which point right and then we need to say the name of the attribute so W scale and then we want to say zero for the index and since it's a float value it's just a zero all right cool so now if I were to look at all my planks we have a different scale for them all right so let's set up our type properties for this so in our pink planks not our pinks our planks here let's go and add two float sliders and that's separator just to make this easier for us to see and I'm going to call this my um what was I call this planks I didn't actually do a good job naming those guys so we'll say planks and we'll call this min scale so min scale for the label and then we'll do planks max scale and max scale for the label and we should go and set up some default values so the min scale I'm going to say is point one and our max scale let's say is like point five and then for both of these guys let's set this up so it's like point one to one again you can always change this stuff later on so yeah let's hit that I'm going to save my scene except looks good so now um in our rinse width scale here let's replace these hard coded values with our parameters right so we say ch uh dot dot forward slash dot dot forward slash I believe to get up and out and then we want to do planks um min scale yeah go and then let's just copy this just to make it easier on ourselves and we'll do max scale there we go cool so let's save our scene and let's open up our parameters and mess around with that so yeah in our global now let's hide everything else there now we have control over that min scale and our max scale there uh we probably we could also do like a seed value as well it's probably a good idea to set up so you can kind of randomize it yeah it's already pretty wide but you can see now we can't actually go past our max or our bridge width right so if we go to our global here that goes and then we have our min max scale and that basically allows us to kind of pop it out a little bit more so let's add that seed value in there let's go back in here actually first foremost let's go and back in our type properties and let's just create a seed value so that's in our planks so let's do planks scale seed and we'll call this scale seed and your range can just be zero to one it has quite a bit of an effect so let's say 0.5 hit apply and accept and now in our actually randomized node you can go to the options here this is your global seed so this allows you to pick a different you know seed value so let's hook it up to our properties so do dot dot forward slash dot forward slash and we want planks um scale seed yeah there we go so now we can save our scene save our hda take a look at our parameters here actually don't need to do it there so yeah now we can go and pick different ones from here I like that much better so let's save this and test it out inside open real so just select our hda do rebuild all instances so it imports it then recooks it I do have the uh hyra as I've been messing around with it a little bit more let's go and select this guy here and then switch it back to the debug and let's just make those guys a little bit fatter too much yeah there you go cool so let's play around with our uh scale stuff here so if I pick a different seed value yeah it looks pretty cool kind of like it a little bit more it's a little more cartoony that way you know let's remove a few more yeah look at that that's pretty cool it's starting to get quite full featured though we sell more to do um the next thing I want to work on now is I want to add the little support ropes right so we have I mean obviously structurally you know this bridge wouldn't hold itself up unless these posts are really deep into the ground you know usually they have like some sort of rope you know that's pegged into the ground coming off here that's helping to keep it going so I want to get that in there as well so let's do that so yeah let's go and now take care of these at least the the curve for it and we'll get some rope on there as well since we've already got those networks set up so really all we need to do is the basic idea is to get the two endpoints you know at the ends of these curves here make sure the normals are facing away from each other and then figure out where what the distance is from here so we probably use a couple of the pieces of geometry we've already created so like the post line we'll get that top point and make sure that it has you know the proper normal so we can project a line outwards from it so that is what I'm going to attempt to do here in this particular section so let's dive inside and uh so here we have the the rope curve so I'm going to need basically I'm going to need these top points here so that is coming from there yep and so let's make sure let's see what kind of grouping we have on here so all I want to do is find my point groups so I have so those guys are hosed but we have top points and it's just it got all hosed because of the um resampling right so you can see how we have the uh the groups are about halfway so that's all coming from that resampling there so one thing we can do for this is basically all the information I need right here we have normals but we can actually redo the normal so let's do this I'm going to show you guys a cool little trick here to find the end points without doing a group by range so let's do a wrangle node and let's feed that in here we're going to call this fine nays or fine ends I'm going to use the neighbors functions in this all right now a little idea behind this is if you look at you know the points each point here on the curve so if I look at this point right here how many neighboring points does it have that are connected well it has two right and all the other points basically have two that are in the middle except for the end points end points only have one so that's an easy way for us to identify um the ends on this guy here and so all I need to do is um do an int and we'll call this nays and we can get the neighbor count so we say neighbor count and we want to do zero and apt pt num so the current number point number that we're running over right and so then I'm just going to say if um nays is equal to one that means you're an endpoint so I'm going to say i at group is equal to end or ends that's equal to one there you go so now if I look at my point groups here we have ends that's kind of hard to see so let's actually do a group delete after a while you get a lot of these groups in there so I'm just going to put in a wow card right so it's everything out so you can see now we have our ends group so a really quick way to find the ends when you have lots of geometry the group I arranged wouldn't work in this case without us having to lay down a few more nodes and split you know the two pieces apart so we could find just the ends this uh just a better way to go about it there cool so with that um let's do this I'm going to actually do a blast and we're going to blast away anything that's not the ends there so I'm going to say ends and that leaves us with these two points like so which allows us then to do a polyframe yeah and we can do our flow normals there we go so now we have perfect normals to begin with here all right and all I need to do now is flip one of these guys so if we take a look at our point numbers like so what we want to do actually we we can do a trick here where um we can loop through on a per primitive basis and just point the normals away from each other yeah so let's do that um so I'm going to do attribute wrangle try to do this all with a wrangle node instead of looping so call these away facing normals yep all right so we're going to loop through per primitive uh what I need to do now is I need to say end points so I need to get all the points from the current primitive and to do that we do a prim points so we say a prim points and you can leave one parentheses open there to find out the arguments that this particular function takes so we need the geometry and the prim number which is just the current prim number that we're looping over all right so that's going to be equal to two right so we only have two points here which basically means that um all I need to do is just get uh the first point and the second point in their positions and then do a little bit of vector subtraction to find the uh the away facing normals right and so I'm going to do vector nirm a is equal to point zero and actually what we need to do let's do this first I'm going to do a vector pause a is equal to point and we want to get from the incoming geometry we want to get the position attribute and that's going to be points uh zero so it's pause a and then I want to do a pause b so let's just copy that line and this will be one this works because we only have two points right so let's just make sure that that doesn't throw any errors yeah we're good so then uh normal a I believe is pause a minus pause b and vector nirm b is equal to pause b minus pause a there we go let's put a little space in here just for being neat and then we could just uh set so basically you need to set the normals now right so uh we do this by doing set point attribute because remember we're running over primitives so we don't have access to the points this how we set attributes on points in the primitive context so I'm going to set a point um actually I'll pick the wrong one so set point attribute set point atrip there you go so zero I want to set the n or normal uh we're going to set it on point zero and we're going to do norm a and set to make sure that it sets and I didn't like that for the point number oh it's because it's the wrong name yep that's working we also need to normalize it but let's finish our code here really quick and I'm going to go and say norm b and point one right there you go so now we're facing away from each other let's just normalize this right here so we have unit vectors there we go sweet all right so now we have our way facing um normals which is perfect so let's let's do this I am going to build a different subnet for this so I'm going to do another output and we could probably put it over now this will be fine right here go yep output two is fine so with that we'll just move this over here let's do another subnet and we'll feed that in and I'm going to do what should we call these build um tie downs I don't know support ropes is it like that so anyways I'll let you guys pick a cool name all right I'm just going to call them tie downs awesome so let's go and make sure let's just template all this so we can get an idea of what else I need to do so the other piece of information that I need here is the height of just the total y size of our our post curves our post lengths and to do that we can actually build up a a detail attribute that just goes along with the geometry here so let's do that really quickly where did I split the guys here so post lines right here so yeah what we can do right here let's drop down another attribute wrangle node and I'm going to call this the post line height let's run over detail because we're going to add a new detail attribute this is going to be a float value and we're going to say f at post height see underscore post height and we're going to do the um we're going to get bb box size of the incoming geometry and the y size there you go so now for you to look at our detail attributes here you can see that we have a value of 0.8 all right and you you'll notice that if we come all the way down here the detail attributes still moving along with the geometry right still being pushed down this whole stream here and you can see that it's still available and now that particular detail attribute is on the the curve yep so we can use that information to um create a line that looks like it's being tied into the ground so let's do that so let's drop down a null node here now i'm going to call this geo in and um we don't really need the geometry anymore we just really need those points there so i'm just going to delete the geometry but keep the points and i'm going to create a line now and this line's got a point in the z direction for this to work right uh it's because the direction that the normal's pointing is going to be is the z direction so when i copy this so i do a copy to points now select these two guys and feed it in there like so you can see how now they're being copied in their normal directions which is great so now we have control over that length for the line so now what we need to do is we need to move the end points down that detail attribute amount right so this amount right here that's going along with the geometry so let's create a group and this group's going to be the end point so we'll call it end point and we need to set our group type to points and it's just it's going to be one because the line just has zero and one and that endpoint is one so we group just that guy so now for each one of these guys if i go to my group an attribute list here you can see let's actually do another group delete to clean things up so it's easier to see let's put in the wildcard there you go so now you can see we have the end points awesome so now what we need to do really is uh drop down another attribute wrangle node this time we're going to run over points we're only going to run over that endpoint group and let's get the data we can actually get it from this guy because it's still on this yeah so let's just put the data in there one thing i do like to do in this scenario is to use a little knot so if you hold down alt and then click you create a little knot there so then we'll pass height pass post height and we'll just negate it so because we're already at the the highest point right that's where we copied to so i need to do is say at p dot y uh minus equals uh detail so the incoming geometry from input one there right so this is zero one and we want that uh post height yeah post height so the name of the attribute is post height and just zero for the first index there you go so now we've got the curves for it now we might want to make that a little more intense so we're gonna you know do some addition so we'll say plus some sort of intensity value i might want to sink it into the ground a little bit more just to be you know kind of gamey about it yeah so now we have a little bit more beautiful and we also have control over how far out that goes right yeah so let's just do a quick sweep on this and test this out and i'm going to also create some UVs for it so i don't want to normalize and i don't want to snap let's save our scene now let's change the surface shape to our round tube and then let's hook up so we don't need all those columns there we've got six and then we're we're gonna do ch dot dot forward slash dot dot forward slash and i want the um rope length rad yeah there you go so it's the same length or same width as the the ropes um and the length wise not the side ropes cool yeah i think that's gonna work and we have UVs too yep beautiful let's uh just output that and add it on and test it out in unreal yeah look at that it's a nice extra little touch there so yeah we got a template mode here and let's just make sure that we actually put that into the assemble node sorry i was just getting lost and looking at it uh we also need the color too you know one thing we could do let's just merge these two together since i want the rope colors to be the same so let's just do this i don't need the tie downs let's uh then go grab the color node out of here and uh so i'm using the u and i key to quickly fly in and out of the nodes there much much more handy and that looks like it set it all to wow it's because these guys are all off now they just need one of those dot dot forward slash is removed because we moved it up a level yeah there you go excellent and i do like to even these guys out just make it feel organized anyways yeah so there we go that's how we build those kind of tie downs i wish i actually knew the official name from they might not even have an official name you never know so let's go and rebuild our our instance there we go look at that let's uh test this out here so let's actually select it and let's uh move this around in the scene yeah looks like it's working pretty nice let's one thing i always test with these kind of setups is kind of you know really flip it make sure everything's rotating appropriately so i just flipped the two handles yeah everything's looking good so let's move this guy over here excellent yeah this actually kind of turned out cool not that i ever had any doubt all right cool so i'm gonna end this section there not really sure what i'm gonna do next i'm gonna think about it here for a second i think i want to add a couple more things on here it'd be nice to texture this up too but uh so far that's actually looking pretty cool let's turn on the high res we do need to work on that a little bit more but still it's looking pretty sweet we do need to make a rope a high res rope for that for our tie downs that's working out it'd be nice to do little knots too you know for these guys maybe that's what we'll do next all right let's move on okay so i'm gonna do a couple things in this section i want to give some color to the posts over here they're looking a little bland right now and also we want to do the knots so let's do the knots first here so i'm gonna jump into the build ropes node here and i'm gonna drop down a blast node because what i want to do is just get those side curves that we have so i'm going to go and get the sides in this case uh you can do the knot sides or you can just use the delete non-selected so i'm just gonna leave it like that so uh let's do some flow normals for these guys actually do they already have them no yeah so let's do the flow normals for these guys now beautiful because i want the you know the knots to be in line with the actual rope for the sides there so that'll work next thing i need is a circle this will form as the base kind of path for the circle and the base radius also and so i'm going to uh copy this to the points each one of those points there all right and we also need to make this on the zx plane so it's following those guys there and it looks like actually we are getting a little bit of oddness and that's most likely because we have some extra attributes so let's take it from here yeah there you go that's what i'm looking for so i just want to get rid of those old right values and stuff like that they look a little off let's just keep moving forward and see how it looks in the end there now we're going to make this pretty tiny you know because these are just kind of knots that loop around the rope make it look like it's holding on a little bit better all right so with that let's make sure we turn on polygons for those guys that's looking good so far and then um let's do a loop so let's do it for each primitive here so we can loop through each one of those guys and perform the knot the torus knot now i'm not going to do any backs for this you can actually do it quite quickly with um uh sweep node and the add node or resample node so i'm going to do the sweep node and we're going to do our round tube with the three sections cross sections so round two three cross sections let's make it a little bit smaller here and let's just output the um the rows right and then let's do some twists let's do this we'll do some full twists here just like three we don't need a ton there all right and then we're going to do the add node so we turn them back into curves and delete the geometry keep the points and we'll do skip every end point put it to three that way we get um the beginnings of our torus knot at least i'm also going to make this closed that way we get these curves that are basically you know inter interweaving with each other like so we can also add a couple more um actually need them down here oh i need to actually put this down there you go now we'll get better resolution so i had to turn this on because if you have a plug or if you have the display flag on this guy the cache isn't updating so you need to put the display flag so this guy cooks cool so now you can see that we have kind of this torus knot thing going on and then i'm going to resample this so let's resample and let's do maximum segments that way of control over the resolution of these guys and i'm going to output the normal so the flow normal using the resample this time so there you go cool so yeah now we have a pretty cool torus knot let's do a subdivision curve as well just make a little smoother and then we'll just do a sweep and we will do round two let's go back to our shaded view and drop down this resolution or the radius there probably don't need as many loops there there we go so now we got a torus knot we can control a bunch of things it's actually just get it merged in i'm actually going to merge it in so we always have these guys i think they'll look pretty cool yeah and then let's hook it up so that we have the same well let's also turn off the single pass there we go so now we're getting there getting closer let's go get the length rad channel and put that into i believe this guy so let's do that and we'll do times something like 1.5 yeah there you go so it's just a little bit bigger and that controls that this controls the radius of each individual strand and then we have our twist i don't think i need as many twists let's just do two that looks better and then maybe make it a little bit fatter here yeah that's all you really need let's take a look down here yeah that looks fine yeah very cool all right so i'm actually going to call that good i think that is going to work out just fine uh i'll probably let's let's mix up the normals as well down here i'm doing it kind of globally so you know for the playing some post that's fine having the hard edges i think for the ropes i'm gonna make it soft so let's do this just 180 there we go those look better in unreal yeah it looks pretty cool i know it's not like super realistic or anything but it does the job you know honestly if you're running through a game and you're the players just running through this they're not going to sit there and be like oh my god you know it's not connected properly some people might i don't know anyways um all right so let's take care of the colors on the post then so i'm going to go to my build posts here and we have plenty of room here to take care of this of course you know a better thing to do is just to do it on the post itself and the reason why is because you know it's all centered up in the world and we can build a gradient pretty easily and again i'm not going to use the labs nodes because i don't like to include them in my hdas when i'm using houdini engine it's just a little risky to do that in terms of versions and you have to leave them unlocked all that stuff so let's let's go and drag or create a wrangle note and this is going to be my my ramp value so i'm going to do ramp here and we can actually do a color ramp inside of these guys so let's put it on the points and what we need to do is build a ramp that basically goes from zero to one based off the height of the the post here so to do that we need to first get the size so i'm going to call this the um size this is going to be a get uh size like so and we want to feed in the first input there all right so now we have the y size and uh basically we need to just fit we also are going to need our box min and box max for this so let's do a vector uh box min and box max we'll do get a bb box uh just get bb box really so it gets all of them all at once and then you feed in box min and box max like so i'm sorry i'm doing this on the wrong line here i got ahead of myself there we go there you go so but basically what happens if you actually look at the documentation here for this uh it it basically is like a ref if in the c sharp it outputs the value into the variable that you're feeding in and that's what the little and symbol means for that stuff all right cool so now we have the minimum and the maximum and uh all we need to really do now is say at cd is equal to fit um at p dot y there you go dot y and we want to fit it between box min dot y and box box max dot y and then fit it to zero to one like so there you go so now we have a gradient and let's actually excuse me there um let's actually put that into a variable called ramp so we can actually create a fitting ramp here so basically i'm going to then say at cd is equal to ch ramp we'll call this gradient and we'll feed in the ramp value there and then let's create the float parameter and this allows us to kind of basically remap the ramp there of course we don't have a lot of polygons on this right if i were to go to wireframe view we don't have any polygons and since we're working with vertex colors we need to add some more points here yeah that'll be that's fine so i just did five points there so now we can you know really adjust where that ramp starts cool so then um yeah we can you can use that value in a color node so you could always just put this into something like f at ramp or actually let's call gradient like so and then we pump that into a color node then we can affect the colors so we say point and we want to do ramp from attribute and we do gradient so we get the same thing right um and actually that means you know honestly we don't really we could always we don't really need to create a ramp here so it's actually i'm going to show you how to get rid of your uh spare parameters let's do this let's get rid of that guy and uh but now you notice that we have this spare parameter that we created so all you need to do is just come up here and say uh delete all spare parameters and that clears it out all right so now we have you know this ramp down here but we can actually colorize it so i'm going to make this a little bit like green i think and this one's going to be the wood color so do something like that and uh maybe the green is a little too much there get up more and like a wood color be a little darker too yeah let's make this a little bit lighter so it really pops awesome now we got some color there and let's actually move our output down and let's move the display flag down there yeah very cool and it looks like i hose something because the roughs are really really low now it's funny let's see what i did that was weird let's go and take a look on a copy of points let's see where that um error actually starts to happen so there's our points oh i see that's what it was because i added more points to the line right so quick way to actually fix that it's good that that happened it happens me all the time i forget about stuff so quick way to get rid of all this here even before the carve here um let's just do a facet node this allows you then to remove inline points and uh yeah so that now we only have two points there it's kind of hard to see yeah there we go so now we should be back in business let's set our display flags back and take a look at looks like i fixed it very nice yeah so i just wanted to colorize those and add the the tors nuts up there makes it look a little cooler a little more detailed let's um now go and save this here and go back to unreal and we'll do a rebuild all instances and this this does happen every once in a while with v2 we get this gls running i don't know and so it's gonna crash me and we're back all right so um let's go and test all this stuff out now everything's looking pretty good here just grab this guy and move this over here yeah it's still pretty speedy even with those knots still on it's pretty cool it's coming along quite nicely i am digging it all right let's take a look here yeah i think everything's doing pretty good of the little knots there really add some detail so all right so i think the last thing i'm gonna do in this video um is just to organize the v's a little bit better and then i'll probably make some textures just with a quick submix or nothing crazy and i'll probably show that in a later video a follow-up video all right let's move on to the next step all right so i'm going to do the uv layout set the right end here um just take note that if you add a lot of uv layout nodes you know in individual subnets here would actually be a drain on performance in your hd os go a lot slower the uv layout node is really heavy on performance it really does take up quite a bit so i try to save it for the end sometimes i even add a switch to toggle it on and off so when you are ready to bake it out at least you can toggle it on and have you all your uv's laid out so the first thing that we need to do here is i need to set up a grid this is basically going to serve as my uv layout because i'm going to be using a trim sheet for this that i make in quistle mixer and so i need to kind of divide this up based on how i want to split everything up and so you can do this like as a manual process you don't have to make the salt procedural it's just really there to let you organize your uv's appropriately so all right so let's take care of this here um let's take a look at the clip plane i want to point this in the z direction so we get this guy split in half now i'm just going to keep all primitives here and turn on my wireframe on shader by doing shift w and i think i'm going to move this up a little bit and then i'm just going to duplicate it and then i'm going to move this down so i'm basically um you know creating the areas of my trim sheet where i'm going to have different woods and a rope texture and then i need something for the the caps on the wood planks and all the posts so they're all those are all the different textures i'm going to need cool so i split that guy up so these are going to be different woods for here so i'm going to do a wood for the post and a wood for the planks and then i'm going to put my end caps here and the rope texture over here though we're actually going to need the rope texture to um tile so that means we can actually make another one of these here and i'm just going to pull this guy all the way up here we'll put the rope up there let me actually just move these guys make it a little bit more even yeah let's do this those end caps don't need to take up that much texture space they're pretty small anyways yeah looks good all right so let's take a look at our prim numbers now so what i'm going to do is blast away prim 2 and then let's put a 2 here and i'll say delete non-selected actually let's do a split sorry about that so let's do a split because i do want to keep the other pieces i just want process prim 2 a bit differently so let's split on 2 there we go and then let's copy one of these quick planes here and i hit enter to show the gizmo so this one let's actually center it all back up and everything this one needs to be on the x direction like so and uh yeah well i'll probably just put the caps over here like a little you know the you can see the the rings and the wood basically for the end caps and that means we'll have an open space or something over here all right so with that let's marriage all this stuff together yeah cool so now we got all of our individual shells created all right one thing we're gonna have to do currently you'll notice that the clip node if i were to turn on my point display here it doesn't actually separate the geometry right and in order for this particular technique to work we need to actually separate this geometry out here now this piece did but there there's a better way to do this and also we need to generate some UVs here so we need to do a UV project and we'll just feed that right in there we just need to put in 90 for this guy so yeah so i've generated UVs and so what we want to do now is we want to associate certain UVs with a certain ID here notice that we have these primitive IDs we can actually clean these up a little bit better as well by doing a sort node down here so if we do a sort uh let's just sort by the z direction so we have zero one two three four yeah so now it's a little bit more in order there and so we're going to use these pretty good IDs here to send different UV shells to different islands right think of these guys as little target islands that we want to send things into so we're going to do a bit of work here so i'm actually going to bundle all this up into a subnet and we're going to call this our UV layout let's feed in the geometry all right we'll kind of walk through this the first time you do this it can be a little confusing but once you do it once you get it it's pretty easy after that all right so we got our sort node and we have UVs set up for this right um i might actually i'm well i could leave it like that we'll put the rope down here i was going to drop down a UV transform node and flip it so negative one negative one and y we'll flip it yeah then we'd have to recenter it doesn't actually matter that much you could change the pivot and everything but this will be fine so i'll just remember the texture needs to be this way all right uh you could also flip the geometry so let's take care of this so um what i'm going to do is create a new for each uh primitive here this will separate out each primitive and then merge it back together but the UV shells will be separated out which the UV layout node once and also to make this work we need to assign an ID now i just want to use the primitive numbers for the IDs for these target islands here so i'm going to go and create this meta node i'm going to call this loop data like so and drop down a wrangle node here and i'll wire the loop data into the second one because this has the um iteration attribute on it that i want to use all right so we'll say set island id like so and i'll set this this needs to be a primitive attribute and i'm going to call it i at target is equal to uh detail and we're going to get the input from one we're going to get iteration like so sorry iteration there we go um it's been a long day there we go cool so now on each one of these guys on the primitives we have a target and it just so happens that it's the same number as their primitive number you could also i've just used the primitive but i just decided to do it this way all right uh let's get the incoming geometry so that'll be this input one right here and let's put down our null node we'll say geo in and then we will focus on just one part so we'll do i think the planks first and then we need a uv layout node and we're going to hook up our incoming geometry and our uv layout right so this is basically um how i want my uvs to be laid out what goes in each of these islands we have haven't actually set yet but we set the ids for the target all right so we have our geometry so how do we do this so let's start with the planks first and um let's go up a level here so let's say let's actually go back in there sorry guys um let's say i want my planks to be in island one all right so all we need to do is go up to our planks over here nope make sure we have uvs first off just make sure we check all this stuff very good and all we need to do is drop down a wrangle node you can also do this with an attribute create node but we're going to say sets island id you know this has to be a primitive and we're going to say i at target is equal to one that's all we need to do all right so if we were now to come back in here let's take a look at this node here what i want is all those plank pieces to go into island one so in order to do this we need to go into the uv layout node rather than packing into rectangles here which actually is working out pretty well but i want a little bit more control yeah and so um i just set it to islands from second input uv attribute is what we want but we want to go up to this target assignment and we want to set the target attribute to target like so and now um well it looks like all the jumps so we need to go and set all that stuff up on each one of them because basically what's happening is we have a bunch of attributes on there and some of these guys yeah so target yeah so the target got wiped out here so that means that during that merge right up here all those guys got screwed over i don't see a one anywhere yeah all right so the posts they're going to go into let's go back in here and take a look turn on our primnums they're going to go into two so we can just set that up appropriately here set this to you can already see they're starting to move around so all these guys moved so the planks moved to one which is good right now all of these guys all the posts moved to the second uv shell so hopefully you guys can see all this happening while i'm doing this so then the ropes all need to be in what was the id for it let's check that again here zero all right looks like we have uvs for all that stuff so let's set the uv shell or island target so it's gonna be zero let's take a look always make sure to save while you're doing this as well and those guys didn't seem to want to go let's go into yeah they but it looks like they went up there let's make sure we have uvs on everything so we got this guy what is this one oh that's right i didn't make the uvs for these ones and we don't want to do normalized and we don't want to snap just want to leave it that way these guys are not even set up either jeez i do want length weighted but not normalized there we go and let's do this one okay so all those guys should have uvs now which is good the tie down just check it out looks like i did those guys too all right so we set the island id yeah there we go so yeah now they're all being placed down there which is great so almost there i'm all the caps then so this is where we're gonna have to get a little bit fancy because all those but those are all bunch of different pieces up there we're getting there though so all the caps went over here i want all these caps to go into a different one let's go back into the uv layout node and set a few other things here i'm going to do by island position in 3d and we'll scale to match their positions actually it's due yeah by island symmetry that'll work just fine now we can do 90 degree rotations well there we go let's do 180 degree rotations that'll be fine what are all these guys up here you can always find out if we just select the points and then go to uh it's all these guys all right so i finally got it sorted out um and so i'm i'm just going to walk you through what i did and um this is a very slow operation so we're going to have to put in a switch node for it but it does get all your uv's laid out for you um so i'm just going to put a output node here so um on the uv layout node we need to turn on our island attributes and the reason why i was getting all those rope pieces up here um was because it just ran out of space and it was because it was trying to spread all that stuff out and some of these you know rope uv's are really long so i need to stack them on top of each other but i just want to stack just the rope pieces on on top of each other and not you know all these other pieces and so you can see now here i have my shells i'm getting you know my caps where the caps need to go i'm getting the the posts for the post wood and the planks for the plank wood and then the ropes for where the ropes going to go on the trim sheet and so all i need to do now and i'll probably do this off camera but you'll be able to see it in the hda it's just randomized and scale the uv shell is a little bit differently after the uv layout operation but in order to set this up what i did let me jump up and show you guys so on on the ropes i set the target to zero and the island to zero and that basically will send them to this particular shell down here plus it'll stack them on top of each other it treats it as one island basically and then i have these two um wrangles here so for the first one i just set all the uh the posts to two and if you still want to spread all the shells out use a negative one for the island attribute and then what i did is i grouped all the patches right so those are all the let's go up one if i were to look at all my patches here uh those are all those patch pieces right so i want to have a different texture on those guys and so um that's what i did so i just on the patch group i just sent them to target a three and an island of one and uh did the same thing here and then i sent all the planks to target one and set those guys to a negative one so they laid out appropriately and that gets me all these guys laid out into the shells appropriately now it's really slow so you know we need to drop down that switch node so when we're ready to bake you know we turn it all on basically you can also accomplish that uh with some uv transforms it's a little bit more work but it probably speeds up speed it up a little bit i'll uh test it out for you guys and see what happens but that's how you do with the uv layout node and just one uv layout node using a predetermined layout all right so just wanted to show that there um so we should probably expose that stuff here let me actually go up here and make a uv folder call this uv and make it collapsible and um i'll just promote so let's just promote this switch here so i'll just do a alt little mouse click and we'll say layout uvs and layout uvs and we'll make it a toggle oops let's do a toggle and default is off cool so that should work just fine for us let's save this guy and that pretty much does it uh for this particular video got really long so i hope you guys weren't too bored there's lots of cool stuff in there we made a nice cool little bridge for Houdini engine version 2 so thanks so much