Repository navigation
LocalMesh Engine 1.1.0 — no more blades across the surface
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.
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.
