For my final project, I implemented A Hierarchical B-Spline Refinment Surface editor,
based on the SIGGRAPH '88 paper
Hierarchical B-Spline Refinment by David R. Forsey and Richard H. Bartels. Generally
with tensor-product surfaces, the gain of finer control over an area is done by
multiplying the total number of control vertices. However, Forsey and Bartels introduced
a local method to refine surfaces, using overlays, which are hierarchically
controlled subdivisions.
The program is written in C and uses OpenGL. The B-spline surfaces are drawn using the
gluNurbsSurface function of OpenGL and evenly spaced knot vectors.
The program starts with an initial surface of 12x12 control points. The control points is uniformly spaced on a surface plane. The surface is rendered with bi-cubic B-spline patches. |
The surface is altered by selecting control points. In the control points mode, the control points are selected by left mouse click, that turns them into red. Then, they can be moved around by dragging the mouse with the middle mouse button pressed. |
The surface can be refined locally by adding another patch on top of it. The added patch subdivises more the region. In patch mode, we select the option "Select Insertion Points", and then pick two control points, which defined the location where the refined patch as to lie on. The two control points appear green, they need to not be aligned and to be separated by at least 3 points (restriction of the paper), in order that the insertion works. Size patch from 7*7 to 36*36 can be added, when the patch option "Insert New Patch" is selected. The new patch can be inserted on top of a deformed, non-flat surface. |
|||
Then, moving control points on this inserted patch affects a smaller region of the surface. The underneath surface, i.e. the parent, has to be trimmed. |
Multiple refined patches can be added on top of same parents. All the children are trimmed. More overlays on top of each other, then moving the control points affects a smaller area of the surface. Note : selectable points to move are in yellow, while the ones that have to stay static in order to preserve continuity between the patches are displayed in blue and are unselectable. |
We use a position, offset method, in order to revaluate easily the location of control points. When a surface underneath or closed is modified, the top surface is affected. |
Consider multiple refined patches on a same parent. If we want to refine a level more on a surface that is made of two distinct patches (the orange and blue ones) that have the same level of refinement (and no child). Then the two patches are deleted and a wider one is added at the place. The user can then reselect the insertion points on this new subdivided patch to gain more control. |
The mouse drags the points of the surface, instead of its control points. Really useful for design, much more inuitive. All the feature available with the control points are maintained with edit points. |