IsoGrid pattern on BRep in combination with internal lattice - searching for the right approach

Hello everyone,

this is my first post here and I am quite new to Rhino / Grasshopper. I have hit a wall with my problem and do not know where to further look to solve it as I am missing a good overview of all features in Grasshopper. In essence I am asking for a way to do things the best way that will give me the least headaches down the road. This post is quite long as I try to explain where I am right now. So please bear with me.

I am designing lightweight structural parts that will in part be 3D printed. To achieve maximum stiffness per weight I use internal lattices (via Crystallon) and surface patterns such as IsoGrids (basically equilateral triangles). Those will be created in Grasshopper, while the geometry (BReps) is created in external CAD tools for now. This means I don’t have absolute control over the created surfaces as I would have in Rhino.
The surface patterns and how to connect them to the lattice are giving me trouble. When created they should achieve the following:

  • conform to the given geometry (either precisely or to a given tolerance)
  • span seamlessly over the whole BRep or polysurface and not just a single surface
  • deform the pattern minimally
  • create a continuous pattern
  • be able to move pattern on surface (to conform to hard edges or similar important geometry)

I have come up with a few methods. To better show their effect I am using a mockup of a bicycle fork, especially the left blade.


1. Contours

Using contours in Grasshopper that dissect the entire BRep into curves that always intersect at an 60° angle yields the IsoGrid pattern. But it isn’t continuous (the contour “rings” end with no further connection (the pattern is not closed) e.g. on the fork blade) and can get warped beyond recognition.

2. Surface Morph

Using Surface Morph I can morph a 3D pattern onto a surface. This works fine for a single surface. I could repeat this for all other surfaces, but the IsoGrid would not merge precisely at the surface seams (at least not without rebuilding all surfaces to have the UV count I guess). The pattern looks good and I can directly define the strut geometry before morphing. But I do get non-manifold-edges in the resulting BRep and can’t select where the pattern should start on the surface (although those problems could be fixed I guess). This approach seems viable to me if surfaces do not need a continuous pattern (e.g. blade and shaft are connected by the crown, which is too small for a printable IsoGrid and thus will be made solid, which enables blade and shaft to have independent patterns).

3. Meshing

Kangaroo’s MeshMashine tries to produce equilateral triangles over the BRep surface. If I could map the created mesh edges to follow the shape of the BRep, this could be a viable solution. It also seems to me that very coarse meshes can’t be generated.

Spiral Curves

I like the approach of #2. The pattern could be created directly on the surface (maybe spanning even multiple surfaces?) by two spiral curves with opposite turn direction that are then repeated and offset in z direction and additional vertical curves. Could this be a feasible solution?

Connecting Lattice and IsoGrid

To thicken wireframe lattices I use Dendro (Mesh / Cuves -> Voxel -> Mesh) and CytoSkeleton (Curves -> Mesh). To create the final part I need to connect multiple lattice / skin components together. Doing this with Dendro in the voxel stage is quite easy. Although I think using meshes directly would produce more accurate results (and smaller meshes!) as there would be one less conversion between formats. I don’t know if it is possible to connect touching meshes together, though.

To break this whole thing down into a single question: What approach would you take given the listed requirements?
I hope I made myself clear and would like to thank you for reading through all of this.

Kind regards,
Mo. (116.6 KB) (118.4 KB)

It sounds like you’ve got quite far already. I think a kangaroo/mesh machine based approach could work. Perhaps you could have a stage after the output of a kangaroo process where you could bake out points, and then manipulate them manually (to achieve sharper edges/tolerances around specific parts) and then reference them back in to do the geometry creation. I’m sure others on here will have more ideas.

Maybe take a look at something like this;

Thanks for the reply. I have dug through Kangaroo examples and a few posts on this forum. I often encountered the use of a convex hull plugin. But I don’t think this would work if there were any holes in my geometry.
What I’ve got so far in Kangaroo:

  • use sphere packing to uniformly divide a mesh into points (this provides cleaner results than if I were to use MeshMachine for direct mesh generation, but no mesh)
  • pull the points back to the original geometry

Now I’d just need to connect the points into a triangle mesh. Proximity 3D does a pretty good job when the points are not on the edge of the geometry. To reliably mesh the points I’d need a way to know the shortest distance on the mesh for each point to its neighbors. This way I could take the 6 nearest points and connect them together. Is there a way to check for such a thing?
Another way would probably be to let Kangaroo relax a generated mesh around my geometry with an edge length goal. I’ll have to try that.
If I were successful in getting a nice mesh, how could I pull / project the mesh edges onto my geometry, so that they follow the shape of it?

sphere packing:

image (22.1 KB)


Did you have any sucess using kangaroo? For fixing certain points, you can use the anchor points goal in Kangaroo and set the strength to something like 2000. A usefull way of selecting points might be to use points from naked edges (or pick points by drawing a curve or using some other method).
Perhaps you could use a very even quad mesh, and distort your parttern over each quad (similar to a box morph).

Almost three years later, and not so many people seem to attempt this… probably because it’s very difficult?

Still, I have to ask… has anyone managed to produce a generalized solution for breps that they are willing to share?