Variable fillet in GH?

well I would disagree here. You can see that you only hold positional continuity, but tangency should be minimum. The point is, you cannot match a double curve surface by taking curves, matching them and create a surface from continous curves. Matching a surface is more complex then matching curves. Sometimes it is even not possible to match two surface together within a given tolerance. A lot is determined by the smoothness of the surfaces temselves and the way they meet eachother. The stronger the curvature of them, the more difficult it gets.

What I ended up usually was to prepare the surface and matched them in a manual process later on. Grasshopper, even Rhino is lacking good matching capebilities for such situations. As an alternative most CAD platforms offer Autofillet functionality, which work sometimes better sometimes worse. But almost any Autofillet functionality increase cp count, even if this is not required. Therefore in my production data, I almost matched manually within Icem Surf. If you are experienced its done relativly fast. And if you consider filleting as a post process you only need to do it once or twice anyway. So I personally wouldn’t spend so much time on it within Grasshopper.

As a rule of thumb, prepare as much as possible automated (within GH) and do the rest in a manual process. This is a much more realistic workflow.

Thanks for that insight Tom, I do get your points. My situation is not real production, but rather 3D printing at home. For my parts to come out looking Ok my geometry can tolerate small (< 0.01 mm) gaps because the slicer software generates continuous filament loops that fuse together.

I do agree that true tangency (matching 1st derivitives) is a difficult thing. In my post I should have used the words continuous contact instead. Careful inspection of my parts shows that there is actually very little true tangency, but the arcs work well enough - and the part is small enough - that normal people won’t notice the angular mismatches.

Of course, like you said, if one is building airplanes such an approach won’t work. But that’s not what I’m doing these days.

Is actually not that bad! I’m a bit surprised, but I guess this is due to the fact that your surfaces are very close to planar and very smooth in itsself (Order 3 Bezier) .
Here I measured the tangent deviation:

Privately I do 3d printing as well. It of course really depends on the size and the tolerance. However an abrupt deviation is still noticable even on less accurate shapes. But yeah, you can be much lazier when it comes to continuity. In the end I often apply acrylic colors to my prints which do haveown thickness anyway… so yeah…

When I was working on airplane geometry we had what we called a Circular Surface. We used it to make the shape connecting a wing to a fuselage. It worked like this:

Consider a bowling ball being rolled between the wing and the fuselage. It touches each part at only one point. We gave the bowling ball a certain radius (told to us by the aero guys) and calculated the part of the circumference curve between those 2 points. Those curves allowed is to calculate milling machine cutter paths, even though there never was an actual surface created.

I think it would be nice if GH had an Arc option specified by 2 points and a radius. If it did, would that kind of arc with with a 2 rail sweep - meaning would/could it adjust it’s radius to maintain constant contact with each rail?

Aloha @Birk_Binnard, thanks for adding some refinements to the challenge.

I grabbed and adapted this bit from last month, using only surfaces, not closed breps. Pairs of the pot with each oriented spout . Some are reversed, most look correct. But I had to use ‘Reparameterize’ in one test case and not use it it another…? :thinking: (498.6 KB) (499.1 KB) (VERY SLOW!! ~2 mins.)


1 Like

Consider a bowling ball being rolled between the wing and the fuselage. It touches each part at only one point.

Do you mean Rolling Ball Fillet?

If so it is an Option on Rhino 6 + Gh’s Fillet Edge component on the M input.

RB (10.8 KB)

1 Like

Oh my! Yes, that is basically what I described. I had no idea there was something like that in GH. I will definitely check it out. Thanks.

Hey Joseph, thanks for your continued interest. I’m sure I’ll be able to learn things from your work.

RollingBall fillets are made for constructive parts which have no curvature at all. Rhino can deal with curved surfaces as well, but if you measure tangent deviation you often notice stronger deviation as well. The better command in Rhino is _BlendEdge. It also works global, so you can always apply it after baking. But automated cornerblend are usally crap. For printing its totally ok.
But still the initial thread is about variable fillets. @Joseph_Oster I’m not trying to prove that your solution is bad, the purpose of showing the tangent deviation is to show the real challenge on creating a fillet algorithm, which is holding tangency continuity. At this point I myself got stuck everytime, when I was implementing my own algorithms.

Tom - I can see how the Rolling Ball component works for connecting the edges of non-closed intersecting surfaces, but it’s not clear to me how it would work with the Spouts geometry. Spouts has closed curve intersections, and furthermore, due to the curvature of the vase’s outside surface, I had to bury the large ends of the spouts below the surface. I used this cheat because the ends of the spouts are flat.

Also - I work only with GH; I never had the patience to learn how to use Rhino. And I don’t think that’s going to change. I know a little bit about how Rhino works, but nothing even the smallest bit fancy.

Joseph: Your GH file completed in only a few seconds on my PC. It’s got an I7 8700 CPU running at 3.2 GHz with 16 GB RAM. I built it a year or so ago specifically for Rhino & GH (and HD video editing) and have been quite happy with it’s performance.

I noticed that your fillets had the same problems mine did when I tried your approach: most of them are concave, but some are convex. I tried to understand why that was the case, but was unable to grok it. I even tried using Bezier curves, but that didn’t work either.

That’s when I got the idea of a 2 rail sweep with a simple arc. I was unable to figure out how to get surface tangents for the 2 point & tangent option, so I brute forced a 3 point solution. That seems to be good enough for my purpose. And, much to my surprise, my solution is simpler than yours - which is something I never expected to see.

Grasshopper is a tool for automation. Its a visual scripting software to create geometry rather through parameters then by user mouse input. Usually mouse input is very good, but anywhere where repetition occurs this is limiting. So a it’s actually a tradeoff using numeric parameters instead.

Furthermore GH lacks the complete toolset Rhino offers which is another drawback. And Rhino is a great software but still lacks or weakly implements core functionality required to do surface modeling efficiently.

This requires to fully understand how a traditional way of modeling works. You cannot automate things if you do not understand how efficient and precise surface modeling works. This means you really should learn at least one CAD platform, and only use GH where it is beneficial.

Currently there are many other and better ways in filleting a shape.

I for myself had been in the same situations as you are in. I knew much about GH (at least I thought so), but had little knowledge to surface modeling. When I created my first real world geometry ( parts of an Audi A8 concept model) my recent boss sold GH as the new and better tool to create shapes. I remember that this project became a full failure, because me and my team took 3 weeks for parts an experienced surface engineer would require 5 hours at max with much higher visual quality. It was an absolute disaster! Maybe everyone has to experience such things by himself, but in the end you never know enough. So its always worth investing in learning more and more. Thats actually sometime I really like about my current job, which is actually rather Software Development. But the point is, you never finish to learn something. I can only tell you ,that you can fillet everything with the right tool and knowledge. Convex/Concavity really doesn‘t matter. If your fillet looks shitty almost always your base surfaces are as well! Shit in, shit out. So constant tweaking is a must.


You’re always so thorough and thoughtful with a practical bent @TomTom! That’s why your posts are worth the effort. Thanks!

For simpletons like me, here’s your wisdom distilled…(and the bullet points are of no value without your context)

  1. It depends…

  2. Choose the ‘right’ tool for the job

  3. Garbage-in = Garbage-out

  4. It still depends…

1 Like

You are absolutely correct, Tom, about the pros & cons of GH VS production level 3D modeling tools. I’ve read many of the postings that point out the limitations of GH VS software like SolidWorks & Catia. Programs like those exist for people doing real work on real products in the real world.

That is not my situation at all; I do 3D printing at home as a hobby and I make all my designs available online for free. So for me GH is the ideal tool because it lets me design things quickly, make quick changes, and produce parts that have an acceptable appearance.

I’ve had several situations where I tried to produce something, but simply was unable to do so. So I just gave up and started something else. Such is the benefit of a hobby. My son, who does work in the real world, pointed out on a few occasions how to use SolidWorks or Catia to accomplish what I was trying to do with GH. Needless to say I appreciated his input, but those are not products a hobbyist would have access to.

The Spouts part, although totally useless, has been the most complex geometry I’ve developed so far. Even though the fillet mismatches it has would render it unacceptable in the real world, it was interesting and instructive for me to go through the various stages of developing the fillets. And I was most appreciative of the help I got from this forum when I got stuck. So who knows, maybe this entire scenario will prompt David or someone to make some improvements or additions to GH/Rhino.

1 Like

Not sure it really needed variable fillets? It added aspects to the challenge I hadn’t considered, so various paths were explored, some forgetting “conflict resolution” dependencies that had been resolved earlier, others removing a choice that was presented by overlapping surfaces.

New ways are used here that might take closer inspection to see. Less subtle is the optional group to cut multiple holes in a single copy of the vase (yellow surface), along with a slight re-wire to show only the trimmed spouts, not the vase: (special case)

A clean (recreated geometry) “spout demo” is offered as source #3 on the left:

The following shows the code, except the part that trims the surfaces. (95.4 KB)

The complexity of orienting the fillet and trimming overlapped surfaces can be handled in advance, by trimming surfaces against each other and choosing which one of each pair to pass to the fillet algorithm.

This (below) increases the ‘Count’ slider from 15 to 60, trying to join the fillet surfaces, the trimmed spouts and the holed vase surface into a single polysurface (“Open Brep”). It works for the big yellow part but leaves 16 fragments (spouts and some fillets) apart, not joined to the single intended result. (103.0 KB)

On close inspection, it appears that these particular spouts are located more closely together than others so their fillets overlap? Which might explain the observed problem? So instead of fixing the model, I would first fix the input, more evenly spacing those internalized Pt_Spouts.

Thanks (again) Joseph for your continued interest in this one. That ray-traced image of yours is just terrific. Nothing I print will ever look like that of course - which is why I never looked into how to make fancy looking results like that. But while my printer is temporarily (I hope) disabled I may just do that.

I used your orient technique to further reduce the amount of computing needed to generate Spouts, but I am going to stick with my simple 3-point arcs for the fillets simply because they are simple, and, as I’ve said before, they should be good enough for a 3D printed part.

Your fancy fillet method shows just what is possible when you really want to make things correct. I’m still trying to understand all the steps you used - hopefully I’ll be able to do that before my brain short circuits.

These two versions are the same code (improved?).

The first is wired to open quickly, working on four pairs of intersecting surfaces. It’s a good way to see the effect of choosing a “quadrant (pair)” using a restored feature for that purpose, two zero-to-one sliders (blue group in yellow group). (116.0 KB)

WARNING!!! This second version (below) is wired to show spouts; it takes one minute and forty seconds to open on my old laptop. Notice that the pieces join to form a single “Open Brep” polysurface. There is a slight gap that could be fixed between the beginning and end of each fillet. The “Closed” loft option fixed it but Sweep 2 works better, except for that detail. (111.8 KB) (SLOW!!!)

It’s possible to get a proper thickening effect by applying these fillets to inner and outer surfaces, capping as needed. (not implemented!)

1 Like

Sorry to bump into an old thread. Would you be able to share an example of how to do so in Grasshopper? For me, specifying different radii at edge end-points would be sufficient functionality.


I’m not saying, I’m able to code something up, otherwise I would have. My point is just that such algorithm requires much more work and has much higher complexity. If I’m on computer having CAD, I might measure the deviation to show you the problems.