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?

Measured 2026-09-09

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 readCauseModel size (mm)Tolerance as share of modelVerticesShellsDegenerate facesWatertightMatches original
true size, 100 mmfile read with the unit it was authored in100.00.1%2,56210YesYes
read 1000x too small, 0.1 mmmetres authored, millimetres assumed0.199.9997%75,1205,120NoNo
read 1000x too large, 100 mmillimetres authored, metres assumed100,000.30.0001%14,5815,1190NoNo

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

Where this is used

MeshLab , PrusaSlicer , Blender