Hi,
I noticed that raw surface/surface intersection in verb can produce relatively large residuals (~1e-4) on difficult analytic cases such as oblique cone × cone.
I experimented with:
- tighter tessellation seeding
- decoupled refinement tolerance
- higher refinement iteration budget
This reduces residuals down to ~1e-6–1e-7 without changing topology.
Full patch and benchmarks are here:
Changes:
- tighten adaptive tessellation for SSI seeding
- decouple refinement tolerance from the public API tolerance
- raise the point-refinement budget from 5 to 12 iterations
- use the midpoint of the two refined surface points as the final SSI sample point
- guard against near-singular refinement updates
Measured raw SSI results (no downstream post-processing):
Known limitation:
- cylinder_x_cylinder is still fragmented into 4 open pieces
- raw topology is unchanged there, which suggests the remaining issue
is not just a refinement-budget problem
Test coverage:
Raw SSI comparisons were rerun in both argument orders (A×B and B×A) for:
- plane_x_cylinder
- plane_x_loft
- cylinder_x_cylinder
- plane_x_oblique_cone
- oblique_cone_x_oblique_cone
- sphere_x_cylinder
- sphere_x_sphere
Happy to discuss or adjust approach.
What changed
- stricter adaptive tessellation for intersection seeding
- refinement tolerance decoupled from the public API tolerance
- refinement iteration budget increased from 5 to 12
- final SSI sample point computed as the midpoint of the two refined surface projections
- added guards against near-singular refinement updates
Evidence
Before/after raw SSI benchmarks were rerun on 7 analytic cases in both argument orders.
| Case |
Before (worst residual) |
After (worst residual) |
Raw topology |
oblique_cone_x_oblique_cone |
1.68e-4 |
8.01e-6 / 5.70e-6 |
1 open curve |
plane_x_oblique_cone |
8.33e-5 |
6.19e-7 |
1 closed loop |
sphere_x_cylinder |
6.39e-5 |
2.18e-7 |
2 closed loops |
sphere_x_sphere |
4.08e-5 |
7.18e-7 |
1 closed loop |
plane_x_loft |
8.24e-5 |
1.95e-5 |
1 open curve |
What did not change
cylinder_x_cylinder is still fragmented into 4 open pieces
- no raw topology is healed by this patch
- no kernel-side logic was added
Why this matters
This improves the geometric quality of hard raw SSI cases without hiding the remaining topological limitations.
That makes the raw solver output more accurate and more useful for downstream consumers.
Intersect.zip
Hi,
I noticed that raw surface/surface intersection in verb can produce relatively large residuals (~1e-4) on difficult analytic cases such as oblique cone × cone.
I experimented with:
This reduces residuals down to ~1e-6–1e-7 without changing topology.
Full patch and benchmarks are here:
Changes:
Measured raw SSI results (no downstream post-processing):
oblique_cone_x_oblique_cone
to 8.01e-6 / 5.70e-6
plane_x_oblique_cone
to 6.19e-7
sphere_x_cylinder
to ~1.3e-7..2.2e-7
sphere_x_sphere
to ~5.6e-7..7.2e-7
plane_x_loft
to ~1.95e-5
Known limitation:
is not just a refinement-budget problem
Test coverage:
Raw SSI comparisons were rerun in both argument orders (A×B and B×A) for:
Happy to discuss or adjust approach.
What changed
Evidence
Before/after raw SSI benchmarks were rerun on 7 analytic cases in both argument orders.
oblique_cone_x_oblique_cone1.68e-48.01e-6/5.70e-61 open curveplane_x_oblique_cone8.33e-56.19e-71 closed loopsphere_x_cylinder6.39e-52.18e-72 closed loopssphere_x_sphere4.08e-57.18e-71 closed loopplane_x_loft8.24e-51.95e-51 open curveWhat did not change
cylinder_x_cylinderis still fragmented into 4 open piecesWhy this matters
This improves the geometric quality of hard raw SSI cases without hiding the remaining topological limitations.
That makes the raw solver output more accurate and more useful for downstream consumers.
Intersect.zip