To create evenly spaced concentric rings in Houdini, use the copy number attribute (primnum) in a wrangle node to calculate scale values, multiplying position by (1 + primnum) to ensure the first ring remains at the center while subsequent rings scale linearly outward, avoiding the relative scaling issue where each copy accumulates based on previous scaling.
Deep Dive
Prerequisite Knowledge
- No data available.
Where to go next
- No data available.
Deep Dive
Quick Tip: Linearly Scale Copies (Even Spacing) H21
Added:Hello everyone. I'm back and recording tutorials again. And to get myself back in the swing of things and to keep things simple, I'm going to start off with a tutorial to just show you how to create some concentric rings, scaling up your copies linearly, which isn't as straightforward as you would think.
So without further ado, let's dive in.
Okay. So in the scene right now I've got an example geometry and then I also have like an empty geometry just to create the setup in again. And I'll hide this one and we can start from scratch rebuilding that.
I'll dive inside. And the first thing I'm going to do is create a circle.
And I'll hit uh space G to center by viewport on the circle. And I'll give it some more subdivisions.
I'll drop down a poly path.
And I'm using the poly path just to convert it to a line. And I'll make sure the ends are closed.
You don't need if you're going to sweep it. You don't need to do that, but I figure it's easier to view for the tutorial.
Now, I'll create a copy and transform.
We'll type in copy and get copy and transform.
Drop that down. Set my display flag to that. And I'll create 20 copies.
So now if you scale this up with uniform scaling, you're not getting that linear scaling effect. getting each time it scales the distance between the lines gets bigger which isn't what we want to create that um that look because this is this is being scaled relatively. So each time it's scaling it's accumulating based on the previous scaling that's happened and that's not what we want. We want linear scaling.
Now, one of your first thoughts might be, what if we drop down a for loop instead and try and scale it that way?
Get a transform.
Yeah, transform.
And I'm creating 10 copies with the for loop. If I set it to merge iterations and I scale that up, and we end up with the same problem.
So, how do we fix this? I'll get rid of the loop. I'll go back to the copy and I'll set the scale back to one. So, a copy isn't doing anything. It's just taking our one circle and you can see one primitive and turning it into 20 circles.
Um, now what I want to do on this is turn on this copy num attribute and handle my scaling afterwards.
So I'll get a wrangle and plug in the wrangle and I'll create a float attribute called scale and I'll say scale is equal to prim z and I'll get that value copy num or attribute I mean and I'll get that at the primum.
And because each of these points only has one primitive associated with it, you can do this. You can just get the primum as an attribute and it's going to get the correct value from the primitive. So it's a nice little trick.
You don't have to promote values if it's only a single primitive that is associated with a point.
And then I'll take the position and multiply that by that scale.
And you can immediately see we're getting something a bit more like we would expect.
And the reason for that now is now we're scaling it linearly based on this copy num attribute in the geometry spreadsheet.
Now, we want to add some controls to this. And there's a couple of things to watch out for. So, if I just display the points, you'll see we're getting we're now getting a ring that's that's at zero. And that's got a bunch of points stacked on top of each other because the first copy number attribute is zero. It's scaling the position by zero. So, it's shrinking our first ring to zero, which we don't want.
So, we've we've got two options to go with from there.
We can we can either add one to this.
Now, what we should get is our first one in the center.
And we don't have that zero point anymore.
And we can put this whole section in brackets and multiply that by a constant. So I'll create a a uh parameter say channel F brackets and let's call this scale and I'll create that parameter and let's scale this up.
Now you can see what's happening. It's everything is scaling.
Everything is scaling linearly like we want, but it's also shrinking the whole thing. So, our first ring isn't isn't uh respecting the initial value.
Now, maybe we want that. Maybe we're not too bothered by that. Let's show you. Go above one. Still works, but the whole thing is getting bigger and smaller.
The the other way we can do that is if I just copy this wrangle and instead of adding the plus one there, change these this expression and say 1 + primitive num and then I put all this in brackets. So primitive number times the scaling.
Now, our initial ring stays constant and everything else scales linearly.
So, that just depends on what you're trying to create with your linearly scaled rings.
And after that, I'll drop down a sweep node.
This is the easy part.
Plug in a sweep.
And we can just scale this up until they touch.
how we've got concentric rings with a hole in the middle.
Maybe I don't want that. I can switch it to this one.
And then you'd have to find the right values. So I think if I scale this by one and I scale this to 1.5 cuz it's a radius, you get something like this.
Let's see what it looks like for this one. 5 and one.
Yeah, you get you get that. And if you want to close a hole, you need to guess you need to scale this up bigger and make everything thicker.
These are all going to be relative to whatever your initial uh circle is.
Okay, so that's working. Turn on wireframe.
probably want a bit more detail on that as well. I'll just bump this up. And can zoom out a bit. And now we have these really nice concentric rings.
And if you want to color it, you can use that same copy num attribute to color the points.
So the sweep will bring across that primitive attrib. So we still have copy num. So if I middle click, uh, we can visualize that. There's our copy num.
And you can use that to drive colors.
I'll just do something quick and lazy to show that. And we'll get attribute color.
So attribute adjust color.
Plug that in. Oh, and I think I need to promote that value. So I'll get attribute remote.
and the add promot also for promotive to points.
And then you got a couple of options there. Remap attribute. It won't pick up the attribute on drop down by default because it's an integer.
So that copy num. You can see it's kind of working scaling between zero and one.
So, let's bump that up to 0 and 10.
You can see it's giving us that result.
And then you can cycle it so it keeps going.
And there we go. Now, we've got concentric colors. I'm calling this one quick and lazy for the colors because you can see it's not completely evaluating correctly. Like, you'd have to do this a bit more nicely cuz it's it's missing it's missing red. So, this isn't properly scaling in a normalized way.
Should be fairly easy to fix, but that's not what this tutorial is about.
And I'll leave this one there. I hope you found this useful. Thank you for watching. It's good to be back and recording again. Please like and subscribe if you like it. And if you like to see more simple procedural modeling tips or any more simple Houdini tips, leave leave it in the comments so I know you like it. And yeah, thank you for watching. Goodbye.
Related Videos

TOP 15 Data compression Interview Questions and Answers 2019 Part-2 | Data compression | Wisdom jobs
wisdomjobs
281 views•2019-06-28

CTS 158: 802.11w Management Frame Protection
ClearToSend
4K views•2019-02-04

NDSS 2019 Send Hardest Problems My Way: Probabilistic Path Prioritization for Hybrid Fuzzing
NDSSSymposium
496 views•2019-04-02

How realistic is Cities: Skylines?
CityBeautiful
159K views•2019-02-14

GUIs & TUIs: Choosing a User Interface for Your Python Project | Real Python Podcast
realpython
2K views•2025-04-04

The OSI Model - Explained by Example
hnasr
225K views•2019-05-12

Cloud Computing - Introduction
elithecomputerguy
98K views•2019-10-07

From Traveler's Dilemma to Dynamic Routing | Demystifying Networking
IITBombayJuly
5K views•2019-08-04
Trending

WOW! Judge TURNS THE TABLES on Trump in His OWN $10B LAWSUIT!!!
MeidasTouch
197K views•2026-07-23

Playstation NO DISC/NO BUY Fight Is Over...
DavidJaffeGames
4K views•2026-07-23

Steam and Xbox Just Dropped The Hammer On PlayStation
OhNoItsAlexx
9K views•2026-07-23

Americans Confused in Australia for 17 Minutes Straight
IWrocker
17K views•2026-07-23