Geometry Nodes - Recalculate mesh normals

If anyone is still interested in a solution here, I put together what appears to be a mostly working “recalculate outside” node group. It is a little janky, but works pretty well.

The concept is to distribute points within the volume of the mesh, and then DotProduct compare each face’s normal to the nearest point inside the volume. I use the Grid setting when distributing points in the volume, and set the spacing low and the threshold to zero. I also set the point radii very low to avoid situations where the point is thicker than the mesh (for very thin mesh).

EDIT: The Vector Direction custom node group is just a Vector Math (Subtract), wrapped in a node group with plain language inputs.

Occasionally, you still get wrong faces. Tweaking the “Spacing” on the grid points usually fixes this. I’ll probably add an input for the node group that lets you adjust that from the outside. Not ideal, but in the absence of a more reliable solution, it is something.

The one situation I’ve found that still seems to break this is where you have mesh where you have two “outside” faces facing each other but very close together. In those cases, the Sample Nearest can pick up the points from the opposing volume.

I’d also note that Mesh to Volume is a relatively expensive operation, so if you are looking for efficiency, there is probably a faster solution. The upcoming Bake node might mitigate the expense of the Mesh to Volume.

The Blender documentation of the off-the-shelf recalculate operations suggests that it is looking at edge angles.

These tools will recalculate the normals of selected faces so that they point outside (respectively inside) the volume that the face belongs to. The volume does not need to be closed; inside and outside are determined by the angles with adjacent faces. This means that the face of interest must be adjacent to at least one non-coplanar other face.
https://docs.blender.org/manual/en/latest/modeling/meshes/editing/mesh/normals.html

3 Likes