Join Steve Wright for an in-depth discussion in this video 059 Image array, part of NUKE NUGGETS Weekly.
- [Steve] Hi, this is Steve Wright, welcoming you to this week's Nuke Nugget, how to make an array of images. You can build up a complex array of images using the TimeEcho and FrameHold nodes. Let me show you how. So here's what we want to do. I got a 100 by 100 image, this beach ball guy over here. And I want to make a six by 10 array. So, I'm going to need a 600 by 1,000 size background plate. So we'll start with a Constant node, and then hit it with a Reformat node, to make it 600 by 1,000.
So that gives me my background plate. Now, I caught the ball over that plate, and I'm going to get just one little lonely beach ball down here in the corner. So, let's use some temporal tricks to fill this up with a bunch of beach balls. We'll start here by creating a row using the Position node. Now, this Position node is animated, so on frame one, zero, I chose a 100 by 100 image 'cause it made the math come out so simple.
So if I step to frame two, you see I've moved it over to 100. I have 200, 300, 400, 500, and 600. 500, that's my last one there. Okay, so the point is this. I use the Position node because it does integer placements. The Transform node might return a floating point number, which would then filter the pixels, and I don't want to do that, I want to keep my pixels pristine. So, I'm using the Position node, and when we hook that guy in, I'm getting this action here.
And now, as I scrub the timeline, you can see. Now, again, you would never use the Position node to animate a moving plate, because it's only an integer-based guy. But in this case, that's exactly what we want. So, I need to fill out this entire row, so we'll use the TimeEcho node, set for six frames, which is my entire row. So if we hook that up, now if I step through my timeline, I'm building up my beach balls.
If I go past it, I'm losing 'em at the back end. That's because the TimeEcho is only looking at the last six frames, okay. So if I'm on frame eight, it's not looking at frames one and two. All right, so, what we want to do now is we'd like to freeze this on frame six. That's what this FrameHold is. Hold frame six. So now, I'll move the playhead down here.
If I hook up to there, boom, I have a whole row. And it doesn't matter where the playhead is, because that FrameHold node is locking my time. Okay, now, we need to get some rows going up. We'll do that here with the Position node. Again, same drill. On frame one, I'm animating it in y now, so as I step through my frames, you see I'm moving it up 100 lines every time, okay.
Same concept, only now, we're doing vertical. So, if we hook our comp up to that, we're now moving the entire row up and down. And now, to freeze them, we'll use another TimeEcho. And now, this is set for 10, because vertically, I'm doing 10. So if I hook my viewer up to the TimeEcho, and I step through the timeline, I can build it up to a total of 10.
However, if the playhead moves, I'm going to lose my beach balls, so. One more time, we have a FrameHold, this one is set for 10, okay. All right, now, no matter where I move the playhead, I have a lovely array of images. Now, some of you might be thinking, well, why not just use the Tile node? Well, let's take a look. So here's the Tile node. And we'll start back with our beach ball. Now, the nature of the Tile node is that it will tile whatever image you have and put the tiles in the same sized image.
So if I made a six by 10, it's going to be 100 by 100 pixels. That's not very good. So here's a Tile node. I said I want 10 rows, six columns. And that's what I got. Plus, it squeezed them, okay. But this is teeny tiny. So, well, let's try resizing it with a Reformat node. Let's say I'm telling it now to stretch this up to 600 by 1,000. And maybe Nuke's transformation concatenation, remember that, maybe Nuke's concatenation will protect me.
So let's see what happens if we look here. (gasps) Ew, no. So here's my six by 10, 600 by 1,000, but. Boy, that is not nice, okay, that we would compare it to the original. Ew. Much worse, much worse. Okay, so, what are we going to do? Turns out we can trick the Tile node. Again, we are counting on transformation concatenation. Starting with our beach ball, first, we do a Reformat to our final size, 600 by 1,000.
Also, the resize type is Distort. And then, the filter is Impulse, this is important. If we use any kind of a default filter, like Cubic or Mitchell, we are going to get filtering which will soften the pixels. So, we want to reformat this. This looks silly, I know, this looks goofy, this can't work, but it will. Watch when I finish. So I now have one beach ball that is 600 by 1,000, and remember the rule of the tile is, it tiles it inside whatever size you give it.
So I have pre-sized this. Next, the Tile node, I'm telling it to do my 10 by six, which will then un-distort it, but, very importantly, filter Impulse again. Boom, there it is. And it compares quite nicely to the one I made with the temporal technique. In fact, they are actually identical. So if I toggle back and forth, and let me scoot over here so you can see that I'm not lying to you, I'm toggling between the one I made with the temporal techniques and the one I made with the tricky tile techniques, and they are identical.
Remember, if you fail to set Impulse filters either in the Reformat node, oops, we got the blurries, put that back, or in the Tile node, oops, we got the blurries again, put that back. So, it is essential that you use that Impulse filter for this gag to work. So, why would you want to do all of the temporal stuff if the tricky tile technique works? Well, you can get more control, check this out.
Again, I'm using the same temporal techniques. The difference is, here, I've used a Transform node instead of the Position node, 'cause I want to do something tricky like this. Ha, try that with your Tile node. What we have here is, in the Transform node, I've made two simple differences. The y value is the same as before. If I hook my viewer up to here, jump my playhead back to one, watch my y values, okay.
They behave exactly as before. So as I step through the timeline, you see the y values are moving by units of 100 as before. But I've added a translate curve, so that when I get to frame 10, jump to key frame, the top has translated over 159 pixels, and that's what gets me this right here. So I'm pushing this line over a little bit every frame.
Now, the size gag, that comes from a scale. So, once again, we'll look at that. We'll go to the Curve Editor, well, I don't need to go to the Curve Editor. Again, on frame one, it's a scale of one. And then I step to the timeline, and by frame 10, I've scaled it to 0.4. So that animates their size over the length of the gag. But we can play lots of neat games with this. So, for example, we'll go to the Curve Editor.
I'll take my translate y curve, which is what moves it vertically. Now, you'll see that I'm scanning it down smaller and smaller, so the distance between each row is constant, but since the beach balls get smaller, the space gets a little larger. So we can have some fun here. I'll put a key frame, this is the translate y curve now, this is what moves it up. And if I do this, I can redistribute the position of my rows, isn't that fun? Okay. So there you have it.
Building an image array using temporal techniques. Again, if you only need a simple array, then use the Tile node tricks. But if you want more control, then use the temporal techniques. Be sure to check in next week, so you don't miss out on my next Nuke Nugget.
What kinds of NUKE tips do you need? Join the Steve Wright's NUKE NUGGETS group on LinkedIn, and post your requests there.