Fitting Geometry to Surface (Tiles to roof) with complex surface

Im modeling a roof and want to cover it with tiles. I’ve chosen to also model the individual tiles insted of using a texture or the like. Now I’m at a particular part of the roof that has a complex shape, so I cannot proceed with the same technique I’ve used before. That is using a 2d-Lattice as explained here:

This method has worked fine for simple surfaces as in picture 1.

Now that I’m trying to fit my tiles to a more complex roof-shape as in picture 2, however, the lattice will no longer do. I’ve tried to use a 3d-Lattice with 1 surface according to the roof shape and the other squared around my tiles, however this did not yield the desired result (picture 3).

So my question is if anybody knows a method or a workflow that will fit the tiles neatly to the surface in picture 2 and picture 3.

So far I’ve reverted back to single handedly modeling every tile together with maybe a curve modifier or something similar but this is really time consuming and won’t look too good.

1 Like

Hi, since 2.93 you can use geometry nodes for this kind of thing. The only thing you need is a base mesh (a regular subdivided plane the shape of your roof) to instance tiles on. Now depending on whether you want the tiles to be arranged in a grid or in alternating rows, you’ll have to shift every other edge loop of your plane by a small amount.

If you’re using an older version, you can try the “old” dupliverts : parent the tile object to the roof object and check dupliverts in properties editor (with the roof being selected… I think?). This will instance the child object onto every vertex of the parent object.


Hi and thanks for your quick response. I’m afraid I have no experience with geometry nodes yet so your answer is a bit above me, will watch a tutorial and give you feedback if it worked.

There’s quite a few tuts already on youtube, people have been quick. Basically open up a geometry nodes editor, select your roof object, click the + button, then add a point distribute node, select your tile object. If it’s not oriented well add a point rotate node before that and play with the values. You’ll get the hang of it quickly. I think in your case it’s the ideal solution. You can even make several different tiles, store them in a collection and select this collection in the point instance node.

Btw there’s a long thread about geometry nodes on this forum, plenty of examples and heated debate in there :

Using a simple point instance node, I was able to reach the desired result on an even, subdivided surface. There are two problems with the desired shape. 1. the distance between the individual vertecies is not equal, so neither are the tiles, however I’m seeking a regular pattern. This could be solved by recreating my ground mesh but I have no clue as to how to maintain distance while at the same time change the form of the mesh.

The second problem is with regards to the rotation. As the mesh does have a different orientation depending on the location, so should have the tile, however the tiles are all rotated equally. I can imagine this is rather easy to fix, but do you know a solution for that vertex-distance problem?

Ah, good question. You could totally paint a vertex group and use it for scale (with a point scale node, before the point instance), but there’s some error margin, as with everything hand-painted. If you’re okay with it, do that, otherwise you’d have to find a way to scale each tile in regard to the length of its connected edges… I don’t know how to do that. You can ask in geometry nodes thread, there are a handful of geniuses there that might know how.

As for the tile rotation, you can use the point rotate node in “point” mode but it’ll only rotate every point the same, unless you use an attribute in there - this attribute should be oriented in regard to the local point tangents. There would be some tricky vector operations to do here but I’m not sure which. :frowning: You should really ask on the GN thread.

That’s one of those “frequent” situations that should be streamlined imho : laying tiles that follow the mesh topology. I’m sorry I don’t have a readymade solution, someone may show up with one.



Thanks alot you helped me for sure. I was not expecting an easy solution to this and am glad of getting any step further. Geometry nodes seem to be the best way of doing this, which I didn’t know before, so I will post my problem in GN section.

I’m not sure, but you might be able to achieve what you want using one of these addons:

1 Like

Look at Surface Deform modifier it can be more useful than Lattice in this case.

I’ve used GN in combination with Surface Deform modifier.

  1. Make a retopologized copy of roof with all squares (snap to face, closest, project individual elements)
  2. Make a shape key and flatten the shape (S+0 with transform set to View) - Object 1
  3. Make a copy of this object and add GN with Point Instance - Object 2
  4. Add Surface Deform modifier with target of Object 1, bind
  5. Change shape key of Object 1 to non flattened.
    (optional) Add Displace modifier to Object 1 (displace by normal)
    Apply GN and remove excessive tiles.


1 Like

Hello Kate and thank you very much for taking the time and effort. That looks pretty good and not far from the objective even without having to adjust manually.

I’ve tried to follow your steps and was able to retopologize the mesh into quads using the snap to faces method, however I’m not sure if you did it the same way. The geometry node displays my tiles evenly which is very nice. However I wasn’t able to complete step 5, when I change the shape key of Object 1 back to flat it messes up my Object 2 pretty bad, as you can see in the image.

I’ve documented my proceeding here:

also the blend file here

maybe you can find what I did wrong?

kind regards

Hi, So I’ve been messing around with the tesselate option of the tissue addon and after just a little time it doesn’t look too bad.

First I turned the mesh into squares as in Kate’s suggestion and then I had to split the tile object that consisted of two aligned tiles up into one tile and then apply the tile twice as tesselation. Then rotating and grabing the second tile into position using individual origins in edit mode is quite hard and I didn’t get there in the little time I invested but I think this might bring an almost optimal solution.

thanks alot.

1 Like

Thank you for providing video, it helps a lot!
As I understand Surface Deform modifier binds object’s verts to target’s closest surface point.
So, in your case all of Object 2 verts are binded to the right edge of Object 1.
Try not to move object when duplicating (leave Object 2 on top of Object 1) :wink:

For Tesselation to work smoothly you need a special pattern (ideally square).

I’m using Array modifier to check if the pattern is tileable.
When tesselating select rotation - Active UV, make UV for the object you are tesselating on (if looks wierd - rotate UV).

Geonodes_Experimental++.blend (4.8 MB)


So I finally finished the roof using a seamless pattern of tiles and the tesselate Option of the Tissue AddOn onto a retopologized version of my roof shape. Really happy with the result now. (Image 1)

For comparison you can also see the Image where I fit every tile using Lattices and adjusting it manually (Image 2)

Which I did already because I was too impatient to wait for the perfect solution. Now that I have it I’m very glad I remodeled it though, the quality really stands out compared to the other one, I will even remodel the simpler parts of the roof like that.

I’m really glad we have such an active and helpful community here on Blenderartists which makes taking step by step for a non-professional like me possible. Thanks alot to everybody who made me overcome this problem, with special thanks to Kate.

For anyone who might face a similar problem here is the entire solution:

  1. Make a retopologized version of the shape
  • Slightly scale up the shape because the retopologized version will lose some scope. Make sure not to change the initial shape itself but just to extend it at every side.
  • Add Object Plane, scale it up to cover your entire shape from view. Depending on the Shape of the tile you wish to tesselate, keep it a square or turn it into a rectangle representing the desired proportion.
  • Subdivide the plane until the Faces on it have the size of one tile (15 Times in my case).
  • Use “Snap to face” with options “closest”, “project individual elements” selected.
  • with your view positioned so that the Plane covers the entire Shape, hit “G”, and right click.
  • Select all the snapped faces and quickly check if they cover the initial shape entirely (exceeding it slightly), then seperate them by selection. ← Retopologized Shape
  1. Make a seamless tile (sure this could also be done more elegantly)
  • Model a single tile
  • Use 2 Array modifiers to have the tiles line up in the desired angle, hit apply.
  • Use Boolean modifiers to cut out 1 Tile + Surroundings Top-Bottom and Left-Right (Important! If you rotated the tile, do NOT reverse the rotation for a more obvious boolean cut, as this will influence the scale of the array modifier, which has to line up on 1.000 for both axis for the tesselation to work.)
  • Check the result using 2 array modifiers on the seamless tile (not applying them).
  • Clean up the seamless tile, deleting excess vertecies created by the Boolean.
  1. Use the “Tesselate” option of the Tissue Addon
  • Select “Rotation: Active UV” in Object Data Properties
  • Rotate the UV of the retopologized shape into place.
    *Optional: Use the “Merge” Option to remove doubles.
  1. Place the tesselated Roof
  • Remove Doubles
  • Put the tesselated roof back into the desired position
    *Optional: Use Proportional Editing to make the tiles at the edges are even, make sure not to distort the shape too much.
  • Use Boolean Modifiers to cut excess geometry (I’d advise to remove doubles again after every boolean application as this process creates quite some geometry which can cause problems).

It turned out great! Glad to be of help. Looking forward to see the final result :wink: