Creating a Single Smooth Roof Surface for an Organically Shaped Pavilion

Hi there! I just started playing with grasshopper for the first time last week and this is what I came up with. I have an issue with the roof surface geometry for this pavilion project.

The concrete pedestals are existing so can’t be moved. With the concrete pedestals as one set of anchors, I set up other anchor points, which are the arcs (also final and can’t be moved) and a central roof apex. I used these as the anchors to create the roof surface then the framing (purlins, etc.) from the surface.

My issue is the roof geometry. When I create surfaces with the method I used, there are noticeable ‘bumps’ where some surfaces meet and the roof doesn’t look like a single surface.

These ‘bumps’ have affected the network of purlins I made from these surfaces, making them look wonky. The surfaces look fine, but when you have purlins and framing, the bumps become obvious like below.

I’ve tried several things and the best and smoothest I’ve come up with is through using edge surfaces. I split the arcs and the interpolated lines then made surfaces out of those.

(I tried my best to clean up the script and internalize as much, but still looks busy).

Any sort of advice to point me in the right direction to get rid of these bumps and create a single smooth geometry is appreciated because I need to have continuous framing and not wonky broken up ones like in the screenshot.

Pavilion Base for Grasshopper Forum.3dm (725.5 KB)

Pavilion for Grasshopper Forum.gh (43.8 KB)


Some sort of vaulted solution:


Pavilion for Grasshopper Forum VR 1.gh (28.4 KB)

Thank you so much Volker! I really appreciate this and am learning a lot from this. I’ve tried making a patch before, don’t know how I didn’t make it work like you did. Also tried the vault early on since it seemed like the more easily buildable and logical, but the client had a difference preference. Thank you so much

@Volker_Rakow I would just like to understand the vaulted solution more since there’s so much I don’t even know existed or understand or tried from the script you wrote like bezier spans. I tried playing with it, turning things off, playing with the slider and values.

It’s a lot, so I don’t expect in depth answers to each one. If you have no time, maybe you could just share some things I could read up on for this kind of vaulted solution.

  1. What’s the point of multiplying the vector 2pt with the number slider and why the expression x.x,x.y,0?
  2. Why did you have to flip the curve? (tried turning it off and the output seems the same to me)
  3. Why flatten the merged component and reparametrize the curve for evaluate curve? tried turning those on and off and also don’t notice any changes.
  4. Why does get the arithmetic mean for the end tangent? Is it because you referenced two arcs and are trying to get one arc from between those two arcs to the roof apex?
  5. Why does getting the arithmetic mean of the end tangent for the bezier span make the surface smooth? (I noticed that when I remove it, it looks like the surface has z-fighting or something)

6. Why is the scale for the rail revolution set to true instead of a number? I tried giving it a number like 1 and 10 and it’s the same output.

  1. I tried making an Isotrim for a divided surface of the patch which I modified, but it seems the grid extends beyond the actual patch and I’m not sure why. I’ve tried other surfaces, but for patches it seems to always extend beyond. When I checked the control points of the patch, it seems to match the isotrim surface. How can I make them bounded by the arcs that I used to create the patch in the first place?

Thank you so much

As a note to others, your .gh sketch requires the curves from the original posters .3dm file.

I start by creating a vector from the apex of the figure to one of the supports:

I want this vector horizontal, or relieved of its Z-component, so I deconstruct the vector and reconstruct it with a Z-component of zero:

This can be short-handed by the expression {x.x,x.y,0}

I want to find the average tangent vectors of the two curves that meet at the support which I used to create the horizontal vector. Because of the way you have drawn your curves, this would be at the end of one of the curves and at the start of the other:

with the tangent of one of the two curves reversed. Instead of this, I can also flip one curve and get the tangents at the start or end (below the end) of both:

Yes. Averaging the two vectors and reversing gives the the end tangent for the Bezier I plan to create. I see in my original script I forgot to reverse the vector direction:

Flattening wasn’t necessary. Reparameterizing makes the parameters of a curve 0 and 1 at the start and the end respectively.

… because if you remove it, you are providing the Bezier Span component with one start tangent and two end tangents, resulting in two Beziers (curves) and ultimately two different surfaces in approximately the same space.

Because as per the tooltip, scale is a boolean, not a number. The profile curve is either scaled as swept along the rail to maintain a constant height (true) or it is not (false):

Because Isotrim only works on untrimmed surfaces. You will have to split by domain and retrim.


You are missing some of the very basics of Grasshopper.

Thank you so much @Volker_Rakow I really appreciate it. I know that must have taken a good chunk of your time. I have so many more questions, but I’ll leave it at those main ones. Also yes, I fully understand I’m missing some basics, I’m just learning as a I go through the project. Thank you again so much

It’s fine. In the meantime, if this has solved your problem, please mark a solution.

Sorry, but could you show how this is done? I’ve tried several things and spent a few hours and I’m still unsuccessful in making it untrimmed with the same shape.

Some very basic kangaroo as an option

Pavilion for Grasshopper Forum.gh (47.5 KB)

Pavilion Base for Grasshopper Forum.3dm (4.1 MB)

You can not make one untrimmed surface from that shape.

Also there are multiple continuous patch options in R9

@dfytz1 Very cool stuff, thanks a lot for your reply! I haven’t played around with kangaroo yet, but will do so