I'm trying to add letters to stadium seating, to make a custom version of the title sequence of Ted Lasso.

I modeled a simple version of a seating block, but now I have to add the letters to it, and I'm wondering what the best method would be to do this. I've already done it manually, just by applying materials and creating the letters just like that. But I was wondering if there is a way to do this more dynamically.

I was thinking in the lines of placing a single letter (as text) beneath each block, and then somehow applying different materials to the seats that overlap with the letter on the xy axes. Is this possible with geometry nodes or just shaders?

I have a simple example set-up here:

So the idea is that all cubes that overlap with the cylinder get a different color. (Ideally with some margin so that the cubes that barely overlap don't get colored).

I've found some examples of using multiple booleans to change materials with intersecting meshes, but ideally I would change the color of the entire seat when it overlaps with the underlying geometry.


If you're using array modifiers and therefore have just one object, then use Texture Coordinate node like so:

Now use "Separate XYZ" and "Math: Less Than" nodes to discover the width of your setup: (of course you could calculate it instead)

Repeat the same for the y coordinate.

Put reciprocals of found values in the scale of the "Mapping" node. In my example the width is 58.88, so I type 1 / 58.88 as x scale and Blender calculates the reciprocal for me: 0.018. Then do the same with y scale.

The chairs are painted "too well"; to make each chair have only a single color, snap the coordinates to the nearest chair using Vector Math: Snap node:

I have 20 rows, therefore I put 1 / 20 (= 0.05) into the y field, and I have 50 chairs in a row, therefore I set x to 1/50 (= 0.02).

Each chair's color depends on a single sample from the texture, so for the best effect use 2D software scale your texture to have the same number of pixels as the number of chairs:

Alternative 1 - UV coordinates

You can ignore spacing and allow yourself to move stuff around (by modifiers or by applying the modifiers and moving manually) by using the UV offsets in the Array modifiers - keep in mind, if you don't use planes but something more complex like a chair, you need to unwrap it as in Moonbot's answer (but unwrap a single chair, not all chairs at once).

You can now move stuff around:

Alternative 2 - Object coordinates

If you have multiple objects, use Object coordinate, and specify the Object field: to the object with the lowest x and y coordinates:

  • subtract the current object's coordinate, to snap to the centers of chairs;
  • add x:1; y:1, because object coordinate system starts at -1, and you want to start at 0;
  • multiply by the relative spacing you used in array modifiers to get the width together with spacing (object coordinate defines a range between bounding box boundaries);
  • when calculating the reciprocals, I'm using .5 as dividend instead of 1 to avoid adding another node dividing by 2; the reason to divide by two is that the base object coordinate system is in range -1..1, we added 1 so it's now 0..2, either way it's twice bigger than normalized range.

This setup is also spill-safe:

  • 1
    $\begingroup$ In your case, if you want to have all sectors defined by a single texture, snapping is a little bit more tricky, but I think it deserves a separate question. $\endgroup$ Aug 24 at 7:02
  • $\begingroup$ Thanks. This does seem to work pretty well. However, my image is pretty stretched. When I dial in the mapping scale to reduce the stretch, the colors begin to spil out into nearby seats. How do I either fix the snap, or calculate the ideal image size to use as texture? $\endgroup$
    – Puzzles
    Aug 25 at 19:50
  • 1
    $\begingroup$ @Puzzles this solution works if you want to divide an area into columns of equal width and rows of equal height. In other words, the chairs have to be distributed uniformly. But you need to be rigorous in defining the data, if you're sloppy at figuring out the width/height, or off-by-one when counting the rows/columns, you will get the spill. Likewise if the distribution is not uniform... $\endgroup$ Aug 25 at 20:04
  • 1
    $\begingroup$ @Puzzles added 2 alternatives $\endgroup$ Aug 25 at 21:27
  • 1
    $\begingroup$ @Puzzles try using Vector Math: add node i.imgur.com/RZfR2Oi.gif $\endgroup$ Aug 26 at 7:59

You can select all your seats and unwrap from view:

enter image description here

Then in the UV Editor select all, enable Pivot > Individual Origin and scale down the UVs a lot (like S 0.01):

enter image description here

You may need to move some UV islands a bit so that they don't overlap with anti-aliasing colors, or slightly move them all on X or Y until it's good. You could also scale the islands down to 0 but in that case I don't know how to scale back to a non-0 size.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.