This website is made for modern browsers. You are seeing this, because your browser is missing a feature or two. Please install the latest update or switch to a modern browser. See you soon.

Space frame of the Water Cube

#domains #structure #voronoi

In this tutorial, we will continue with the basics of Grasshopper and create another space frame, for which the National Aquatics Center will serve as inspiration. The center was built for the 2008 Olympic Summer Games in Bejing, China, and was nicknamed the Water Cube because of its iconic appearance.

The structural design of the Water Cube is derived from the structure of foam or, to be more precise, from an idealized representation of foam: the Weaire-Phelan structure. This model describes the idealized distribution of equal-sized bubbles within a soap film. The bubbles strive to minimize their surface area per volume and thus to have the smallest possible surface tension.

As you can see on the pictures below, the steel members of the space frame are arranged along the edges of the intersections between the bubbles. Between them, to cover the bubbles, there are ETFE cushions, which are also used to collect passive solar energy. The National Aquatics Center was design and built by a consortium of PTW Architects, Arup, CSCEC and CCDI. See Wikipedia entry for Beijing National Aquatics Center.

Facade view / Photo by William via flickr / CC BY-ND
Structure during construction / Photo by Ming Xia via flickr / CC BY-NC-SA

The key element for the design of the space frame is creating of the foam structure. For this, we use a three-dimensional Voronoi tessellation, which follows the same principles as the Voronoi diagramin a plane. We can imagine the generation of the voronoi as if balloons are inflated and as soon as they touch, they flatten each other. Thus, polyhedra are created inside the structure. For the generation of the Weaire-Phelan structure a weighted Voronoi (Laguerre Tessellation) should be used Redenbach, Claudia & Sych, Tetyana. (2008). A RANDOM WEAIRE-PHELAN FOAM. Retrieved from researchgate.net., but for this tutorial a simple Voronoi tessellation should be sufficient.


To keep calculations easy, we will use smaller dimensions and larger elements for our replica of the Water Cube.


Define a ground plan

The first thing we do in Grasshopper is to define the volume of our cube. To do this, we place the component Rectangleon the canvas to get a ground plan. We can assign the length and width of the rectangle at the inputs X and Y. But here, we need to provide domains. With these, we define from where to where, compared to the origin of the construction plane, the rectangle should spread out.

A domain can be created with the component Construct Domain, where the inputs A and B represent the lower and upper limit. We create the numerical values with two Panel, one with 0 and the other with 30. A shortcut to create a domain is to write 0 To 30 directly into a Panel.


Create the outer building volume

To create a volume with the just defined rectangle, we use Box Rectangleand connect the rectangle from step 1 to the input R. The height at input H is again defined as a domain. If we connect a number instead of a domain (here 10), the component will automatically create a domain from 0 to the provided number; in this case the domain will be 0 To 10.


Create the inner volume

To create a second, smaller volume, we use the component Offset Curveon the rectangle from before. The offset is set at input D and must be negative, in this example, so the offset will point inwards. The component Box Rectanglewill again turn the rectangle into a volume, on which we set the height a little smaller than before.


Generate the Voronoi structure

Next, we want to generate a 3D Voronoi diagram between the two volumes. For this, we need the points around which the cells will be generated. We get them from creating random points in our larger volume with Populate 3D. On this component, the larger volume goes into input R, which defines the region that will contain the random points. At input N we define the number of points. Bear in mind that a large number increases the calculation time later on.

Now, the just created points will serve us as input P (Points) on a Voronoi 3Dcomponent. At input B we connect the larger volume, so that the Voronoi cells are created within this Box.


Cut the Voronoi cells

After having a look at the cells in Rhino, we notice that they fill the whole volume, even the inner, smaller one, which is not what we desire. Therefore, we have to cut the inner volume out of the Voronoi foam. For this we use Solid Difference: Connect the cells with input A and the smaller volume with input B. Now, the components calculates the difference and we get two lists with Breps.


Select the desired results

The cutting process worked for all cells that touched the inner volume, but we still have some isolated, intact cells inside the smaller volume. Let’s filter them out: For this we determine the center point of each Brep with Volumeand check with Point In Brepwhether the center points is within the boundary of the smaller volume. Thus, we connect the smaller volume with input B and the points with input P. At output we get a list with Boolean variables.

Now, we use Dispatchto filter all inner Voronoi cells: We connect the output from Solid Differencewith input L and our list of Boolean values with input P (Pattern). Have a look at Filter lists for more on working with lists. We receive a list of cells that lie between the two volumes at output B. For these, the check, if they are inside the smaller volume, returned False.


Extract the structural elements

In the final step, we can bundle the Voronoi cells inside a Brepcontainer to get the cell walls. We can also connect our result to a Brep Wireframecomponent to extract the edges from the cells. These edges can now serve as axes for our supporting member of the space frame.

Get the results

Version Info

  • Rhino 6.30
  • Grasshopper 1.0.0007
This page is open source. Edit it on GitHub or see how you can contribute.

Up next