algorithmic modeling for Rhino

Dynamic remeshing - now with feature preservation, curvature adaptivity, and minimal surfaces

This will be incorporated into future releases of Kangaroo, but because it is so much fun to play with (not to mention useful!), I was excited to share this as a standalone component right now.

This is a tool for remeshing, as I first wrote about and demonstrated here.

However, since those first videos over a year ago, this has been improved upon and developed a lot. 

One of the most significant changes under the hood is that it now uses the custom half-edge mesh class Plankton developed as an open-source collaboration by myself and Will Pearson (to whom I owe great thanks for all his fantastic work on this). Big thanks also to Giulio Piacentino for sharing his great work on Turtle, and to Dave Stasiuk, Mathias Gmachl, Harri Lewis, Jonathan Rabagliati and Richard Maddock for helpful mesh discussions.

High quality triangular meshes have many applications, including physical simulation and analysis.

Since I shared some examples of remeshing scripts here, I have also added a few more features in response to discussions and requests:

Feature preservation

This allows the user to set curves and points to be preserved during the remeshing. These can be boundaries or internal curves, and can be useful for keeping sharp creases, or separate regions. (One of the major applications of this tool is creating high quality meshes for input into analysis programs.)

These features can now even be moved while the remeshing is running, and the mesh will stay attached.

Curvature Adaptivity

When a mesh contains features with tighter curvature, smaller edge lengths are needed to faithfully represent the geometry. However, applying these reduced mesh lengths across the whole surface, even in flat areas where they are not needed can be impractical, and slow everything down. A solution is to refine the mesh according to local curvature.

'Fertility' model from AIM shape repository, remeshed with curvature adaptivity. Here the edge flipping option is also set to valence based, which causes the mesh to become anisotropic in the direction of curvature.

Minimal surfaces

Relaxation based purely on 1d elements will not give accurate minimal surfaces, we need to use proper 2d elements.

However, when relaxing meshes to produce minimal surfaces, generating a high quality initial mesh can be problematic and tedious. Uneven meshing can cause the relaxation to fail or give incorrect results, especially when the relaxed geometry changes significantly from the input, causing the triangle quality to degrade even further.
By continuously updating the connectivity of the mesh to maintain even sized and nearly equilateral triangles, even very large changes to the boundaries become possible, and the surface still minimizes mean curvature.

This allows exploration of sculptural forms in a more dynamic and flexible way than I think has ever been possible before (seriously - try it out, I think you'll enjoy it).

Surfaces may 'pop' if the boundaries are moved suddenly or too far apart - as sometimes no minimal surface solution exists with the given boundary conditions.

Any plugin claiming to produce minimal surfaces which lets you move the end rings of a catenoid arbitrarily far apart and still gives a tubular solution is lying! The only proper behaviour in this case is to collapse into 2 flat disks. (As it is currently, the disks will remain connected by an infinitely thin strand, as I have not yet implemented anything to allow genus change, but maybe in the future.)

Here is the component and a basic example file. Feel free to ask any questions about its use, report bugs, or request changes or additions. This is still a work in progress.




To install, unzip and place the dll and 2 gha files in your Grasshopper libraries folder (replacing any previous versions of these you may have installed - these are more recent than other releases). Make sure they are all unblocked, and restart Rhino.

Views: 11885

Tags: form-finding, kangaroo, mesh, physics, plankton


You need to be a member of Grasshopper to add comments!

Join Grasshopper

Comment by Balázs Hegedus on December 4, 2014 at 1:31am

Hi Daniel,  

Can you plaese help me with the installation. Actually I followed what is written here, I copied the 3 files into the libraries, but after restarting Grashopper I got erros messages as can seen ont aattached image...

Thanks in advance!

Comment by Nik Willmore on June 8, 2014 at 6:31pm

I found the math for a related 2D version called Chew's Second Algorithm, and a C# port of it, so now I guess I have to learn how to make my own Grasshopper component. Why are simple elegant meshes not built into Rhino and Grasshopper already?!

Comment by Nik Willmore on June 6, 2014 at 2:30am

Oh this really is a game changer. The example file even includes remeshing into near equilateral triangles but of adjustable size according to curvature so only details get tiny triangles. I'm playing with automatically generating quad meshes for use in T-Spines now that T-Splines has a soft radius adjustment and is thus no longer reliant upon having a coarse face divisions in order to smoothly edit large regions at one. But I need quad meshes! So MeshMachine combined with the Weaverbird Constant Quads Split Subdivision gets me where I can actually without any labor, just get to work editing with virtual "clay" within Rhino.

FEATURE REQUEST: I am still missing a *flat* version of this that relies on either edge curvature in 2D or on simple proximity to various edges and holes in a flat mesh, similar to this example that lacked a download:

Comment by Nik Willmore on June 6, 2014 at 1:47am

The loading error messages were caused by Windows itself bizarrely "blocking" the added items. After copying new files into the %appdata% Roaming Grasshopper Libraries directory, I had to right click each to find the Windows Unblock  button in their Properties dialogs. To permanently disable this nanny behavior by Windows follow this instruction:

Comment by Mathias Gmachl on May 20, 2014 at 3:51am

First of all a big thank you, Daniel!

I think the Mesh Machine performs amazingly well. I have worked with it a lot over the last month and its been incredibly useful and reliable.

Purely from a workflow perspective I wanted to make two suggestions to make it work even better (for me and hopefully also others).

1) Option for an input/start mesh:

The BREP input is great as you get the highest possible resolution in the target geometry, which is then converted to a mesh internally.

It would be great to be able to input a optional starting mesh, too. This would protect us from potentially running out of memory at a reset (due to a combination of large geometry and small edge length setting), but also allow to further optimise an existing mesh (I often start from meshes, which I heavily subdivide to achieve smoothness, which can make the reset very slow).

2) Dual support:

You already mentioned in your email that it would be possible to re-mesh with a focus on the edge-lengths of the dual, while flipping edges in the triangular mesh.

It would be great to have a such DUAL mode that also gives the options to output as a pmesh.

Thanks, again!

Comment by Nick Tyrer on May 19, 2014 at 4:22am

Daniel, Have you tried switching the 'flip' input to Valence? Instead of the default angle based remeshing.

copied from previous comment by Daniel:

The angle based option decides whether to flip each internal edge depending on the sum of the marked angles (choosing the one which gives the smaller value).

The valence based option chooses whether to flip the edge depending on the total valence error over these 4 vertices.

The valence error is how much each valence differs from the ideal (6 for internal vertices, and 4 for boundary vertices). So in the picture above the left version has valences of 5,7,6,7 giving a total error of 1+1+0+1=3, while the right version is better with 6,6,7,6 giving 0+0+1+0=1

Comment by Wieland Schmidt on May 16, 2014 at 2:48pm

Hi Daniel,

thanks a lot for this amazing tool!

Is it possible that at each vertex six faces meet (like in the majority if cases) and not sometimes four, five or seven?


Comment by Nick Tyrer on May 14, 2014 at 4:50am

Dr. Piker,

I have a question about webbed toes.... They are not meant to be webbed, mesh machine is giving me them... What would you recommend? The edge of the form is a fixC curve, but the mesh grows past boundary.

Comment by Daniel Piker on May 4, 2014 at 6:33am

yes - if you are remeshing and then want to optimize the shape further in Kangaroo, you need to stop the remeshing first, and bake or internalize the mesh.

Comment by Ioanna Symeonidou on May 3, 2014 at 5:21pm

Thank you Daniel !

What you explain makes perfect sense. I am mainly interested in form-finding of tensile structures. So I suppose that using either remesher or springs will lead to good approximations of a membrane.

One last clarification, in case I remesh and then otpimize in Kangaroo. If points are in an unstable condition during the remeshing, I would need to bake the geometry after remesher and feed it back to Kangaroo to perform other simulations, right ? Or is there a way to fix some state of the simulation and use it as output for further optimization?

Thanks again and congrats for the great work you are doing ! Kangaroo rocks !


Search Grasshopper


  • Add Photos
  • View All

© 2015   Created by Scott Davidson.   Powered by

Badges  |  Report an Issue  |  Terms of Service