Minimal surface

Hello community,
I have been trying to relaxation the mesh of a Batwing minimal surface Link to tutorial ( ).
The David Rutten’s classic mesh relaxation script is somehow hard to find so i played around with other mesh relaxation with kangaroo but doesn’t seem smooth enough somehow!
Do you suggest any solution.I would appreciate any help
Here is the Gh definition to construct the batwing surface (26.0 KB)

Other file is my admit to relax the mesh with this c# writing (26.8 KB)
PlanktonTurtleDemo.ghx (255.1 KB)
Plankton.gha (20.5 KB) (70.4 KB) (16.5 KB)

This one is for a slightly different surface (the second one down on this page) (24.6 KB)
It should also be possible to adjust for the batwing (though note the point on Brakke’s page about how the edges for that cell don’t match with a simple translation).

I’m just about to head out - I’ll post more later about some updates on how to do this with soap film elements to get a true minimal surface.

Hey Daniel,
I am really thankful for your answer! in your example the mesh looks like a perfect minimal surface. The only issue is that i can’t use the script for the batwing because as i realise you have constructed the mesh of pseudo batwing pretty differently than my script.
I would be very thankful for any instruction how to relax the batwing to a minimal surface

Thanks a lot for your time !

Turns out you can get the batwing topology from exactly the same starting mesh cube cell as the pseudo-batwing, just with different symmetry constraints. Edges match ones on the opposite side of the cube by translation for the pseudo-batwing, while for the regular batwing, the cell matches by reflection (so in Kangaroo you can just constrain them to the face of the cube, so the definition is actually simpler than the one above) (20.3 KB)

To make these units into a larger surface, you can mirror them, join, then use the commands AlignMeshVertices, and Weld to make the join smooth.

(note that while this and the definition above give nice smooth periodic surfaces, they are not precisely minimal surfaces, since we are using 1d elements instead of soapfilm triangles. The difference here will be small, since it is a fairly uniform mesh, but I will still post an update at some point showing how to use Kangaroo to get a true minimal surface here).

Because the cube patches of the batwing/pseudo-batwing are almost identical, you can even do some neat mixing and matching to form a sort of 3d analogue of Truchet tilings - see the bit at the end of this presentation:


Hello Daniel,
I am really thankful again for your reply! I have been waiting for it.
The relaxed mesh looks just perfect there is only a problem that your Batwing doesn’t really work as a truchet tilling. It somehow looks different that the ones in the Link you sent.

In the example files the holes in the geometry are much bigger.
As you can see in the picture the side wings are exactly in the middle( which make the turchet tiling possible in all directions)
Is it possible to get the same results as the examples in the pictures
Thanks a lot for your time. i really appreciate it

You cannot simply mix and match the 2 surfaces once they are relaxed.
As explained in the link in my first post “Opposite edges almost match under translation

If you look at where the surface of the batwing meets the cube in the bottom left image of my last post, its tangent is perpendicular to the cube face (since it is meeting a mirror copy in the adjacent cell), whereas for the pseudo-batwing, it is not perpendicular, but sloping slightly, since it is adjoined to a translated copy.

It is only the pre-relaxed input mesh can be the same for both.
To make a Truchet style mix-and-match surface, you can’t relax each cube in isolation, you need to join them together then relax the whole thing.

1 Like

There’s also a very nice article by Carlo Séquin about some sculptures based on this idea.
The modules used there are not minimal surfaces though, and to make them modular while preserving continuity, a bending type energy is used to control the tangency where they meet the cube faces. This could also be something possible to look at with Kangaroo

1 Like

Thanks for your reply ! Yes i totally agree!
Is it somehow possible to get the inside holes more similar to the ones in this example

They seem to be much smaller in the last example you uploaded
That would really helpful! Sorry for asking many questions its because i am doing this for an architecture project and the scales are pretty important!
I would be very thankful if its somehow possible

You can vary the size of the openings by controlling the relative strengths of the warp and weft tensions like this: (19.5 KB)


This is really helpful! I am thankful forever.
This has solved a problem i have been trying to solve since many days!

just out of curiosity, would it not be possible to create such a surface through sine formulas? i was playing for a while with these shapes in grapher, goofying around to be honest, but the outcome yields repetitive patterns and could probably be created with grasshopper if somebody knows the correct formula.

here just a crude example I built through rather accidental messings but i believe there is a large community creating these the same way.

There are indeed ways of approximating some periodic minimal surfaces with level sets using simple trigonometric functions:

You’ll need something like marching cubes to turn these functions into meshes. I’m not sure what’s currently the best Grasshopper tool for this that lets you input implicit equations.
Also, I’ve not seen such a trigonometric form for the batwing surface.

Another interesting implicit approach can be to look at the surfaces as the mid-surface between an interlinked pair of line networks.

thanks for the links Daniel, I could not find any examples on a quick look before, let alone the proper terminology for it. Actually I have gotten this idea from a colleague while studying architecture. He used the math plugin for Rhino which was based on .net which produces NURBS surfaces if i remember correct, which I was not able to install due to having a Mac, using grapher instead which you unfortunately cant export, only as 2d sections through polylines which does not make any sense at all. Maybe possible with Python?

could you explain that a little more?

Ah, I have fond memories of Jess Maerterrer’s math plugin. Back before Grasshopper that was my introduction to exploring parametric surfaces in Rhino.

About the mid-surface idea, it is actually a generalisation of the idea of a Voronoi diagram.
If we divide space into regions according to which of a set of point sites is closest, the boundaries of these regions are the familiar Voronoi cells. However, we can also do the same thing where the input sites are not points, but lines in 3d space, in which case the boundaries end up as curved surfaces. Here’s an ancient blog post I wrote about this.

1 Like

-and here’s a quick play with a custom Kangaroo goal to move points to midway between 2 sets of curves.
I wonder if it might also be possible to use Dendro to evaluate these surfaces as meshes @ryein? (18.0 KB)

1 Like

The iso-surfacing in OpenVDB would create a thickened mesh. Nothing jumps to mind about how to keep it a surface. Running the points through the “Points to Volume” component would be the only real way.

If you would like to have Nurbs for your minimal surface you could also use Kiwi!3d ( to model the batwing. It is a form finding analysis and the size of the openings is also controlled by the prestress of the membrane element (P1 and P2). In order to generate the surface you just have to click on the solve button. The result is a nice smooth surface: (58.9 KB)