How would you cap irregular profiles with a hemisphere?

Hi everyone, very new Rhino user here. I have created the below design (using Sweep2) and am really struggling to extend the ‘pipes’ and cap them with hemispheres. I have tried several different approaches and the latest uses Loft and Revolve for the caps. The result is messy and not the smooth profile I am after at all. Does anyone have a better suggestion? Thanks so much in advance for the help and apologies for the request from a newbie!


It not obvious how hemispheres should cap your shapes. Perhaps you could provide a simple sketch.

1 Like

Hi David, thanks for the suggestion. Hopefully the sketch below gives a clearer impression of what I am attempting to model. Any help would be very much appreciated as I have exhausted my (limited) knowledge of what tools I could use in Rhino

Dear @Ozzy
if you build proper curves - and use the same structure for the flat section as for the wavy-Section you can build the cap with a simple
first surface edge
additional curve
second surface edge
options: normal, match start tangent, match end tangent

otherwise you have to handle each of the rips as a separate surface / cap / 4x above workflow…

check the control-point structure of the curves - to build them i used the construction on the red layer.
check the curves
try to redo above workflow with the curves in my file.

a good learning resource are those trainingguides:

does this help ?
kind regards - tom

rips_sphere-like-cap_v2.3dm (266.8 KB)


Dear @Tom_P, thank you so much for the suggestions. I’ll certainly study your file and the training guide, and report back hopefully with the completed model!

in v1, you will build 3 curves that touch at the apex, then loft and match srf to get your continuities.

in v2, you will build a helper surface that is rotated 90 degrees and then use a blend surface with history. Adjust as needed to get your proper shape, then trim it off flat.

1 Like

Hi Kyle, the two alternative approaches are really interesting. I’ll try and do both for practice - thanks very much for the suggestions

One (simple and in hindsight, obvious) error I was making with loft was to select the curve rather than the polysurface edge. This prevented me from using the ‘match start tangent’ option. Sharing in case other beginners make the same mistake!

Hi @Tom_P, quick follow up question if I may. How did you create the curve profile from the ‘constr’ layer? I tried to do the same with the _CurveThroughPolyline command but the result are separate curves. Thanks again for the help

how to get the repetitive construction as helper to draw the curve?

the main idea is to create some construction for point-Snapping, that will help you get a repetitive curve…
with this “helper” draw the final curve…

i can t provide an exact workflow… something like this:

a first quick
_curve (degree = 3)
to figure out, if this little amount of CVs (control vertices / points) are enough
move CVs to fit the design…

now extract one part / half of a wave and multiply it, by making sure, symmetry and repetition fit:

_line (with snap to points) (the chamfer / non rectangular part…)
_copy / _arrayLinear

then i drew the final curve based on the construction done above:

_curve (degree = 3),snap to endpoints

finetune the curve ends:
i drew one element more then needed on both sides
_split (point) snap to quad…
some point edit with gumball to have nice and symmetric ends…

to get the curve with the flat part:
turn on control points
set the z coodinate in world to the same value…

1 Like

remember sometimes you have to build a big surface to get the small part you actually need after trimming…

think of it a little like building a sheetmetal part on an english wheel then trimming out your shape from the bigger sheet.

(most of my Nurbs construction reference paradigm comes from sheetmetal work on old cars)

1 Like

Thanks again Tom, you have been very generous with your explanations. If I could bother you once more though - I tried to replicate your work but failed to Loft the profile of the curves. It seems like the edges I have created (top of the below image) are separate and JoinEdge fails on account of ‘unable to find overlapping intervals’. Any last suggestions you wouldn’t mind sharing?

Thanks Kyle, visualizing it as a piece of sheetmetal to be manipulated is helpful!

i think i can not help you by the screenshot.
please post the file.

did you draw one single _curve for all 4 waves ?
this will result in curve with a single segment, not a polycurve (that has multiple segements)

@Ozzy for the workflow with the loft to work (in this case), all curves (or edges) must have the same (nurbs) structure.

this is not the case for the lower curve in your file - the one that is mostly straight.
you can use a copy of the wavy curve, rotate or mirror it, then use _setPt to straighten the inner part (set all CVs to the same (y?) value.
to get nice “poles” - the point where all the curves meet:
this point must be exactly the same for all curves.
and the curves should end tangent towards a common (local construction) plane.
you might need _matchSrf in the end to fit the surface(s) more precisly.
hope this points into the right direction.
kind regards -tom

1 Like

Hi @Tom_P, that has done the trick! Thank you so much for going our of you way to help me. I have been really impressed with my first interaction with the Rhino community and hope to be able to contribute in a similar way one day.

For other beginners, a couple of things I have learnt during this project (apologies if they are obvious):

  • _CurveThroughPt (with degree=3) is a really versatile way of creating curves that can be easily manipulated later on, especially in conjunction with _SetPt
  • Using the match tangent option with Loft requires surface edges rather than the original construction curves to be selected (obvious in hindsight but a source of a lot of frustration!)
  • Matching structures can be more readily created with edges that have the same underlying structure (nurbs)
  • A polysurface can be turned into a surface (not sure if this is the best way or even good practice…) by exploding it and then using _MergeSrf on successive pairs

Thanks again for all the advice along the way!