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: 40544


Replies to This Discussion

Fantastic work!

Daniel - Connecting threads as I remember this topic popped before (with your input).  Cheers!

amazing !

Your great Daniel. Thanks for sharing your work :)

amazing !

Awesome work Daniel! 

Awesome work Daniel!
:) You're a magician!!

Very helpful! Thank you so much for sharing it.


Hi Daniel,

I want to test your method to map a double curved geometry(I have the quad pattern of it) with quad reciprocal structural pattern. Do I need to convert the geometry into a quad mesh first? Or you have other way?


Yes, you'll need to convert to a quad mesh first, but to get a clean quad mesh from a NURBS surface I'd recommend doing it like this instead:

Hi Daniel,

As I understand, if I do it like this, so the brep will have to be deconstructed as two surfaces, which will guide to different subdivision points for the two surfaces. I prefer the whole brep can be transfered to one quad mesh and then mapped with these reciprocal pattern.

Do you think there is some way?






  • Add Photos
  • View All


  • Add Videos
  • View All

© 2023   Created by Scott Davidson.   Powered by

Badges  |  Report an Issue  |  Terms of Service