Documentation / Node reference / geo nodes
geo/Clean
Fixes the faces that make a mesh unusable downstream: interior, duplicate, degenerate, non-manifold, and inconsistently wound.
Topology
Each deleting option selects faces to remove, and everything selected goes in one pass, with primitive attributes following the surviving faces. Interior faces are the ones buried inside another closed surface, typically the overlap left after merging two solids. Duplicate faces reference the same set of points twice; degenerate faces have collapsed onto a point or a line; non-manifold faces are the extras where more than two faces share one edge, which the remeshing nodes refuse. Turn on `invert` to keep only what would have been deleted, which is the quickest way to see what a pass is about to remove. geo/ManifoldDisplay draws the same problem edges as overlay curves without modifying the mesh.
repairTopology is the stronger, non-destructive answer to the same two defects, on triangle meshes. Two faces on the same three points wound opposite ways enclose nothing, so both cancel rather than one surviving; and where more than two faces still share an edge, the sheets are ordered by their angle about that edge, paired off, and separated by duplicating the vertices they shared, instead of the extras being deleted. That is the difference between a mesh that is repaired and one with a fresh hole in it, and it is why the decimation of a scan comes out watertight. It adds points where it splits, and it runs before harmonizeWinding, which needs the manifold edges it produces.
harmonizeWinding is the one option that removes nothing. Every face is stored as an ordered list of corners, and that order is what says which side is the outside; imports, hand-built meshes and some booleans leave faces disagreeing, which renders and prints inside out in patches. The pass walks each connected piece across its shared edges and reverses the faces that disagree with their neighbours, then, with flipToOutward on, signs each closed piece's volume and turns the piece round when its sign disagrees with where it sits. It runs last, on whatever the deleting options left.
It needs a WELDED mesh. Winding only follows across a shared edge, and no primitive in Polygon welds its points, so on triangle soup (any STL) every face is its own piece and there is nothing to harmonize. Put geo/Fuse in front.
The outward flip is decided per piece, by NESTING. A piece sitting inside an odd number of other pieces is a cavity and belongs wound inward, and everything else belongs wound outward, so a hollow part keeps its inner shell inward while a separate body that happens to be inverted is turned round. The one thing to know is that the rule is parity and nothing else: a smaller closed piece inside a bigger one becomes a cavity whichever way it arrived wound, so two solids where one sits inside the other are read as a part with a void in it. Pull them apart with geo/Connectivity if that is not what they are. Point normals are recomputed when a face is reversed, since the normals that came in describe the winding that was there before.
Parameters
| Name | Type | What it does |
|---|---|---|
| deleteInteriorFaces | Bool | Remove faces buried inside another closed surface — the faces no ray from outside can reach. Triangle meshes only; requires the BVH build feature. |
| interiorFaceRayCount | UInt32 | How many rays each face votes with. One is enough on a closed mesh, where the answer does not depend on the direction; raise it if a mesh with holes or grazing slivers classifies inconsistently. Odd values cannot tie, and each extra ray costs a full pass. |
| deleteDuplicateFaces | Bool | Remove every face beyond the first that references the same set of points, whatever its winding or starting corner. |
| deleteDegenerateFaces | Bool | Remove collapsed faces: those referencing the same point more than once, plus those at or below the area threshold below. |
| degenerateFaceArea | Float | Area at or below which a face counts as collapsed. 0 removes only the topologically collapsed faces (a repeated point). |
| deleteNonManifoldFaces | Bool | Where more than two faces share an edge, remove the extras and keep the first oppositely-wound pair — the structure the remeshing nodes require. |
| repairTopology | Bool | Make the mesh a valid 2-manifold without opening holes: collapsed faces go, a pair of faces on the same three points wound opposite ways cancels (both sides, since together they enclose nothing), and where more than two faces still share an edge the sheets are ordered by angle about that edge, paired, and pulled apart by duplicating the shared vertices. That last step is what separates it from deleteNonManifoldFaces, which deletes the extras and leaves a hole. TRIANGLE meshes only, and it adds points where it splits. Run it before harmonizeWinding, which needs the manifold edges it produces. |
| harmonizeWinding | Bool | Reverse the faces whose winding disagrees with their neighbours', so the whole mesh reads the same way round. Removes nothing, and runs after the deleting options on whatever they left. It needs a welded mesh: winding only follows across a shared edge, so put geo/Fuse in front or nothing will happen. An edge shared by more than two faces has no unambiguous answer, so the walk stops there and the pieces either side are still made consistent on their own. |
| flipToOutward | Bool | After harmonizing, turn each closed piece the way its position says it should face: a piece inside an odd number of other pieces is a cavity and is wound inward, everything else is wound outward. That fixes a mesh that is simply inside out, keeps a hollow part's inner shell inward, and turns round one inverted body sitting beside another. Skipped piece by piece on anything open, which encloses nothing and so has no outside to point at. |
| invert | Bool | Keep ONLY the faces the options above select, instead of removing them. Useful to inspect what a pass would remove. |
| keepUnreferencedPoints | Bool | Keep the points that the deleted faces owned, unreferenced, in the point buffer. Off, which is the default, drops them and renumbers the survivors from 0. On preserves the input's point numbering, which is what point groups, entityIndex(.POINT) expressions and index correspondence in geo/AttributeCopy read. |
| allocator | UInt8 TEMP · POOL · FLAT_POOL | Which allocator backs the scratch buffers: a pool/flat-pool clears at end of cook, temp at end of frame. |
See also
- geo/ManifoldDisplay
- geo/Fuse
- geo/Delete
- geo/Decimate
This page is generated from the engine, so it describes the release you can download. The same text is in the editor's Help panel next to the node itself.