i am working with a rotationally symmetric surface in Grasshopper that hat a curved surface structure.
My goal is to turn this single-surface shell into a thin-walled solid with a precise wall thickness (around 1 mm).
Here’s what I’ve tried so far:
OffsetSrf / Surface Offset: technically works but becomes extremely slow on my geometry.
Mesh Offset: much faster, but produces a lot of undercuts because of the relief (e.g. picture). To fix this I need to use Shrinkwrap afterwards, but Shrinkwrap requires very careful settings to approximate the contour correctly, and is also slow…
Scale + Solid Difference: my current workaround is to scale the entire geometry down in X, Y, and Z and then subtract it from the original with a Boolean Difference. This is quick, but the wall thickness is uncontrolled, especially with overhangs in the Z-axis direction. The result introduces unwanted undercuts and inaccuracies.
Point-grid displacement (moving points along normals): accurate in theory, but calculation time is too high for practical use.
Dendro it works but is also very slow
So far none of these workflows are giving me a clean, efficient result.
My question:
Do you have any idea for a workflow that works reliable and quick? Are there reliable components or plugins (e.g. Dendro, Weaverbird, Pufferfish, Shrinkwrap tricks) that people recommend for this type of problem?
The problem is likely that the minimum curvature is close to or smaller than the offset you want to use. This is a universal issue, not just with Rhino.
There is somewhat of an advantage to use meshes in that voxels can be used in the offset to eliminate the problems of self intersections. If you cannot get the results with Shrinkwrap, you could try exporting to Meshmixer (free) if that does not hurt your workflow too much
Otherwise, if you can eliminate the small fillets / minimum curvature areas so that there is a sharp corner instead of a fillet, then you might have better success with the offset. Then fillet the edge after. Maybe that will work.
My workflow to create the surface looks like that:
First I generate a completely round, smooth base body.
Then I slice it at close intervals along the surface to get section curves.
On these section curves I use Divide Curve to create evenly spaced points.
I move these points inward and outward to create a kind of wavy profile.
From those points I interpolate new curves, and then I loft the curves to get the surface
The order of operations in this definition is actually quite important for me. I could probably try using fewer section curves to speed things up — that’s a good point I hadn’t considered until now.
Took a long look, and it is sort of like you got off on the wrong foot. I am an expert at that btw.
This one is reasonably fast, allows adjustments, builds the inner shell, etc. It also raises the bottom of the inner shell to make it easier to finish the vase.
Keep in mind, I am not saying it is perfect. This has probably been done thousands of times. I am sure there is a perfect one somewhere. . . . this is not that one.
For something like this I’d just make ‘two’ surfaces using the same method, then cap by lofting their naked edges; similar to what you did but not via scaling of the original surface. Literally neatly and adequately construct both interior and exterior surface. This can help as you can leverage the power of nurbs/curves before resorting to meshes. Do you have parts of the workflow where this shape (surface) is generated?
This can apply here for sure; howeve, also not necessarily.
Nonetheless, I should clarify that relying on the same or similar method for curve-to-surface generation should be helpful as it gives you nice nurby controls, which then allow for a smoother interior wall that doesn’t have to be undulated OR that can be but a lot subtler.
I’ve uploaded my current Grasshopper definition where I’m generating the surface structure.
As a starting point I’m using OpenBrep. The reason for OpenBrep is that earlier in the process I create several separate surfaces and then join them, so that the structure can be applied across all of them consistently.
To follow the suggestions from you all, I tried creating an inner offset surface — basically generating another version of the surface, offset inward by a small distance. That works more or less, but when I loft those curves I end up with an OpenBrep on the inside, whereas the original surface gives me an untrimmed surface(?!).
My idea was then to use SolidDifference to subtract the inner body and create the hollow shell (similar to what I did before with the Scale method). But SolidDifference just doesn’t work in this case, even though the bodies should intersect correctly. I don’t see any undercuts or obvious problems, so I’m a bit stuck on why it fails.
I also wanted to say thanks for all the suggestions so far — they’ve been super helpful to try out. I experimented with reducing the number of iso-curves I use for the loft, but if I go too low, then the rotational wavy structure doesn’t come through properly, and the loft doesn’t look right. So I’ve kept it at a medium setting: not extremely dense, but not too low either.
I’m applying the wavy structure on the inside surface, because I want to print the model in vase-printing mode (singe-wall 3D printing). So the inner and outer surfaces need to carry the same wavy detail
thanks for sharing that! What I don’t quite understand is why your version works so well, while mine doesn’t, because in principle they feel very similar.
In your definition you control the button by lifting the Z-coordinate to set the floor height, and I actually borrowed that idea from you for my own version. But still, my setup doesn’t behave the same way, and I can’t figure out why.
In which case you don’t need to model the inner wall at all. Just model it as a solid object and have your slicer only output the outer wall and no top layer. That’s my experience with Bambu Studio anyway.
Yes, I used Cura and I think that would work. Two things, though:
Cura always says that the model is “faulty” if you just insert a surface, so I don’t know if that’s the most elegant solution.
And I want to integrate things into the surface. That’s why it would be best if I had a solid.
I want to integrate letters. Testing out your idea at the moment — instead of creating a second wall, just keeping it single-walled and directly deforming the surface where the geometry is.
But honestly, I feel like I’m right at the limit of my Grasshopper skills here . I can get parts of it working, but I can’t manage to integrate everything cleanly — I always end up with unclean results.
Mine works so well because I am using a completely different paradigm to generate the ribbed surface. Right off the bat, the curve I generate has almost half as many nodes. The curves are then moved up in Z and scaled to fit the guide curve. They are rotated BEFORE they are lofted, this generates a lot less isocurves.
Now, if you want more control over the twisting, you can generate more stacked curves, manipulate those curves with other controls, like graph mapper, etc.
One of the rarely discussed secrets of GH development is “iteration”. I will brute force something, then when it is obvious that it is too slow, cumbersome, goofy, whatever, it is time to fall back, regroup and start again. After a few iterations, usually a pretty good version emerges.
If I am doing something one off, then yea, fine, rude, crude is okey dokey. But if I think I will be reusing the definition I will put more time into it.
It is like photographers, most people are unaware of all the post processing that goes into that picture we all think just flew out of the camera all ready to go.
The only tricky/annoying part in this example is the Item component which requires setting the i value(s) to the correct numbers to get the complete surface control curve. I use the (annoying) CherryPicker component for this.
Curious? You start with a BRep then extract the profile curve. Did the BRep come from somewhere else? Otherwise I would just poke the profile curve into the definition and skip all that extraction stuff.
Just seems a bit strange to me, maybe I am missing something?