Parametric Frame Serpentine Pavilion


Categories: Tutorials

Tagged with: | | | |

Aim: To use parametric design in grasshopper to create the forms for my studio project, to design a Serpentine Pavilion in London.

Render from my studio portfolio

Input and Establishing Vectors

The only input to generate the whole form is a single line. This curve defines the length and bend of the pavilion, acting essentially as a centre line around which the form is generated. Here you can see I divide the line into 30 points, and define the planes in which each frame is generated, along with finding effective x and y vectors for each frame.

Defining Form

Having defined the planes and vectors with which to generate the frames, I next generated lists to define the varying size of the frames along the length of the pavilion. Width and height indicate the radiuses of the ellipse, and are then multiplied by a number between 0 and 1 to give the size of each ellipse. The grasshopper modules below show the process of getting this number set. I am drawing a curve by moving points away from a baseline, and then measuring the distance between this curve and the baseline at 30 points, one for each of the frames. I have two instances of this running, one for the width and height up, and another for the height downwards from the centre line (the centre line of the whole pavilion geometry). This allowed me to vary the shape of the bottom of the pavilion independently of the width and upper height. As a result, the ellipses are not varied proportionately throughout the pavilion.

After the distances are remapped, they are multiplied against the base number from the slider, to draw the lines seen in the last image of this section. These lines are used to draw each ellipse.

Frame Construction

The points from the ends of the lines in the previous image are used to draw the ellipses that define the broad form of the pavilion. Each ellipse is also scaled by a factor of 0.75 so the frames have reinforcement. From these ellipses, each one is divided into 12 points. I used shift list to draw lines between points to create the frame, following Da Vinci’s principle of arches.

I took points from the frame to then both join the inner and outer components of the frames, and then also to create ribs which join each frame together along the length of the pavilion.

So far, all the data is in a simple line/curve format. In order to make it into a 3D frame, I gathered the line data from across the file (see below) and merged it to put into a pipe component.

This leaves us with the final frame, the basis for the pavilion around which all the other components are arranged.

Pins and Lights

The pins for the membrane and the lights were quite basic. I simply established which points to use and created a sphere from these.


For the membrane I began with all of the points from the outside of the frames. In order to generate polylines for a loft, I had to reorder the list of points. I did this by creating a series list into a series list (changing the start point), and putting this into the index of list item. I used this in multiple places in the file, but feel there must be a better solution than this. This is one of the areas I would like to work on to make my scripts more efficient. Once I had reordered the points, I was able to generate polylines from them, and loft the polylines to get the membrane geometry.


In this first image, I began by managing the points data. I selected the branches and shifted the lists until I was left with only the anchor points for the seats, given by the polyline components on the right of the image.

I took two of the polyline components to work on the seats for one side of the pavilion. I manipulated these lines to move one directly upwards, and another that was equidistant between the two base lines. This gave me points through which to draw my curve for the profile of the seats.

From the curve of the seats, I was able to extrude in both directions, offset this surface, and loft to cover the sides. The resulting brep gave the seat form, made up of lots of individual members.


The floor used a similar method of generating individual lines for the base geometry and then extruding to create the timber members.

Once I had the base geometries of the lines, I was able to extrude in a similar way to with the seats to get the rectangular batons I would use for my floor.

This, I feel, is the weakest part of the whole script. It is not efficient, I had to repeat the top right script twice, and the bottom right script three times, only changing one input for each. I am confident a better scripter could condense this down, or finder a shorter solution, but I was not able to in time for my studio deadlines.

Overall Output from Grasshopper

This is everything that was generated in grasshopper, followed by some Twinmotion renders I made for the studio project.

Rendered Outputs for Studio Project

To reflect on the project, it was a pleasure to be afforded the time to really focus on working on my Grasshopper skills, following on from learning the basics last semester. I am quite proud of my progress in using the software independently and finding new solutions, but there is still a massive amount of functionality within the program which I do not yet understand. I am excited to continue learning about parametric design. I am aware of some of the limitations in the script where I have had to unnecessarily repeat parts of it, and I hope I can develop past this point.

Grasshopper File: