Kangaroo 2 Tensile surface with holes


I wish to generate a tensile surface with holes inside, is there a simple way to do this.

Hi Richard,

This can be quite simple - just make a mesh with holes and relax it, keeping some points anchored or on a boundary curve.
Here’s an example where I’ve also set a higher tension for the outer edges of the mesh, to simulate a boundary cable
tensile_holes.gh (26.9 KB)

What if you want to mantain the wholes circular?

You could use the CoCircular goal on the naked vertices sets along the holes.

1 Like



I don´t have the component for some reason. I have the current version of Kangaroo and Rhino 5

Ah, this is in Rhino 6 only I’m afraid. There’s a newer Kangaroo included in R6 now.
CoCircular is also one goal that won’t get put into Kangaroo for R5, since it uses a function only in the R6 library.
You can do the same in the older version though by combining CoPlanar and CoSpherical, since if they’re both they are also CoCircular. It would be quite a bit slower though.

1 Like

Hi Daniel,

Thank you for the email and attached file which is close to what i’m trying to achieve, see attached. What is the easiest way to achieve this and retain control over the hole/anchor points?

Kind regards,


That image is from an old blog post of mine:

I’m assuming you’re talking just about the shape on the left, not the reciprocal diagram though.
All you need is a flat mesh with the holes you want, then you anchor some points around the boundary, use an EdgeLengths goal and VertexLoads.
catenaryhole.gh (11.3 KB)

1 Like

Hi Daniel,

That’s exactly what I need, absolutely amazing. I have one final question, How do you create really clean simple meshes. Mine always turn out like the attached. (Created from brep and split using solid then converted to mesh) Whats the secret?

Thanks again for all your help, its much appreciate.

Kind Regards,


Remesh it, or make a cleqn quad mesh and cull hole faces.

1 Like

Dear @DanielPiker,

I’m trying to reproduce the reciprocal diagram from your blog post with K2.
Unfortunately your old example file gives some errors in RH5 and RH6 (“Output parameter chunk is missing. Archive is corrupt.”) and I guess I’m missing some component(s) because of that.

From my understanding the Length(Line) goal is the equivalent to SpringfromLine but I have no Idea what the equivalent to TransformationLock could be in K2 (I tried Direction + Length(Line) that doesn’t do it).

Daniel_Piker_ReciprocalForce_tryrebuildK2.gh (95.7 KB)

You had the right idea. Direction + Length will do it, but I’ve realised there is a bug where Direction gives odd behaviour if the input vector is not unitized. With this small change your definition works:
ReciprocalForce_K2.gh (96.5 KB)
(I’ll fix this for the next release, so the input vector is automatically unitized by the component, but for now just include a unitize component before it)

Alternatively, a more direct alternative to TranslationLock from K1 is the Transformation component in K2, where the transformation can be a translation, but doesn’t have to be:
ReciprocalForce_K2_Transform.gh (96.8 KB)

Also - here’s something I did more recently on this same idea of the reciprocal form/force diagram.
For the equilibrium position of a network of zero rest length springs, its dual is also a stable network of zero rest length springs.

What I found remarkable is that this means you can even slide the lines along each other to move between these 2 states, without ever changing the lengths or directions of each individual segment - the lines here are rigidly translating along straight lines, and they stay exactly in contact:

tensilereciprocal_helicoid_catenoid.gh (23.8 KB)


Thank you very much Daniel! The Transformation component looks really interesting.
The tensilereciprocal really blew my mind, that looks so great!
I tried to reproduce this on a hyperbolic parabolid.

1 Like

Just out of curiosity, would it be possible to perform the same operation beginning with the reciprocal geometry as your starting geometry? It seems like the original anchor points for the triangular minimal surface are very important in determining the form of the catenoid.

Hi August, Sorry for the late reply.

I believe that this sliding motion while keeping the directions and lengths of the members is not possible for general reciprocal geometry - it works for meshes form found with zero rest length springs because the force density (f/l) is constant (since the tension in a zero length spring is directly proportional to the length). The forces being balanced at each node translates to closed polygons in the dual.

It’s true that the anchors or boundaries are critical in determining the form. As mentioned in the blog post I linked upthread, this transformation is related to Bonnet rotations, associate families or adjoint minimal surfaces, where a straight line in one surface always maps to a planar geodesic in the other.

1 Like