Extracting only the outer & visible surfaces of a complex model

Hello everyone,

My basic point is to reduce the file size of some complex 3d models. Sometimes i just need to show these models inside an arrangement, or i just need a render but considering a full-detailed machine, motor, or anything that is modelled for production has many unnecessary surfaces and block instances inside them.

So when i do not change anything and need to use many of these complex models together, naturally fluency of rhinoceros is decreasing dramatically.

Also i am facing this issue mostly when i need to import these models to rhinoceros (e.g. as a step file). After importing mostly i find all surface components defined inside a single “default” layer, which doesn’t allow me to just close unnecessary layers, do my job and live a happy life.

Doing this “clean inside” thing manually consumes a lot of time and requires carefulness, so i am looking for a fast way to simply extract only the outer shell of a complex and full-detailed model.

  • I have tried using drape command, which resulted in funny scenarios.
  • I have tried to use _SelVisible from all 6 angles and again ended up with a result which requires manual deleting/selecting/hiding process. Also there were many small missing surfaces compared to original model.

So i would appreciate any advice/solutions. Also if there is a way that Grasshopper might be useful, im excited to hear about it.

(I am using Rhinoceros 6)

Hello - are the surfaces to extract typically tangent to one another?

-Pascal

I was in a similar situation many times, and the main problem was usually an architect or draftsman who simply didn’t exactly understand how to export geometry.

Hello Pascal. Actually i didn’t get what you mean by “tangent to one another”. Do you mean that they are touching each other by edge? Also i am adding a sample picture about one of the models.

1 Like

And that yellow thing is one object?

Created in which software?

Solidworks has some sort of a simplify command.

Most probably they have been created in solidworks, but there is no way to explain it to the person who models and sends that to me sometimes.

I just don’t want to have a 20TB hard disk and the knowledge of all 3d modeling software to solve all problems by myself :slight_smile:

Hello - I may be able to help in the case of a shell where all the faces are tangent or nearly tangent - ExtractTangentFaces.rhp (40.5 KB)
This plugin will find all tangent faces (with angle tolerance set at the command line) in a single polysurface - it will stop when it hits an edge that is not tangent - as with one side of a thin sheetimetal solid (which is what it was designed for). It may help grab the outer surfaces of the castings in your image - worth a try.
You’ll need to unblock the plug-in (in Windows) then drag and drop it onto Rhino. The command is ExtractTangentFaces.

-Pascal

1 Like

Thinking out loud here - if one were to use a Drape surface over the assembly, would it be possible to intersect that surface with the assembly and then script a command to extract all of the surfaces that are touched? Perhaps repeating the routine a few times using Drape from different directions?

Why don’t you post a file?

This is a very interesting problem and has lots of applications in Architecture. Very often, complex BIM models are imported into Rhino and we need to create only an outer shell, often for 3D printing or environmental analysis. It’s a difficult problem to solve, but I would be interested in any novel approach. The tangency finder is interesting. I’m also thinking that something like a convex hull algorithm could be an interesting approach. Let me know if anyone figures this one out!
Best,
Andy

I was trying out an idea for this recently - a sort of inverse of an isovist.
So instead of finding the volume reached by rays projected out from a point in an interior, taking a sphere around an object and projecting rays inwards towards the center.

It’s simple and fairly fast to calculate, since for each point of the sphere it just needs to find the first intersection of a ray with the objects. Because the rays don’t cross, the resulting mesh shouldn’t have any self-intersections as long as it doesn’t have holes all the way through, and the sphere is centred inside the input.

wrap_project.gh (9.3 KB)

It works better for some shapes than others - protruding features can cause ‘shadows’ like you see on the wing mirrors.
For shapes with lots of thin curving features this approach works really badly-


Perhaps there could be some way to combine several of these projections from a few different sphere centers. Interested to hear if anyone has ideas!

To get a tighter wrap, I was also trying these inverse-isovists as an initializer for the TriRemesh function. It’s faster than starting the remeshing from just a bounding box or convex hull since it is already quite close to the target shape in most places, and it can pull in to get the details the projection misses. It still has problems with thin features below the resolution of the mesh though, like the sharp edge at the back and the details inside the wheel arches.

The problem is selecting the surfaces on the outside of complex models has been around for about as long as complex models have been created. I’d be very surprised if by now there are not some papers/disertations/these describing algorithms for selecting only the outside surfaces. If not then this is a prime area for research. A related topic which has been extensively studied is determining the convex hull of an object.

Is not it possible to make an automated “_SelVisible” command that will look at the model from 26 different directions to try to select all visible surfaces? I mentioned 26 directions, because this is the number of views if you look at an object from the main 6 sides plus the remaining 20 intermediate directions at 45 degrees each.
Obviously, complex models should be exploded prior that, otherwise the “_SelVisible” command selects even the hidden surfaces that are part of the polysurface itself. And automated “Explode, then Select visible, then join the selected surfaces (or automatically move them into a dedicated layer)” would be welcome, too.

Advanced Select visible.3dm (258,4 KB, Rhino 7 file)

2 Likes

Do you think it would be possible to do similar approach using iterative Convex-hull 3D? And gradually subdividing faces by projecting their face centers to closest mesh point.
Just wondering if it would break for sharp faces like the one you post with lizard and whether this technique would require mesh refinement at each step.

Similar to this paper, I believe you know it better:
https://ranahanocka.github.io/point2mesh/

lizard2

3 Likes