Benchmark
Why a model's scale has to be checked before any repair tolerance is applied
Does checking a model's scale before repairing it actually change the outcome?
Result
The same file, the same 0.1 mm merge tolerance, three different assumed scales. At the true 100 mm the tolerance is 0.1 percent of the model and the mesh comes back correct: 2,562 vertices, 1 shell, watertight, no degenerate faces. Read 1000 times too small at 0.1 mm, that tolerance is 99.9997 percent of the whole model and collapses it to 7 vertices with all 5,120 faces degenerate. Read 1000 times too large at 100 m, the tolerance is a millionth of the model and welds nothing: 14,581 vertices, 5,119 shells, still not watertight. The tolerance never changed. Only the scale did.
One tolerance of 0.1 mm applied at three scales
| How the file was read | Cause | Model size (mm) | Tolerance as share of model | Vertices | Shells | Degenerate faces | Watertight | Matches original |
|---|---|---|---|---|---|---|---|---|
| true size, 100 mm | file read with the unit it was authored in | 100.0 | 0.1% | 2,562 | 1 | 0 | Yes | Yes |
| read 1000x too small, 0.1 mm | metres authored, millimetres assumed | 0.1 | 99.9997% | 7 | 5,120 | 5,120 | No | No |
| read 1000x too large, 100 m | millimetres authored, metres assumed | 100,000.3 | 0.0001% | 14,581 | 5,119 | 0 | No | No |
Read the fourth column first. A repair tolerance is only ever meaningful as a fraction of the thing being repaired, and these three rows put that fraction at 0.001, 0.999997 and 0.000001 while the number typed into the tool stayed 0.1 the whole time.
The two failures look nothing alike, which is why the order matters
Too small collapses: every vertex falls inside the tolerance of every other, the model becomes 7 points, and all 5,120 faces are degenerate. Too large does nothing at all: the tolerance cannot reach across the gaps, so the file stays 5,119 loose shells and the repair appears to have silently failed. Someone meeting the second case reasonably concludes the repair tool is broken and reaches for a bigger tolerance, which is the wrong lever. The scale was the lever.
What this implies for the order of a pre-print check
Any check whose threshold is an absolute distance, merge tolerance, minimum feature size, hole size limits, is meaningless until the file's scale is established. That puts scale first in the sequence, ahead of the watertight test, because a watertight test run at the wrong scale can report either answer for reasons that have nothing to do with the mesh.
How this was measured
An icosphere at 100 mm exported to STL with relative coordinate noise of 1e-06, then read back three times at three assumed scales with the merge tolerance held fixed at 0.1 mm. The reference mesh at true size is 2,562 vertices, 5,120 faces, 1 shell, watertight, no degenerate faces.
- Software and versions
- trimesh 5.1.0, numpy 2.5.2
- Date measured
- 2026-09-09
- Script
scripts/measure-check-order.py- Raw data
- check-order-2026-09-08.json
This data is published under CC BY 4.0. Reuse the numbers freely, with a link back so a reader can check the method.
What this does not show
Stated so the result is not read wider than it goes.
- what any named repair tool defaults to, which its own documentation states