I would like to explore voxel modeling in Grasshopper. I would like to make something like a gyroid and then 3D print it so the voxel density would have to be fairly high so it doesn’t look chunky. It should also be able to convert the volume to meshes so I can generate a STL file. Is there any particular plugin you can recommend that you had a good experience with?
Hi!
You need iso-surfacing, or actually voxels?
There are a fairly good amount of similar threads…
Anyway, with just millipede you should be ready to go…
You need iso-surfacing, or actually voxels?
I probably do. I just need to set the density of each voxel but at the end I need a mesh.
Anyway, with just millipede you should be ready to go…
Thanks I will have a look.
Thanks for that. I also wanted to explore SDF for these type of shapes and I thought I would have to use something like nTopology.
Left marked component converts Rhino geometry in SDF, right marked component converts SDF to mesh. This SDF2Mesh (right) component is very critical, bad settings tends to calculate volume until next year. So study this component first.
A bounding box is also required for mesh calculation.
So if the BBox intersects only half the object, only what lies inside BBox is calculated.
This is minimal setup to convert RH_Object to SDF to mesh.
From my side, that is the most important.
Hi Mark,
happy to see that Axolotl has already been suggested here. To generate Gyroids, you find the TPMS component in the group “3 Lattices”. Gyroid is the default but by right-clicking, you can switch to other types of triply periodic minimal surfaces. There is also TPMS_P for polar and TPMS_S for spherical coordinate systems. You can then convert it to a shell (under “5 Modifications”) if you only want a thickened surface and finally plug the resulting D into the isosurfacing component, as suggested by eddi.
Hi @mathbern. I’m having a lot of fun with your plugin. It’s great that you can do this stuff inside Grasshopper rather than having to use a separate application. Is it possible to blend one lattice into another over a distance?
Hi Mark,
thank you, I am happy to hear you like Axolotl!
Yes, blending two lattices is definitely possible. In the tab “5 Modifications”, there is the Blend component. It takes 4 inputs:
- Distance Object A to blend from
- Distance Object B to blend to
- Distance Object C to use as the ramp field; inside of C will be A, outside will be B, at 0 will be half-half
- Blending Distance
You can then right-click on the component to switch between a linear and an exponential ramp.
A, B and C can all be any distance object. You can e.g. use a cylinder for C to create a radial blend.
Note that in your image, the two TPMS on either side of the blend also have a varying thickness (towards very dense in the center). You can do this with Axolotl too using the Overlay component.
tpms_blend.gh (15.6 KB)
Hey Mathias,
The Axolotl plug-in is really an incredible tool. As far as I’ve seen it’s the only Plug-in that utilizes implicit fields to create lattices in GH? I’ve been messing around with it and have two questions.
-
Compared to using an Axolotl Primitive, trying to intersect an Axolotl Lattice with a ‘distance wrapped’ geometry takes an incredibly long time (in some cases 30-40mins). Besides lowering the voxel size, are there some things to keep in mind when trying to incorporate an external geometry using the distance wrapper component?
-
Is it possible to change the isovalue along a direction or based on the distance from an attractor point?
Hi Nolan
thank you very much for your kind words! I am happy to hear you like and work with Axolotl. It is not the only plug-in, there are also e.g. Crystallon or IntraLattice with similar functionalities. But to the best of my knowledge, it is the most complete set of SDF components (truss lattices, TPMS, primitives, Rhino geometry, etc.).
To try to answer your questions:
- intersecting a lattice with a geometry wrapper is slow because of the geometry wrapper. if the geometry is e.g. a mesh, it calculates all the distances from every point to ever face of the mesh. To speed things up, either (as you note) lower the resolution of the point grid or try to optimize (reduce) the resolution of the mesh / trim parts of the mesh that are outside / split the mesh in multiple meshes and create a union of the results / … There is probably some potential for optimization (e.g. assign the mesh faces to octree cells and only check the ones nearby), but this is still on the todo list.
- It is possible to change the isovalue, but only globally. To have a directional (linear, radial, or any other gradient), you can use the Overlay component. This basically does
A+f*B
(whereA
andB
are the Distance objects you plug in). IfB
is an Axolotl Plane, you get a linear gradient, ifB
is a sphere, you get a radial gradient from the sphere’s center as attractor point. ButB
can be any other Distance object as well!
If you work with TPMS, there is also the TPMS_D component, which let’s you modify the wavelength locally, instead of the isovalue.
Hope this helps, let me know if you have more questions!
Cheers, Mathias
Hi Matthias,
First thanks for the plugin, it is fascinating work. Do you have an example of TPMS_D component in use where the density is varied? Thanks
Sorry, very late back to the discussion, only saw this now…
The TPMS_D component was developed after a discussion with a medical implant manufacturer. They wanted to density the lattice around certain regions where e.g. fixations / screw holes were located.
The advantage is that it does not affect locally the ratio between solid and void, but changes the wavelength according to a “ramp”, which is basically another distance object. If this object is a plane, the wavelength changes in a linear gradient perpendicular to this plane (no change where the plane is located, smaller on one side, bigger on the other). If the modifier object is a cylinder (or a union of multiple cylinders), there are local changes with a radial gradient.
Hope this helps if anyone ends on this old-ish thread.
There is also a new plugin from 2024 by Daniel Piker