Skip to content

LocalMesh Engine 1.1.0 — no more blades across the surface

Choose a tag to compare

@Quentincls Quentincls released this 12 Sep 10:42
· 9 commits to main since this release

Hole closing no longer leaves blades across the surface

Closing a boundary loop means filling it with a triangle fan. On a wide loop
that fan becomes a sheet drawn straight across the object; on a middling one it
leaves a single triangle crossing it, long and flat, catching the light from
every angle. They are few and they carry a great deal of surface: on one test
object 0.46% of the triangles held 17.3% of the visible area, and a single
triangle spanned a quarter of the diagonal.

Before: a closing fan spread across the face of the object. After: the fan is gone and two small holes remain.

Two changes, because one was not enough.

FERMETURE_PERIMETRE drops from 12.0 to 1.0. This is a cliff and not a slope:
between 2 and 8 no loop has that perimeter at all and nothing moves; at 12 the
giant loops pass, up to 58% of the object's span, and the fill spans them.

Lowering the threshold does not clear the middling loops. On one subject no loop
exceeds 19% of the span, so the threshold changes nothing there — and it kept
536 blades. The second change therefore judges the triangle rather than the
loop: longest edge over 5% of the object diagonal and elongation over 8,
removed after the closing pass. Both conditions are needed, since a large
well-proportioned triangle is legitimate and a small sliver is harmless noise. A
mesh coming out of dual contouring contains none of these, on any of the ten
subjects, which is what makes the rule safe. LUMENGEN_RETRAIT_LAMES=0 restores
the old behaviour.

Ten subjects were replayed from the mesh captured immediately before the closing
pass, so the input is held fixed:

threshold 12 threshold 1 + removal
blades, ten subjects 2,613 0
surface invented by closing +14% to +67% +1.7% to +11.8%

What it costs is the holes left open, and they were measured rather than argued
about: both versions rendered from eight angles, counting the pixels that were
surface and became background. Median 0.000% of the object's pixels, worst
case 0.027%.

A note on method, since it is why this went unnoticed for two days. The
threshold was raised to 12 against two witnesses: the silhouette, unchanged
before and after, and the open-edge count, 953 → 0. Neither can see a blade. A
blade lying along the surface does not move the silhouette by one pixel, and the
open-edge count falls whenever you fill — it is the measurement applauding the
act it is supposed to judge.

The fine multi-view pass sizes its ceiling to the card

The fine pass refused any subject over 24,000 cells, a constant written when
nothing smaller than 8 GB could run the engine at all. It never looked at the
card. On a smaller card it admitted a subject calibrated for a larger one and
failed minutes into the work; on a larger card it refused subjects that would
have fitted. The ceiling is now max(8000, 3000 × GB), which gives exactly
24,000 on the 8 GB card the original measurement was made on. Override with
LUMENGEN_PLAFOND_CELLULES.

The refusal also used to advise dropping to a lighter tier, which is no advice
at all on Draft. It now names the lever that exists: the number of photographs.

A four-view run that falls back to the older blend says so

Four photographs do not always go through the four-view path — the weights may
not be on the machine, or the tier may promise a grid the path cannot produce.
The run used to fall back to the older whole-prediction blend in silence, and
the result was simply worse than it should have been with no way to know why. It
now returns a note saying which of the two it was.

Also

localmesh_engine/banc/banc3d.py, a bench that compares the produced shape
against a ground-truth model rather than counting what can be recounted in the
output file. It exists because indirect indicators misled twice in one day: a
flipped-face score of 0.43% on a back panel that was perfectly smooth and
perfectly empty, and a view weighting that scored best offline and worst on the
bench.


Full entry in the changelog.
Nothing in the install changes; git pull is enough.