algorithmic modeling for Rhino

The latest release of Kangaroo contains several new features for generating reciprocal structures.

One appealing aspect of these systems is that they can be used to build freeform structures from standard length elements without any cutting, and using only simple connections, such as cable ties or scaffold swivel couplers. 

To summarize the approach I present here:

  1. Design an initial shape
  2. Remesh this form so that the edges are all roughly the length of the tubes we will use to build the structure
  3. Rotate and extend the edges of this mesh to create the crossings
  4. Apply a relaxation to optimize the positions of the tubes for tangency

Initial form

In this example I show how to apply this system to a simple sphere. You can replace this with any arbitrary shape. It can be open or closed, and have any topology.


The new ReMesher component takes an input mesh, and a target edge length, and iteratively flips/splits/collapses edges in order to achieve a triangulated mesh of roughly equal edge lengths.

Press the Reset button to initialize, then hold down the F5 key on your keyboard to run several iterations until it has stabilized. (F5 just recomputes the solution, and this can be a quick alternative to using a timer)

Once the remeshing is complete, bake the result into Rhino and reference it into the next part of the definition (I recommend doing this rather than connecting it directly, so that you don't accidentally alter the mesh and recompute everything downstream later).

Alternatively you can create your mesh manually, or using other techniques.

Rotate and Extend

We generate the crossings using an approach similar to that described by Tomohiro Tachi for tensegrity structures here:

Using the 'Reciprocal' component found in the Kangaroo mesh tab, each edge is rotated about an axis through its midpoint and normal to the surface, then extended slightly so that they cross over.

By changing the angle you can change whether the fans are triangular or hexagonal, and clockwise or counter-clockwise.

Choose values for the angle and scaling so that the lines extend beyond where they cross, but not so far that they clash with the other edges.

Note that each rod has 4 crossings with its surrounding rods.

There are multiple possibilities for the over/under pattern at each 'fan', and which one is used affects the curvature:

A nice effect of creating the pre-optimization geometry by rotating and extending mesh edges in this way is that the correct over/under pattern for each fan gets generated automatically.

Optimization for tangency

We now have an approximate reciprocal structure, where the lines are the centrelines of our rods, but the distances between them where they cross vary, so we would not actually be able to easily connect the rods in this configuration.

To attach the rods to form a structure, we want them to be tangent to one another. A pair of cylinders is tangent if the shortest line between their centrelines is equal to the sum of their radii:

Achieving tangency between all crossed rods in the structure is a tricky problem - if we move any one pair of rods to be tangent, we usually break the tangency between other pairs, and because there are many closed loops, we cannot simply start with one and solve them in order.

Therefore we use a dynamic relaxation approach, where forces are used to solve all the tangency constraints simultaneously, and over a number of iterations it converges to a solution where they are all met. The latest Kangaroo includes a line-line force, which can be used to pull and push pairs of lines so that they are a certain distance apart. Each rod is treated as a rigid body, so forces applied along its length will cause it to move and rotate.

The reciprocal component uses Plankton to find the indices of which lines in the list cross, which are then fed into the force for Kangaroo. We also use springs to keep each line the same length.

If the input is good, when we run the relaxation (by double clicking Kangaroo and pressing play), the rods should move only a little. We can see whether tangency has been achieved by looking at the shortest distance between the centerlines of the crossing rods. When this is twice the rod radius, they are tangent. Wait for it to solve to the desired degree of accuracy (there's no need to wait for 1000ths of a millimeter), and then press pause on the Kangaroo controller and bake the result.

The radius you choose for the pipes, curvature of the form and length of the edges all affect the result, and at this stage you may need to tweak these input values to get a final result you are happy with. If you find the rods are not reaching a stable solution but are sliding completely off each other, you might want to try adding weak AnchorSprings to the endpoints of the lines, to keep them from drifting too far from their original positions.

For previewing the geometry during relaxation I have used the handy Mesh Pipe component from Mateusz Zwierzycki, as it is much faster than using actual surface pipes.

To actually build this, you then need to extract the distances along each rod at which the crossings occur, and whether it crosses over or under, mark the rods accordingly, and assemble (If there is interest I will also clean up and post the definition for extracting this information). While this technique doesn't require much equipment, it does need good coordination and numbering!

There is also a ReciprocalStructure user object component that can be found in the Kangaroo utilities tab, which attempts to apply steps 3 and 4 automatically. However, by using the full definition you have more control and possibility to troubleshoot if any part isn't working.

The approach described here was first tested and refined at the 2013 Salerno Structural Geometry workshop, lead by Gennaro Senatore and myself, where we built a small pavilion using this technique with PVC tubes and cable ties. Big thanks to all the participants!

Finally - this is all very experimental work, and there are still many unanswered questions, and a lot of scope for further development of such structures. I think in particular - which of the relative degrees of freedom between pairs of rods are constrained by the connection (sliding along their length, bending, and twisting) and how this affects the structural behaviour would be interesting to examine further.

Steps 3 and 4 of the approach presented above would also work with quad meshes, which would have different stability characteristics.

There is also the issue of deformation of the rods - as the procedure described here solves only the geometric question of how to make perfectly rigid straight cylinders tangent. The approach could potentially be extended to adjust for, or make use of the flexibility of the rods.

I hope this is useful to somebody. Please let me know if you do have a go at building something using this.

Any further discussion on these topics is welcome!

Further reading on reciprocal structures:

Views: 38528


Replies to This Discussion

It depends how the surfaces join on the Brep. If the parameters line up, it might be possible to just do this and weld the 2 resulting meshes.


I joint them directly by "brep join",I don't exactly understand what does "the parameters line up" mean, but I am going to figure it out and try to use your method.



Why the "remesh" component changes quad mesh into triangular mesh?



The remeshing component performs the process described here:

-which is specific to triangles.

There are some algorithms for quad remeshing, but nothing so simple as for triangles.

The general approach presented above to generating reciprocal structures doesn't actually need equal edge lengths though - you can just scale whatever the existing edge length is enough to make them cross over.

oh!I see. Thanks!

I got two interlocking patterns, a triangular and a quad pattern, at the same time, I got two questions:

1. how to guarantee that every two elements have one crossing, and all the crossings don't overlap.

2. Do you think optimize the base (triangular or quad)mesh(the geometry of the mesh...) can achieve a ideal interlocking(reciprocal) structure?

here are two draft interlocking pattern I got.

the model of triangular one is two big, here is the quad one.

you can see some of the elements doesn't intersect in the model.


Sorry to bother you, but how did you manage to make the struts have the same lengths? all of my struts have different lengths

Hi Daniel,

Thanks for your tutorial! I tried your method, but got stuck in the first step: sphere mesh. I used exactly the same components as you did, but I failed to get the "irregular" sphere mesh as shown in the picture above. Hereby is the mesh I achieved: No matter how many times I tried, I just couldn't obtain the regular quad mesh or equilateral triangular mesh...

Then I tried to create the mesh in rhino itself using PanelingTools... still not successful...

Could anyone tell me what went wrong (in both approach: grasshopper and panelingtools)? Any advise would be appreciated!!!

Perfectly regular triangles on a sphere is only possible for a few specific numbers of triangles, such as 20 for an icosahedron. If a symmetric arrangement is what you want, you could use Weaverbird to subdivide an icosahedron to the desired level.

Thanks! I'll try that!! :)

Hi Daniel!

Sorry for boring you. I'm studying the reciprocal frames, but I'm not able to obtain a regular and symmetrical mesh.

I've started from a symmetrical curve, I've obtained a mesh with Mesh Machine (target edge length = 1) and then applied an algorithm to form-find a compression only structure. Now I would like to obtain a RF structure from this mesh. I've used Mesh Machine again (target edge length = 4) but my mesh is not regular or symmetrical.

Could you help me?

Thank you in advance


Hi Daniel, thanks a lot for your work.

I do bio contruction and I have some experience building reciprocal structures but just in round shape as roof structure.

Like this:

I really would like to build a small physical model based on your definition but I have no idea how to get the necessary info to make it.

As you said:
"To actually build this, you then need to extract the distances along each rod at which the crossings occur, and whether it crosses over or under, mark the rods accordingly, and assemble (If there is interest I will also clean up and post the definition for extracting this information). While this technique doesn't require much equipment, it does need good coordination and numbering!"

May you help me please? How can I extract this information?







  • Add Photos
  • View All


  • Add Videos
  • View All

© 2023   Created by Scott Davidson.   Powered by

Badges  |  Report an Issue  |  Terms of Service