Freeform Poisson default is wrong for open / non-orientable organic shapes #26
Labels
No labels
blocked:needs-decision
blocked:preflight
bug
in-progress
in-progress
lint-cleanup
needs-decompose
quickfix
triage-approved
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Mark/pc2cad#26
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Freeform Poisson default is wrong for open / non-orientable organic shapes
What this is
A visual assessment of pc2cad's freeform (Poisson) reconstruction on the
three organic sample pointclouds, run on 2026-06-20. The companion
issue is pc2cad#24 (single-plane extrude regression on
sample_plane_cyl.ply); this issue covers the freeform side of thesame picture.
How the assessment was done
For each sample I ran:
Then I rendered the input pointcloud and the Poisson-reconstructed
mesh in 3 orthographic views and visually compared them. The
reconstructed mesh shown is the same algorithm (Poisson, depth 8) that
pc2cad runs internally, just executed outside the pipeline so the
mesh is renderable. Screenshots are attached below.
Results
organic_bunny.plyorganic_torus_knot.plyorganic_vase.plyPer-sample
organic_bunny(15k pts, 91.6% analytic coverage)low_confidence_primitives) + Poissonmesh (19k tris). The sphere fits are noise — they don't correspond
to any anatomical feature of the bunny and are flagged as
low-confidence in the report.
face are absent; high-frequency anatomical detail is washed out.
Bunny, which is the dominant constraint here — Poisson at depth 8
on 15k points cannot recover the ear geometry.
analytic primitives add nothing.
organic_torus_knot(20k pts, 0.0% coverage, 100% residual)no_primitives_fit,low_coverage,high_residualall flagged. The pipeline correctlyidentifies "no spheres / planes / cylinders to fit" and falls
through to freeform.
but topology (3-twist, 3 inner / 3 outer loops) is preserved.
With
coverage = 0.0, the pipeline has effectively given upanalytically; only the freeform mesh is meaningful, and the
pipeline produces a FreeCAD-missing placeholder for the .brep.
organic_vase(20k pts, 98.4% coverage)low_confidence_primitives) + Poissonmesh (10.7k tris).
opening are gone. The reconstruction is a sealed solid that reads
as a gourd or onion.
watertight surface by construction, which is exactly the wrong
topology for a vessel.
--freeformflag already exposespoisson/ball_pivoting/alpha_shapes— for the vase, alpha_shapesor ball_pivoting would preserve the open top. The CLI defaults
to Poisson.
Visual evidence
Overview (all three stacked)
organic_bunny— input vs. PoissonThe 15k-point sparse sample and the Poisson reconstruction side by
side. The reconstruction is a smooth hunched mass; ears, legs, tail,
and face are absent.
organic_torus_knot— input vs. PoissonTopology preserved (3 loops), tube rough/ribbed. The 0% analytic
coverage in the report means only the freeform mesh is meaningful.
organic_vase— input vs. PoissonSilhouette captured, but the top is sealed — looks like a gourd,
not a vase. Alpha shapes or ball pivoting would do better here.
Cross-sample issues
Poisson is the wrong default for open / non-orientable surfaces.
The vase shows this clearly. Alpha shapes or ball pivoting handle
the open top correctly. The CLI exposes both via
--freeform alpha_shapesand--freeform ball_pivoting, but Poisson is thedefault. A small wrapper heuristic ("is the convex hull fully
filled, or does the pointcloud have interior concavities?") could
pick a better default per-sample, or the user needs to know to
pick a different method for open objects.
Analytic fitting on organic inputs is noise. All three samples
produce meaningless sphere-fits with
low_confidence_primitiveswarnings. These fits add nothing useful and clutter the report. A
pre-fit check (e.g. "is this organic?") could skip the analytic
stage entirely for organic samples, or move the analytic results
to a less prominent place in the report (e.g. behind a
--show-analyticsflag).coverage=0.0andno_primitives_fitare framed as failureswhen they're really "this is freeform-only territory." The
warning array on the torus_knot sample is technically correct
(no analytic primitives fit) but misleading in the context of a
freeform-only output. A warning reformulation or a separate
"analytic skipped: sample is freeform-suitable" message would be
clearer.
Related
(companion issue, same assessment cycle)
Suggested next step (for the human picking this up)
A small, low-risk enhancement: change the default for
--freeformonorganic samples from
poissontoalpha_shapes, OR add a"shape-type detector" that picks Poisson for solid closed shapes and
alpha_shapes / ball_pivoting for shells / open surfaces. The CLI
already exposes all three methods; only the default needs work.
Reproduction
Then re-render the input / output pointcloud vs. Poisson mesh in 3
views and compare. The screenshots in this issue were produced by
/tmp/render_organic.py(renders the same Poisson mesh outside thepipeline so it's a renderable mesh file).