authors: Keenan Crane, Peter Schröder
Given a triangulated surface,
fieldgen computes the smoothest unit vector
field, or more generally, the smoothest unit n-vector field (e.g., n=1,2,4
for unit vector, line, and cross fields, respectively). Singularities,
such as sources and sinks, are automatically placed in locations that allow
the field to achieve optimal smoothness. Such fields can then be used for a
wide variety of computer graphics and geometry processing tasks such as
surface parameterization, quad meshing, architectural geometry, anisotropic
shading, and texture synthesis.
The code is a reference implementation of the paper
Felix Knöppel, Keenan Crane, Ulrich Pinkall, Peter Schröder
"Globally Optimal Direction Fields"
This version carefully implements the finite element connection Laplacian as described in the paper, using Chebyshev expansions to ensure good numerics. It also supports some sophisticated features, such as holomorphic/anti-holomorphic energy, alignment with principal curvature directions, and alignment with the boundary.
The code itself is somewhat messy research code with a very basic user interface. Several other implementations are available, which use a less sophisticated discretization of the connection Laplacian and do not support some of the features mentioned above. However, they may be useful for certain tasks, or in different build settings. In particular:
stripescode provides a simple version of the algorithm, as well as editing of singularities and generation of a field- aligned parameterization:
There is also an implementation in Directional, which is built on top of Eigen, and is hence header-only:
fieldgen and stripes are both built on top of the CHOLMOD sparse
direct solver, whereas Directional is built on top of Eigen. The latter can be
easier to install (since it is header only) but can be significantly slower,
since the Eigen Cholseky solver is much less mature than CHOLMOD. See also
below for easy install instructions for CHOLMOD.
- 0.01 (Sep 1, 2013) — Initial release
- 0.02 (Jun 4, 2019) — Added boundary alignment, OBJ output, command line support
fieldgen depends on SuiteSparse, which you can obtain from
On most platforms, SuiteSparse can be installed via standard package managers. On Mac OS X / HomeBrew, it can be installed via
brew install homebrew/science/suite-sparse
To build, you will have to edit the Makefile and set the include/lib paths accordingly. Some examples are provided. Once these paths have been set, simply type
which (barring any compilation/linker errors) should build an executable
Once built, you should be able to run the executable by typing
(or specifying a path to any mesh file in OBJ format). You should
see a window showing the mesh and some information in the upper-left
space will generate the smoothest field on the surface:
Other commands can be accessed via the keyboard:
||increase/decrease the symmetry degree of the field (1=vector, 2=line, 4=cross)|
||adjust the smoothness energy; -1=holomorphic, 0=Dirichlet, 1=antiholomorphic|
||adjust trade off between smoothness and curvature alignment (if enabled)|
||toggle curvature alignment|
||toggle boundary alignment|
||draw smooth shaded|
||draw faceted (with wireframe)|
||write solution to
||take a screenshot|
Note: curvature alignment works only when the symmetry degree of the field is 2 or 4.
fieldgen assumes that the input is an oriented and manifold triangle mesh, with or without boundary. Meshes should be specified in the Wavefront OBJ file format. Note that the resolution of the input mesh will affect the resolution of the output field, since one vector is computed per vertex. Also note that extremely poor-quality meshes (e.g., with near-zero angles or triangle areas) might cause problems for field generation, though generally the algorithm is very robust (see in particular Figure 16 of the paper by Knöppel et al, listed above).
w key will write the current field (and the mesh) to the file
out.obj in the working directory. Files are written as triangle meshes in
Wavefront OBJ format.
They also include a tangent vector field, encoded in comment lines at the end
of the file. The degree of the field is specified by a line of the form
where (for instance) n=1 is a unit vector field, n=2 is a line field, and n=4 is a cross field. Individual vectors are then specified by lines of the form
field i x y z
i is the index of the vertex, and
z are the three components of the tangent vector. In the case where these vectors encode an n-direction field this vector is just one of the n possible vectors. The other vectors can be obtained by rotating this one around the corresponding vertex normal, which is given in the usual
vn line. Singularities in the field, which are associated with faces, are indicated by lines
i is the index of the triangle, and
s is the degree of the singularity. All indices are 1-based rather than 0-based.
A command line version of
fieldgen is also available, which can be useful when running in batch mode, over a network, or in other situations where OpenGL visualization is not available or appropriate (e.g., bundling
fieldgen into a plugin).
To build: follow the same instructions above, but type
instead of just
make. Doing so should produce an executable called
fieldgen (rather than
To run: the only mandatory arguments are paths to the input and output meshes (in OBJ format); by default,
fieldgen will then compute the smoothest unit vector field. To get a full set of options, type
which should print the usage string
usage: ./fieldgen OBJ_INPUT_PATH OBJ_OUTPUT_PATH
[--degree=n] [--alignToCurvature] [--alignToBoundary] [--s=S] [--t=T]
The command line options are as follows:
degree— field degree (1=unit vector field, 2=line field, 4=cross field, etc.)
alignToCurvature— align field to principal curvature directions
alignToBoundary— align field to the domain boundary
s/S— controls the smoothness energy; -1=holomorphic, 0=Dirichlet, 1=antiholomorphic
t/T— controls the trade off between smoothness and curvature alignment (if enabled)
Note that enabling boundary alignment will override curvature alignment.
Much of the source code in this archive is just there to support basic stuff like loading a mesh, solving a linear system, etc. The key routines are all in
The main routines are
Mesh::ComputeSmoothest()— computes smoothest field
Mesh::ComputeSmoothestFixedBoundary()— computes smoothest field aligned to the boundary
Mesh::SmoothestCurvatureAlignment()— computes curvature-aligned field
An example of how these routines should be called is found in
This code is covered by a standard MIT license.
Copyright (c) 2013 Keenan Crane and Peter Schröder. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.