Why do STL-to-SubD workflows lose sharp edges or fail on messy meshes?

I kept running into the same problem with downloaded STL/OBJ files in Rhino: either the mesh is slightly broken and the workflow falls apart, or QuadRemesh gives a usable SubD but softens edges that actually matter.

So I built a small Rhino 8 Grasshopper tool around a different order of operations: repair first, detect sharp features before remeshing, use those features as guides, convert to SubD, crease the full corresponding edge chains, then fit the result back toward the source mesh and report deviation.

The important part for me was not claiming it “beats QuadRemesh”, so I tested it against a Rhino-native workflow using QuadRemesh + hard-edge detection + subdivision/creasing.

Results on four test meshes:

- clean hard-surface part: sharp edges preserved 100% vs 87%

- messy STL: 99% vs 95%

- honeycomb panel: 100% vs 97%

- ShrinkWrap-rounded shell: 58% vs 0%

Average deviation was about 2–5× lower across the tests.

Maximum deviation was not universally better. On two parts, the native workflow was slightly better at the worst local point — for example 0.59 mm vs 0.63 mm. I’m keeping that in the comparison because it seems more useful than pretending one workflow wins every metric.

The other thing I wanted was predictable failure: the component checks unwelded/open edges, degenerate faces, non-manifold conditions and flipped faces first, tries to repair them, and stops with an error instead of quietly producing a bad SubD when the input is beyond repair.

Known limitations: this is not a scan-cleanup or denoising tool, very damaged/self-intersecting meshes may still fail, and organic geometry is not the target use case.

drag 02-sharp-edges.png here

I called it SubDone. The paid version is here: SubDone for Rhino 8 — Mesh to Editable SubD

I also split the mesh diagnosis/repair stage into a free MeshCheck component, which is going onto Food4Rhino.

file?

Here’s a file you can check: same test shell, three layers side by side.

  • 01_source_STL – clean hard-surface test shell I modelled for testing (90 × 54 × 24 mm, 6350 triangles)
  • 02_rhino_quadremesh_creases – Rhino’s own QuadRemesh (Detect hard edges on, adaptive size 50, rest default) → SubD with interior creases, capped to the same face budget
  • 03_subdone – my component, EdgeLength 2.0, SharpAngle 30

Deviation measured both ways (source mesh → SubD limit surface and back), sampled at vertices:

faces mean max
Rhino QuadRemesh + creases 4289 0.023 mm 0.508 mm
SubDone 4494 0.006 mm 0.140 mm

Settings and numbers are also in the file’s Notes. Saved as a Rhino 7 file.


subdone-test-shell.3dm (2.7 MB)