This article is part of the basics of Computational Design series. Even if you don’t use Grasshopper or Dynamo every day, understanding the fundamentals can help you spot where they might be useful in your work.
Part 1 : The three vital numbers in computational design
Part 2 : A Beginner’s Guide to Curves in Computational Design
Part 3 : How Surfaces Really Work in Rhino and Why That Matters
Part 4 : What Are B-reps in Rhino, and Why Do They Matter?
"Rhino is a surface modeler, it's good flexible but not as good as other solid modelers"
That’s what a tutor said in an online Rhino masterclass I took a few years ago. And for whatever reason, it stuck with me.
At the time, I had no idea what he meant.
After all, if you draw a box in Rhino, it tells you it’s a solid. You can even ask it for a volume.
So… how is it not a solid?
It took a few more years of using Rhino daily before I finally understood that point. Rhino doesn’t build solids the way I thought it did. It builds surfaces. And if those surfaces meet exactly, Rhino treats the result as if it’s a solid. But really, it’s just a bunch of surfaces wrapped around empty space. That means the inside of it is actually hollow.
It’s a small different but an important one if you want to understand how Rhino actually treats geometry. Which brings us to today’s topic: so-called “solids,” or more accurately, B-reps (pronounced bee-reps).
What is a B-rep ?
B-rep is short for Boundary Representation. It's a common way for CAD software (including Rhino) to represent 3D shapes.
A B-rep can either be a single surface or a poly-surface (multiple surfaces joined together). For Rhino to create a valid poly-surface, the surfaces must share at least one edge. And yes, that means surfaces are technically also B-reps.
Closed and Open B-reps
Rhino puts B-reps into two categories, closed and open.
A closed B-rep has no free edges. That means every edge of every surface is shared
An open B-rep has at least one free edge.
This matters more than you think. Rhino expects edges to be mathematically exact (within the model’s tolerance). A tiny gap of even 0.00001 is enough for a B-rep to “open.”
It sounds simple enough: “Well, just make sure everything’s closed.” But that’s easier said than done, especially with complex shapes. Small gaps are easy to introduce, and once they’re there, Rhino stops treating the object as a solid. And you have the amazing job of finding a small gap in a sea of edges.
Rhino is flexible, but this is one of the trade-offs that comes with working in a surface-based modeling environment.
Rhino’s Many Names for B-reps
Once you start working with B-reps, you’ll notice Rhino doesn’t always call them that. For example, even though a surface is technically a B-rep, Rhino will still label it as a trimmed or untrimmed surface.
Even when you extrude a rectangle, Rhino calls it an "extrusion", even though it's a "solid" or a "b-rep" or even a "polysurface"
This is made even more obvious if you ever try to reference this back in Grasshopper.
Whether it’s a surface, box, polysurface, or extrusion , they’re all B-reps under the hood. Rhino just gives them friendlier names depending on how they were created.
Using B-reps
Okay, so far we’ve talked about what B-reps are made of but why even do this ? Why treat a group of surfaces as solids ?
It’s because that treatment gives us a whole set of solid operations. Like calculating volume, merging or splitting them. You can even explode them into individual faces, edit those faces, then merge them back together. You get an incredible amount of flexibility when working with them.
So, let’s look at a few functions where this becomes really useful. These are ones I use almost daily.
Splitting
Splitting B-reps works almost the same way as splitting surfaces.
The difference here is that if you split a closed B-rep, Rhino tries to keep the result closed too. That always means it generating a new face along the cut.
Let’s run the Split command on both the box and the rectangle.
Notice how the box gets an internal face where it was cut. If this were just an open poly-surface, you wouldn’t get that. Rhino tries to keep the results of a split, so if the original was a solid, it does its best to return solids. Sometimes it works, sometimes it doesn’t, especially with more complicated geometry.
Solid Operations
One of the biggest benefits of working with B-reps is that Rhino lets you run solid operations on them. Things like union, subtract and intersect. Even though a “solid” in Rhino is just a bunch of joined surfaces, Rhino treats it like a single block of geometry when doing these operations.
You can also run edge-based commands like fillet or chamfer, even though you're still technically working with a shell of surfaces.
These are things you can’t do with open b-reps. The nice part is that you can still explode the "solid" into individual faces, tweak what you need then re-merge them later again.
That kind of flexibility is one of the reasons B-reps are so powerful in Rhino.
But b-reps are not true solids
Let’s go back to that idea:
"Rhino is a surface modeler"
We've sort of answered this question now. Because what that really means is Rhino is designed to make and edit surfaces, not solids. B-reps can behave like solids but they’re still just a group of surfaces. Since B-reps rely on perfectly joined surfaces, even the tiniest gap can cause Rhino to stop treating the object as a solid.
That means any of the solid operations we saw earlier (splitting, unions, filleting, etc.) aren't always robust. You might end up with open geometry when you thought it was closed.
In contrast, solid modelers like SolidWorks or Unreal Engine use a different system called Constructive Solid Geometry (CSG). These programs build objects by combining simple shapes like spheres, boxes, and cylinders. Since those shapes are always closed, you don’t need to worry about naked edges or missing faces. Using primitive shapes at the start also makes CSG more robust when it comes to Boolean operations.
And because it only needs to store the history of how shapes were combined (not all the surfaces), it can even be lighter in file size. Well, the down side is that you can't readily edit the faces of those solids.
One isn't better than the other, it's just a different approach to modeling and creating 3D objects. What Rhino lacks in robustness of solid operations, it makes up in flexibility.
Why does any of this matter ?
If Rhino already treats B-reps like solids, why does any of this matter?
Because when something breaks, like when an intersect fails or your volume comes out weird, you want to know how to fix it. And more often than not, the problem is that the geometry wasn's what you thought it was.
That “solid” might not be closed. You might have left a gap in the last operation you did. Maybe you just need to cap your geometry. Understanding how B-reps work won’t fix every issue, but it gives you more control over what’s actually happening.
And in a program like Rhino, that control can be the difference between guessing and knowing.
Thank you for reading, I hope you have a better understanding of how B-reps work in Rhino.
Consider subscribing if you haven’t, it helps me know my work is useful.
Thanks Brendan, for a clear and concise explanation of something I "thought" I knew, but I didn't. Keep such email coming, and thanks for your good work!