Subdivision Surfaces
Final project for CSE 557, Winter 2007
Laura Effinger-Dean
For my final project, I implemented the Loop and modified Butterfly subdivion schemes,
Starter code
I started with skeleton code from the Spring 1999 offering of CSE 557.
The code uses MFC for GUI components and includes a framework for edges
and vertices. It also included code for doing simple midpoint
subdivision and a starter point for generating normals.
Loop subdivision
The Loop subdivision scheme is an
approximating scheme. At each subdivision step, we apply an average
mask to all vertices. This differs from interpolating schemes, in which
only newly created points are averaged. I used the averaging mask from
[1]. Here are some results:
A cube at subdivision depth 0, 1, 2, 3:
A donut at subdivision depth 0, 1, 2, 3:
Modified Butterfly subdivision
The Butterly subdivision
scheme is an interpolating scheme. Only new points are averaged, and
all averaged locations are on the limit surface. The modified
subdivision scheme improved upon the original Butterfly scheme by
reducing degeneracy at "extraordinary" vertices - i.e., vertices with a
valance other than 6. I used the weights given in these slides.
A cube at subdivision depth 0, 1, 2, 3:
A donut at subdivision depth 0, 1, 2, 3:
Tangent masks
I also compute the normals to the surface at each level for each
scheme. For the Loop scheme, I used the weights given in [1]; for
Butterfly, I used the weights given in [2]. In these images we can see
the normals that are generated for Loop and Butterfly, respectively:
Evaluation mask
A further step we take after subdividing
and averaging is to apply an "evaluation mask" to push the vertices to
their locations on the limit surface. For the Butterfly scheme, this
step is unecessary because the averaging mask already pushes points to
the limit surface. For the Loop scheme, I used weights from [1]. Here
are some images drawn with and without the evaluation mask:
Feature edges
I also implemented an extension to Loop
subdivision which allows certain edges to be tagged as "feature" or
"crease" edges. The vertices on these edges use a different averaging
mask which only uses the positions of other vertices on the same crease
to calculate a new position, leading to a "sharp" edge. It is possible
to select crease edges in the editor by selecting feature vertices; any
edge between two feature vertices is a feature edge. I used the mask in
[2] to calculate the averaged position of crease vertices.
A tetrahedron with and without a feature edge:
A cube with and without a feature edge:
Bibliography
[1] Stollnitz, DeRose, and Salesin. Wavelets for Computer Graphics . Morgan Kaufmann, 1996.
[2] SIGGRAPH 2000 Course Notes: Subdivision for Modeling and Animation. http://www.mrl.nyu.edu/publications/subdiv-course2000/coursenotes00.pdf
[3] Zorin, Schroder, and Sweldens. "Interpolating Subdivisions for Meshes with arbitrary topology." SIGGRAPH '96.