Mesh clustering

Following the question of Gijs here a short explanation of my mesh clustering.

A shape (disk here) is first triangulated with mesh machine,

Some random lines are draw on the shape

Points on lines are used to get index of mesh faces that are closes to the points. These index in a Datatree are then used as the seed to cluster the mesh

Contour of the cluster mesh is extracted as a polyline

Polyline is smoothed

The offseted 2 times, outward the innward so the curve will have a limited amount of curvature.

And then colored

What is also fun is to use buggy Gilbert Tesselation, here applied on a surface to make some other pattern types

And to not forget, the first inspiration was that pattern of T Table of Patricia Urquiola


Hi Laurent, thanks for taking the time to show the process. What’s so nice is that the result has a very natural look and feel to it.

Yes it is beautiful and it changes from Voronoi tesselation.
What gives it an interesting shape is that it grow from a group a faces (here on a segment), but could be circle … You will have to grow one row for each cluster. It is classical mesh topology to solve it.

what do you mean by ‘but could be circle’?

Beautiful. Very nice work Laurent!

In the example I gave the seed faces were aligned on a line, but they could be aligned on a circle or an arc.


ah… looks very nice as well. Many possibilities :sunglasses:

nicely done. i am trying to do something similar with a distribution of points and am wondering about ‘mesh clustering’ and the C script component that you use for that. i suppose you made that yourself? would you please consider sharing it with me?


Here the script to transform some subdivided parts to a sort of cracked mud.
The idea is to move the mesh differently if points are near the center of the exterior. The other trick is to connect the borders. Slider controlling the movement must be tuned to the size of the object. You will need Weavebird plugin.
I used here classical Voronoi, but you could use mesh clustering and other thessellation algorithms. (18.5 KB)


Here are some news on Mesh Clustering. I implemented a “Multi Material” Catmull & Clark subdivision. Each face of the mesh has a material (an index here). The problem with “classical” Catmull & Clark subdivision is that it leaves some spaces near places where there are 3 frontiers.

So it will be useful to make puzzle, lamps …


Here a new project using parts of what is presented above.
Here it could become a lamp (similar to Nervous lamp
Sphere clustered

Sphere with clusters flattenable (without inner vertice using one of my algorithm which is not perfects) with rivets position

Shapes nested

Still work to do to have more robust mesh transformation for the flattening, patterns differents from Voronoi, joining pieces with others methods (thread, …)


Using in Grasshopper RhinoPolyedra, then Quad Remesher, then my mesh clustering, then my Catmull&Clark subdivision for multi meshes, then Offset Mesh from Pufferfish then Catmull&Clark from Yellow then Material published here Custom Preview Shinyness when using create material (BUG ?)


Very cool stuff, Laurent! I’m curious how you achieved your very own Catmull-Clark-subdivision? I’m certain that you wrote it in C#, but how does it work?
Btw, if you haven’t read Ed Catmull’s auto-biography “Creativity, Inc.”, you’re in for a treat!

Thanks, here a more global explanation
First I used Grasshopper Polyhedron

Then I remeshed the mesh with quads using Rhinocommon

    QuadRemeshParameters parameters = new QuadRemeshParameters();

    parameters.AdaptiveSize = Math.Min(Math.Max(adaptiveSize, 0), 100);

    parameters.TargetQuadCount = quadCount;
    parameters.DetectHardEdges = detectHardEdges;
    A = mesh.QuadRemesh(parameters);

Quad mesh is clustered, yes a C# but I use a library I made. So it is not to complex. I have a mesh (quad mesh here), some seed face (list of integer), some controls so it outputs for each face of the mesh a material (an integer indeed). So this allows to use a Catmull&Clark to a single mesh (GetSubdividedMesh the the C#).

    meshes = LDClusterMesh.GetCluster(mesh, seedFaces, limit);
    int[] index = LDutils2.LDClusterMesh.GetPuzzleClusterIndex(mesh, seedFaces, seed, limit, runs, maxValue, acceptBorder);
    //meshes2 = LDutils2.LDClusterMesh.GetPuzzleCluster(mesh, seedFaces, seed, limit, runs, maxValue, acceptBorder);
    List<int> faceIndex = new List<int>();

    bool fixe = true;
    //int iterations = 3;
    double f = 1.0;

    LDutils2.MeshMultiMaterial mm = new LDutils2.MeshMultiMaterial(mesh, faceIndex, fixe);
    LDutils2.MeshMultiMaterial mm2 = mm.GetSubdividedMesh(iterations);

    meshes2 = mm2.GetSeparateMeshes();

The subdivided mesh

My subdivision technique (no holes) and classical Catmull&Clark applied to each single cluster (holes are appearing).

Mesh is then offseted solid using Pufferfish (it works on Rhino 7 WIP)

Then smoothed with Catmull&Clark from Yellow (a bit long ?)


Thanks for taking the time to write this up and sharing bits of your process! Very kind of you. :slight_smile:

I like how you called your library LDClusterMesh(). :wink:

Yes, that was the first thing that stood out to me!
Would you be willing to share some concepts of your custom Catmull-Clark subdivision? I’m particularly interested in how do you manage to keep the smoothed naked edges of individual mesh clusters adapted to smooth naked edges of the neighbouring patches, without holes appearing in the border regions?

I used some formulas from classical Catmull&Clark.

I still have just one mesh with different integers for each face. Each integer represent a sort of material.
Here some variation for the smoothing. Like C&K the idea is to addition coordinates.
New central point = center of face
New central middle edge = center of edge

I choose to keep the border or smooth then.
here a simple plane with 25 faces

Keep same borders

With triangles

I am sure the Rhinoceros Guru of Meshes are able to implement that.

It is also possible to apply the logic to lines connected


Ever see this one Mateusz did for Joris Laarman?


Another trial, inspired by Nervous last object

Round Gyroid