What is OpenMesh?

OpenMesh is a generic and efficient data structure for representing and manipulating polygonal meshes. OpenMesh is developed at the Computer Graphics Group, RWTH Aachen , as part of the OpenSGPlus project, is funded by the German Ministry for Research and Education ( BMBF), and will serve as geometry kernel upon which the so-called high level primitives (e.g. subdivision surfaces or progressive meshes) of OpenSGPlus are built.
It was designed with the following goals in mind :

Features

OpenMesh provides the following features:
In addition we provide some sample applications that demonstrate the usage of OpenMesh:

The halfedge data structure

Polygonal meshes consist of geometry (vertices) and topology (edges, faces). Data structure for polygonal meshes mainly differ in the way they store the topology information. While face-based structures lack the explicit representation of edges, and edge-based structures loose efficiency because of their missing orientation of edges, halfedge-based structures overcome this disadvantages. The halfedges (that result in splitting the edges in two oriented parts) store the main connectivity information:
the halfedge datastructure
  • one vertex
  • one face
  • the next halfedge
  • the opposite halfedge
  • optional: the previous halfedge

Intuitively, this provides a natural and simple way to represent vertices, edges and faces, as well as arbitrary polygons. In order to enable effiecient implementations of the algorithms in mind, one has to analyze the most frequent and time-critical accesses these algorithms will need. The most critical operation is the enumeration of the so-called one-ring neighborhood of a vertex. Exploiting the halfedge data structure this can be done very efficiently:
(1) start at a vertex (2) find outgoing halfedge
(3) switch to opposite halfedge (4) next halfedge points to neighbouring vertex

Repeat steps (2) to (4) until all neighboring vertices are found. In analogy one can also determine the neighbouring faces or halfedges. Note, however, that the programmer himself does not have to cope with internal data structure, but is provided with iterators/circulators that fulfill this task.

Implementation

The following chart shows the interaction between the OpenMesh components:





The OpenMesh architecture allows for custom-tailored meshes: The user can specify arbitrary traits for vertices, edges and faces or choose from a set of predefined attributes which are then propagated to the mesh kernel. The kernel is responsible for the internal storage of the mesh elements and can be chosen to use either arrays or doubly-linked lists as container types. Since meshes with different attributes will results in different C++ types, OpenMesh makes uses the generic programming paradigm to implement algorithms operating on these meshes. This STL-like method leads to the following advantages: