Fair Surface Design

John Reese, CS 174c Project 1997

(1, Figure 4)

This project is based on Taubin's Fair Surface Design algorithm, which uses a non-shrinking variant of the Gaussian smoothing algorithm to move vertices in and out in order to smooth a polygon mesh. The image above is (frame A) from a CT scan of a spine, and frames B, C, and D are successively more smoothed versions thereof. The goal of the project was to build an Open Inventor based tool for smoothing meshes, allowing constraints to be set and subdivision to be done. The final product allows fairing using arbitrary sequences of Gaussian parameters, mesh subdivision, setting of hierarchical constraints and fixed points, arbitrary motion of mesh points, and motion of mesh points with smooth deformation.


All images on this page (besides the screen shots) are from 1 .



(1, Figure 1)

For each vertex on the mesh, calculate delta-x as the weighted sum of the vectors from the vertex to its neighbors. Then, for each vertex, add in lambda (where lambda is a number between 0 and 1) times delta-x. Then repeat the algorithm, but instead of lambda, use mu (where mu is a negative number, less than -lambda). Both steps are repeated in sequence several times, until the mesh is sufficiently smooth. Without the second step, this produces Gaussian smoothing, which causes shrinkage of the mesh over time. The second step counteracts the shrinkage while still smoothing the mesh.

1, sections 1 and 2

More Efficient Filters

By changing the lambda and mu used in the algorithm over time, the algorithm can be made to converge much more quickly. An altered algorithm, using trigonometric approximations of low pass filters, can cause even quicker convergence.



(1, Figure 6)

By repeatedly subdividing the mesh (breaking each polygonal face into multiple, smaller faces) and then applying the smoothing algorithm, a rough approximation of a surface can be turned into a much prettier surface than smoothing or subdivision alone.

1, section 3


Hierarchical Constraints

(1, Figure 8)

By manipulating the internal representation of the mesh, it is possible to have two vertices, x and y, such that x considers y to be its neighbor, but y does not consider x to be its neighbor. This is called a non-symmetric neighborhood structure. The effect of such a manipulation on the smoothing algorithm is that x will use y's position to calculate its new position, but y will be independent of x. If y has been completely isolated, i.e. some points consider y a neighbor, but y considers itself to have no neighbors, then y will remain fixed through successive iterations of the algorithm, while still affecting surrounding vertices. An example of this can be seen in frame C of the picture above: the vertices at the foot were defined as having empty neighborhoods, so they remained stationary through the smoothing algorithm.

1, section 4.1

As an extension of this idea, a weight l can be attached to each vertex. If two vertices x and y have weights lx and ly, and they would otherwise be considered neighbors of one another (for example, because they share an edge in the mesh), then x is a neighbor of y only in ly <= lx. For example, if you were to give a set of points a label which is higher than the label the other points have, those points would only take one another into consideration as the smoothing progresses, but would affect other points. You could thus build an infrastructure about which the rest of the smoothing must be done. This is useful when you want to preserve certain aspects of the original shape of the mesh which might otherwise be smoothed away by the algorithm. An example can be seen in frame D of the picture above: the vertices at the foot have been labeled in such a way that they move only under the influence of one another, but still affect outside points.

1, section 4.4

Smooth Deformations

It is possible to set more general constraints, such as that a point x will end up in a certain position x0, by treating the algorithm as multiplication by a large matrix and manipulating the elements of the matrix. This would allow you, for example, to drag a vertex of the mesh to a point and have the shape smooth about its new position.

1, sections 4.2 and 4.3


Implementation Blow by Blow, with Screen Shots

Source code


  1. Taubin, G., "A Signal Processing Approach to Fair Surface Design," Computer Graphics Proceedings, pp. 351-358, August 1995.
  2. Taubin, G., "Optimal Surface Smoothing as Filter Design," Research Report, March 1996.