4
$\begingroup$

I am dealing with a very large 3d scanned mesh that has a lot of unnecessary detail:

enter image description here

I am looking to create one coherent mesh that is only the outer surface of the city model, without the "inner" and "below surface" vertices. (Imagine it like a layer of fine dust settling on a city)

My first approach was to manually apply a selection from top view, but the process is tedious and selection is too inconsistent. A lot of people on here asked to delete the "interior parts" of meshes. However the proposed methods like Blender's "Select interior faces" are not really applicable to my case.

A member of the SideFx forum called "zarti" provided a clever way to delete inner parts of meshes in Houdini, that uses a ray node. I tried to alter this method to work on my model with Blender Geometry Nodes (Raycast Node). It seemed very simple but I was not familiar enough with the logic of the Blender Geometry Node system.

The basic idea is to cast rays onto the models from -z direction and delete every face that does not get hit.

enter image description here

Of course this method would be still too brute and would need some refinement, like some kind of angle deviation or "diffusion" to hit all the relevant faces.

In that respect I also tried methods of baking different maps (Diffuse/Shadow/AO) onto the vertex color map and select/delete vertices accordingly, but the results were very messy.

Maybe someone with more insight into the Blender Geometry Nodes System could help me to find an elegant solution for this problem.

$\endgroup$
2
  • $\begingroup$ If your question has been solved, please be so kind and mark the answer that contributed to the solution as "Accepted answer" so that this question will not continue to be displayed as unsolved. Thank you! Here you can find more information: What should I do if someone answers my question?. If you still haven't gotten a solution to your question, please be kind enough to address it. $\endgroup$
    – quellenform
    Commented Oct 24, 2022 at 9:27
  • $\begingroup$ Just curious: could the question be answered or is there a reason why it still appears as unsolved? $\endgroup$
    – quellenform
    Commented Dec 2, 2023 at 9:53

1 Answer 1

10
$\begingroup$

Simple scenario

Filter Faces using the Normals

enter image description here

Get the position of the camera with Object Info.

Subtract this position from the positions of the individual faces.

If the dot product of the normals of the faces and this vector is greater than $0$, you know that the faces do not point in the direction of the camera.

Complex scenario

Filter hidden geometry

OK, you didn't want to share your mesh unfortunately, so I can only assume it works for you too, but you might be happy with the following solution:

enter image description here

I first apply the technique shown above, and filter out the faces whose normals don't point towards the camera.

Then I split the remaining mesh and convert it to curves. This way I get one closed curve per face.

If I now move their points very slightly towards the camera and send a raycast in the direction of the camera, I get the information which of the points of a curve are hidden by the geometry.

If all points of a curve are hidden, I filter out this curve. But if even one point of a curve is not hidden, I leave it untouched.

Finally, I simply check if for the points of the pre-filtered geometry there are still some in the geometry converted to curves.

If not, I know the face needs to be filtered as well because it is obviously completely hidden.

enter image description here
Suzanne with internal geometry (Solidify Modifier)

Here is the node tree at a glance:

enter image description here


(Blender 3.2)

Note, however, that you may create some weird smoothing of the normals by doing this, since you end up changing the topology of the mesh as well.

PS: I haven't tested this extensively now, but it should work fine in more complex scenarios. Please provide feedback.

$\endgroup$
7
  • 1
    $\begingroup$ +1 works great, but...i don't understand your "note". I add a subdivision modifier before your GN and it still worked great. $\endgroup$
    – Chris
    Commented Jul 6, 2022 at 17:06
  • $\begingroup$ @Chris Thanks! By this I mean: If you have a closed mesh like a sphere, then the normals on the points will be interpolated between the faces as soon as you make them smooth (In GN with the node Set Smooth, or with Object > Shade Smooth). If you then remove individual faces from this mesh, these normals are interpolated differently at the open edges. So I didn't mean the mesh, but the normals. $\endgroup$
    – quellenform
    Commented Jul 6, 2022 at 17:14
  • $\begingroup$ aaahhh....thx got it! $\endgroup$
    – Chris
    Commented Jul 6, 2022 at 17:15
  • $\begingroup$ @Chris Thank you! ..have corrected the answer accordingly. $\endgroup$
    – quellenform
    Commented Jul 6, 2022 at 17:17
  • $\begingroup$ Thank you very much for this answer! It's a clever and simple way, that works great on the clean topology of the monkey head. However it is no solution for more messed up meshes, because it only takes into account the faces' normal values. It does not take into account if a face is hidden by another face. $\endgroup$
    – spline_bb
    Commented Jul 8, 2022 at 8:14

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .