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

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


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

Join Grasshopper

Comment by Nicolai Bauchrowitz on December 9, 2015 at 3:23am

Hello Daniel,

its been a while since this post has been commented the last time, and since you have included MeshMachine in Kangaroo by now, I wonder if you could maybe update the example file in the first post- GH cant load the old meshmachine component...

Comment by machinehistories on November 17, 2015 at 5:58pm

I have been trying to use meshmachine to get the resulting mesh to adapt to the color from my rhino analysis mesh. I used the mesh deconstruct component to extract the color of each vertex and converted the color to hsl. The hue was input into the SizV and the mesh vertices into SizP. I also have also tried setting the adapt to 0 as suggested in a previous post. It is working to a certain degree but I was wondering what is the best way to use color or brightness to get an adaptive mesh using meshmachine. I know Daniel mentioned he was experimenting with using images but I couldn't find an example file showing such a workflow. Any help would be appreciated.

Comment by Nik Willmore on July 20, 2015 at 5:02am
I outline MeshMachine as a tool for normal Rhino users here, based on either somewhat unreliable Boolean unions of manually placed solids and capped extrusions, or lately more robust metaballs/lines/surfaces using marching cubes to avoid the Booleans:
Comment by Oliver Tessin on July 3, 2015 at 8:39am

Would it be possible to use Roberts 3D Delaunay  as a dynamic mesh which's density can be controlled?

Comment by Oliver Tessin on July 2, 2015 at 8:30am

Works great. Many thanks!

Comment by Robert Vier on July 2, 2015 at 7:50am

You cant see the subfolder on my dropbox?

They're in there..

Comment by Oliver Tessin on July 2, 2015 at 7:38am

Hi Robert,

thanks for the quick reply. Your def requires "StarMath.dll" and "MIConvexHullPlugin.dll", which it seems I'm not able to find as public download.

Many thanks for your help,


Comment by Robert Vier on July 2, 2015 at 7:19am


I dont know if it is of any use - but a while ago I used the MiConvexHull to generate 3D delaunay meshes = tetrahedrons.

here you are:



Comment by Oliver Tessin on July 2, 2015 at 6:31am

Hi Daniel,

thanks for the quick reply. I searched the forum for what you mentioned at the end, but couldnt find the conversation you refered to. Could you drop the link?

Basically... I would like to create a structure as effiecient as 2D Delaunay, so basically a 3D Delaunay. I tried with Proximity (not good as it fails to make connections) and Voronoi 3D (posted below). I am planning to create a structure like this with almost 50.000 edges and trying to find a better way to do it.

Many thanks,


I found a good reference for what I'm trying to achieve, I guess.

Comment by Daniel Piker on July 2, 2015 at 5:47am
Hi Oliver,
Volumetric remeshing like you are talking about would involve a volumetric mesh data structure, containing definition of tetrahedra and the connections between them. The Plankton half-edge structure used in the script above for the triangle connectivity is for surfaces only.
Appropriate data structures do exist, and we have talked about such a development, as tetrahedral meshes are useful for several things...


Search Grasshopper


  • Add Photos
  • View All

© 2016   Created by Scott Davidson.   Powered by

Badges  |  Report an Issue  |  Terms of Service