How to create a seamless multi-domed cavernous space

Dear Rhino friends,

How would I close the top of this dome-like structure easily without creating harsh intersections between the ceiling and the walls? I would like a smooth continuous curved surface that’s closed at the top.

  1. I have used loft but I don’t know how to close a loft nicely.
  2. I have tried NetworkSrf but I don’t know how to create a crossing curve that perfectly intersects the curves in the opposite direction. They always “miss by a bit” because of the deviation between the control point and the degree-weighted curve. (I also don’t know if the input curves are too complex for networkSrf.)

Does anyone how to close the ceiling of this cave without introducing intersection or seam marks? The curvature of this cave varies but at no point is it at 0 except at the absolute maximum points.

Here is how it looks like from the top:


and in 3D:

and a lightweight version of the 3dm file is attached here:
For RhinoForum Question CS2 EXTENDED 2023 W37+ CAVE MODEL.3dm (4.3 MB)

TYSM!! :slight_smile:

Creating smooth, completely closed volumes from curves is quite difficult to do (in the general case).

Loft is good for making surfaces from contours, like here, but it’s usually difficult to create a smooth cap for the resulting surface. You might be able to use the Patch command on the open surface edge – this can work well when the opening is planar-ish and not too complicated.

As I understand it, Patch (and NetworkSrf) produces a numerical approximation, so with complicated geometry you can have issues joining the resulting surfaces, and it has only tangent continuity. That’s often a problem for me, so I don’t use them much; but for some purposes it’s fine.

For things like product design, you often need to use tools like BlendSrf to get nice geometry with higher degrees of continuity. That can be a deep rabbit hole though. There’s no simple way to cap a lofted surface with the equivalent of a “self-blend” (or if there is, I’d love to know!)

Since Rhino 7, another option in some cases is to use SubD surfaces from the start. Unfortunately, Loft doesn’t (yet?) have an option for SubD output, but if it did, then it would be quite easy to add smooth caps.

Hey there bobtato @bobtato, thank you so much for the reply, I really really appreciate it :).

Haha I get the frustration. Okay in this case I don’t mind trying out subD, because, like you said, I heard of its great features too. How would you point me forward to using subD from this juncture if I’ve never used it before? I haven’t really been able to “get” an intuition for subD like I have w NURBs stuff.

Once again, thank you so much! It means the world to me!

I’m not an expert on subdivision modelling, especially in Rhino, but in my mind it’s a much easier way to do “freehand” modelling where accuracy isn’t critical.

If your contours came from accurate survey data or LIDAR, then manually tracing them would throw away a ton of useful measurements, so I wouldn’t suggest that approach if you were making, say, construction drawings.

I’m assuming this is a fictional map or rough sketch, though, and if you just need a clean model that’s “about right”, then I’d suggest:

  • Create a SubDBox of about the right dimensions. For the subdivisions, I used 5x10x2 here – the goal is to always be working with as few faces as possible

image

  • Use cmd-shift-left click to select individual faces, edges and/or vertices, and move them around using the gumball to roughly match your contours

image

  • Where you need more detail, you can SubDivide the whole object or, preferably, use InsertEdge or ExtrudeSubD to add faces just where you need them (with faces selected, you can also use the gumball to extrude)

image

  • Then repeat the process until you’re happy with the result…

You can model pretty much anything using the tools in the SubD menu, and the geometry is usually much nicer. You don’t have all the technical control you get with NURBS, but you also have less technical stuff to deal with (like the twisting, bulges and self-intersection you got from using Loft).

One way to think of SubD is like a mesh, only instead of triangles, the faces are individual NURBS surfaces, and they’re constrained to have G2 continuity with their neighbors. So you don’t need as many faces, and it’s as smooth as a NURBS model (almost).

Or you could say, if NURBS is like drawing with a graphing calculator, SubD is like using A@*be Illustrator.

Dear @bobtato,

AHAHAHA THANKS SO MUCH. THE ANALOGY IS REALLY FUNNY :")

Rly, thanks for the help! Blendsrf is indeed really powerful! In the end I abandoned the SubD approach for a NURBS and Blendsrf approach because it was much more mathematical and precise. It’s kinda strange that such intricacy actually allows it to be modeled faster and more creatively for me right now, according to spec. Though I did watch some additional videos on SubD and do get what u mean and also it’s potential!

Here’s how my space looks like:


I just wanna say thank u so muchhh for the super detailed, surprisingly fast and kind response u gave me. I really learnt a lot and u have been a great help! :slight_smile:

I have some other questions too, if u don’t mind answering them! (Btw I just discovered the power of “History” and wow that is so lit :fire:)

I have another question though, is there a way to reveal the multivariable mathematical equation behind what the NURBS object is showing, and is there a way to model the next surface using a mathematical equation, so that the continuity will be much higher or even completely continuous?

That’s a big question! The short answer is that, no, there’s no Rhino command to see those numbers directly, but the NurbsSurface / NurbsCurve classes in the RhinoCommon API can be used to extract the control points and knot vector(s) for an individual NURBS surface (or curve), and you can print those from a Python or C# script fairly easily if you are into that sort of thing.

That’s probably not much help though, because anything you could easily do with this information, Rhino already has a way to do. But it’s worth at least skimming the details of NURBS, to understand how Rhino thinks. This is the book you’d want to check out – the knowledge does exist online, but it’s hard to get your arms around.

If you are not worried about the copyright implications, you can think of any NURBS curve as the path taken by Spider-Man swinging through a city. The control points are the objects he swings from; the degree of the curve is the number of webs he’s using at any one time (assuming he has plenty of arms); and the knot vector is like a list of the exact times when he disconnects from one building and gloms onto the next one.

If the degree is one, then you just have a zig-zag as he travels directly from one building to another. With degree 2 or “tangent continuity”, you have a curve whose direction changes smoothly, and never touches the control points. With degree 3, not only does the direction change smoothly, but also the rate of change of direction; this is “smooth” for most purposes. For various reasons it’s not useful to go beyond degree 4.

Individual NURBS surfaces are the same thing, but with a grid of control points instead of just a chain. Because that has a rectangular topology, like a rubber flag, Rhino has to stitch a bunch of these together and then trim the boundary to make make anything more complicated. This is where a lot of issues start to appear since some basic operations only work on single / untrimmed surfaces. It’s informative to use Explode and Untrim to take stuff apart and explore how all this works. You can also use PointsOn to reveal NURBS control points and see what happens when you move them.

(but it doesn’t show you knot vectors or control point weights)

Dear @bobtato,

Thank you!! I appreciate your help! Yes, whatever you’ve described is very helpful, and lines up very well with what my design computation professor, Dr Jason Lim, taught us in school. Very cool analogy though! And that’s a lot of math! Thank you for the help! You’re so kind.

Ariel :slight_smile: