Defeaturing — less geometry at the same tolerance
A CAD model carries manufacturing detail a scene never renders and a CAE mesh never wanted: break-edge fillets, bolt holes, spot-face counterbores. The LOD page spends fewer triangles on the same geometry; this page removes the geometry itself. The kernel recognizes the features of a body — holes, bosses, fillets, chamfers, measured off the B-rep — and defeatures by per-class size thresholds, healing every wound watertight: fillet and chamfer bands re-extend to their sharp seam, plugged holes heal over. Every stage below is the same solid at the same chord tolerance, so the triangle drop is geometry leaving the scene while the facets stay on the surface.
kernel.ops.defeature.defeature(doc, body, { holeDiameter: 5, filletRadius: 2, chamferDistance: 2 }) // thresholds in mm
Only features recognition is confident about are touched, a hole is judged by its widest stage — a small pilot under a wide counterbore is not a small hole — and a heal the kernel cannot make cleanly is refused by name and the feature kept. The report says exactly what went and why everything that stayed stayed:
node tools/defeature.js part.step --hole-diameter 5 --fillet-radius 2 --out part_defeatured.step
Compare the stages
Loading the viewer…
Every model, every stage
Poster shots are rendered straight from the shipped GLBs with the wireframe overlaid — it shows both things that changed: the features that left the model and the triangles that left with them. Click any stage to load it in the viewer above.
Why defeature at the kernel, not the mesh
- The result is still exact B-rep. A defeatured body is a closed solid with real faces — it re-exports to STEP, re-meshes at any tolerance, and takes further modeling. A mesh simplifier hands back triangles; the geometry is gone for good.
- Features, not facets. The thresholds speak the designer's vocabulary — hole diameter, fillet radius, chamfer width — because recognition measured the features off the B-rep first. A mesh decimator cannot promise "keep every bore over Ø12"; the kernel can, and does.
- Heals are proper heals. A removed fillet's neighbours re-extend to their sharp intersection; a plugged bore's pierced faces close over. Every heal is validated watertight before it ships — a heal that cannot close is refused by name, and the feature stays.
- Every change is reported. Only confident recognitions are acted on; candidates and refusals are listed by name, never silently applied. On the NIST part below, the bands the healer refuses are exactly the ones still on the model, and still in the count.
- It compounds with LOD and instancing. Defeature first, then tessellate at the tier you need: the savings multiply, and both passes leave watertight geometry with surface-true normals.
More demos
All demos →Curved offsets, shells and surfaces from points
Offsets and shells on curved solids, exact surfaces through point grids, and a mesh turned back into a solid.
6 curved operations ToleranceDeclare the gap, name the weld
A seam that will not close at the model's tolerance welds shut once the edge carrying the gap declares it.
LOD exportOne solid, every triangle budget
The same solid exported at coarser and coarser detail, watertight at every level, ready for game engines.
5 detail levels per part V12 engineA V12 engine you can run, slice and take apart
Every crank, rod, cam and valve is a real solid, turning in your browser from one dial: the crank angle.
361 parts · 2,850 placementsBuild your own part with NativeCAD
Free for education and makers with a registered key · $200 per seat per year · Kernel SDK for products.