GeomPlate_BuildPlateSurface vs. GeomFill_BSplineCurves vs. BRepFill

I'm pretty new to OpenCASCADE so forgive me if this question is lengthy and possibly ridiculous. Here's the set-up, we have a very high poly surface mesh, too high poly to feasibly add verts/edges/faces to build a shell/solid on which we can use the OpenCASCADE boolean operations. We can afford to do some approximation and so it seems logical to use spline surfaces (in patches as the surface folds back on itself) to sew together an approximate surface to build into a solid. We have experimented with several methods for generating patches, but most likely it will be along the lines of box intersection curves (approximated with bsplinecurves) for the edge constraints but also possibly point constraints in the middle for high curvature patches.

This brings me to the question and problem, GeomPlate_BuildPlateSurface supports point and edge constraints, however while the plate surface itself may be constrained, since it is algorithmic you have to use makeapprox to generate a second approximation, which is definitely not constrained to the edges and must be cut in some way which since we are building the surface in patches will require a lot of sewing. GeomFill_BSplineCurves seems able to create a constrained bspline surface but doesn't seem to support any type of point constraints so it is difficult to control the curvature within a patch when necessary. Finally, I'm really not sure how to use BRepFill at all, however it does seem to fill between two edges built from bspline curves to make a face, however once again there doesn't seem to be a way to add any further constraints.

So firstly, should I be using one of the techniques I've listed above, or is there a better way to do this (perhaps BRepFill_Generator)? If building a plate approximation is the recommended approach then what is the best way to cut the surface (e.g. with the edge of a cube) then sew up adjacent surfaces so they are contiguous. If either geomfill or brepfill are the most appropriate, then is there anyway to perturb the surface with point constraints without changing the edge aspect much?

Thanks for the help

Timo Roth's picture

Hello Mark,

I have similar questions concerning BSpline-surfaces with constraints and would be interested if/how you could solve your problem.

It is possible to initialize GeomPlate_BuildPlateSurface with a surface. Does anybody know, if this helps to give some constraints to the PlateSurface? Unfortunately, till now I always received an exception when I did it. I thought that I could create a BSpline-surface with GeomAPI_PointsToBSplineSurface and then add some constraints to it with BuildPlateSurface.


Peter Wainwright's picture

Has anyone any ideas on this? I have a few ideas but it seems there should be an easier way.

If the surface is covered by a polynomial of degrees N,M (in u and v), and the edges are polynomials of the same degree, then the polynomial is uniquely defined by interpolating between N+1 points in u, M+1 points in v. That would ensure (C0) continuity at the edges.

If you wanted to use more than (N+1)(M+1) points and find a surface which fits the points approximately, I imagine you might be able to do something like this:

(1) use GeomAPI_PointsToBSplineSurface,

(2) work out the degree of the surface, select (N+1)(M+1) points on this surface,

(3) move the perimeter points onto the desired curve and

(4) re-interpolate with the new points.

You would need to do something like this if neighbouring patches were of different degree.

However, if the points were moved too far I imagine the surface could develop large oscillations.