mirror of https://github.com/CGAL/cgal
427 lines
13 KiB
TeX
427 lines
13 KiB
TeX
\documentclass[a4paper,twoside,10pt]{article}
|
|
\usepackage{tutorial}
|
|
\input{tutorial.def}
|
|
|
|
% hyperref stuff
|
|
\usepackage{hyperref}
|
|
\hypersetup{
|
|
pdftitle={Getting started with CGAL Polyhedron},
|
|
pdfauthor={INRIA Geometrica},
|
|
pdfsubject={A tutorial for CGAL},
|
|
pdfkeywords={},
|
|
pdfpagemode=UseThumbs,
|
|
baseurl={http://www.cgal.org},
|
|
colorlinks=true,
|
|
linkcolor=black,
|
|
anchorcolor=black,
|
|
citecolor=black,
|
|
filecolor=black,
|
|
menucolor=black,
|
|
pagecolor=black,
|
|
urlcolor=blue,
|
|
bookmarksopen=false,}
|
|
% end hyperref stuff
|
|
|
|
|
|
\begin{document}
|
|
|
|
% TITLE
|
|
\date{}
|
|
\title{{\LARGE {\sffamily\bfseries Getting started with CGAL
|
|
Polyhedron}}\\ the example of subdivision surfaces}
|
|
\author{
|
|
\sffamily Pierre Alliez\footnote{GEOMETRICA, INRIA Sophia-Antipolis}
|
|
\and
|
|
\sffamily Andreas Fabri\footnote{GeometryFactory, Sophia-Antipolis}
|
|
\and
|
|
\sffamily Lutz Kettner\footnote{Max-Planck Institut für Informatik,
|
|
Saarbrücken}
|
|
\and
|
|
\sffamily Le-Jeng Shiue\footnote{SurfLab, University of Florida}
|
|
\and
|
|
\sffamily Radu Ursu\footnote{GEOMETRICA, INRIA Sophia-Antipolis}}
|
|
\maketitle
|
|
|
|
\thispagestyle{empty}
|
|
|
|
% ABSTRACT
|
|
|
|
\abstract{This document gives a description for a user to get
|
|
started with the halfedge data structure provided by the Computational
|
|
Geometry Algorithm Library (CGAL). Assuming the reader to be familiar
|
|
with the C++ template mechanisms and the key concepts of the Standard
|
|
Template Library (STL), we describe three different approaches with
|
|
increasing level of sophistication for implementing mesh subdivision
|
|
schemes. The simplest approach uses simple Euler operators to
|
|
implement the $\sqrt{3}$ subdivision scheme applicable to triangle
|
|
meshes. A second approach overloads the incremental builder already
|
|
provided by CGAL to implement the quad-triangle subdivision scheme
|
|
applicable to polygon meshes. The third approach is more generic and
|
|
offers an efficient way to design its own subdivision scheme through
|
|
the definition of rule templates. Catmull-Clark, Loop and Doo-Sabin
|
|
schemes are illustrated using the latter approach. Two companion
|
|
applications, one developed on Windows with MS .NET, MFC and OpenGL,
|
|
and the other developed for both Linux and Windows with Qt and OpenGL,
|
|
implement the subdivision schemes listed above, as well as several
|
|
functionalities for interaction, visualization and raster/vectorial
|
|
output.}
|
|
|
|
\vskip 3mm
|
|
|
|
\noindent {\bf Keywords:}
|
|
CGAL library,
|
|
tutorial,
|
|
halfedge data structure,
|
|
polygon surface mesh,
|
|
subdivision surfaces,
|
|
quad-triangle subdivision scheme,
|
|
$\sqrt{3}$,
|
|
Loop,
|
|
Doo-Sabin,
|
|
Catmull-Clark,
|
|
OpenGL.
|
|
|
|
% INTRODUCTION
|
|
\section{Introduction}
|
|
|
|
% introduction to cgal
|
|
|
|
The CGAL library is a joint effort between nine European
|
|
institutes~\cite{fgkss-dccga-00}. The goal of CGAL is to make
|
|
available to users in industry and academia the most important
|
|
efficient solutions to basic geometric problems developed in the area
|
|
of computational geometry in a C++ software library.\\
|
|
|
|
% motivations
|
|
|
|
CGAL features a 3D polygon surface mesh data structure based on the
|
|
concept of halfedge data structure~\cite{k-ugpdd-99}, which has been
|
|
very successful for the design of general algorithms on meshes. In
|
|
this document we provide a tutorial to get started with CGAL
|
|
Polyhedron data structure through the example of subdivision
|
|
surfaces. We also offer an application both under windows and linux,
|
|
featuring an OpenGL-based viewer, an arcball for interaction and two
|
|
raster and vectorial output to produce pictures and figures.\\
|
|
|
|
% teaser
|
|
|
|
\begin{figure}[htb]
|
|
\centering{\includegraphics[width=\linewidth]{figs/teaser}}
|
|
\caption{Snapshot taken from the tutorial application running
|
|
on Windows. A polygon mesh is subdivided using the
|
|
quad-triangle subdivision scheme.}
|
|
\label{fig:teaser}
|
|
\end{figure}
|
|
|
|
|
|
% targeted audience ?
|
|
|
|
The main targeted audience is a master or Ph.D. student in computer
|
|
graphics or computational geometry, aiming at working on mesh
|
|
processing algorithms. We hope this tutorial will convince the
|
|
reader~:
|
|
\begin{itemize}
|
|
|
|
\item
|
|
not reinventing the wheel. Taking some time choosing the ``right
|
|
tool'' is often worth it, even for a short project;
|
|
|
|
\item
|
|
using an optimized and robust library to ease the implementation and
|
|
obtain fast and robust results;
|
|
|
|
\item
|
|
using generic programming to reuse existing data structures
|
|
and algorithms;
|
|
|
|
\item
|
|
using a standard library in order to benefit from existing support and
|
|
discussion groups\footnote{see the cgal discuss list:
|
|
\href{http://www.cgal.org/user_support.html}
|
|
{http://www.cgal.org/user\_support.html.}}.
|
|
|
|
\end{itemize}
|
|
|
|
% PREREQUISITES
|
|
\section{Prerequisites}
|
|
|
|
% C++ and generic programming
|
|
|
|
Before using CGAL, it is mandatory to be familiar with C++ and the
|
|
\italic{generic programming paradigm}. The latter features the notion
|
|
of C++ class templates and function templates, which is at the corner
|
|
stone of all features provided by CGAL.
|
|
|
|
% STL
|
|
|
|
An excellent example illustrating generic programming is the Standard
|
|
Template Library (STL). Generality and flexibility is achieved with a
|
|
set of \italic{concepts}, where a concept is a well defined set of
|
|
requirements. One of them is the \italic{iterator} concept, which
|
|
allows both referring to an item and traversing a sequence of
|
|
items. Those items are stored in a data structure called
|
|
\italic{container} in STL. Another concept, so-called
|
|
\italic{circulator}, allows traversing some circular sequences. They
|
|
share most of the requirements with iterators, except the lack of
|
|
past-the-end position in the sequence. Since CGAL is strongly inspired
|
|
from the genericity of STL, it is important to become familiar with
|
|
its concepts before starting using it (ref STL).
|
|
|
|
% HALFEDGE DATA STRUCTURE
|
|
\section{Halfedge data structure}
|
|
|
|
The specification of a polygon surface mesh consists of combinatorial
|
|
entities: vertices, edges, and faces, and numerical quantities:
|
|
attributes such as vertex positions, vertex normals, texture
|
|
coordinates, face colors, etc. The \italic{connectivity} describes the
|
|
incidences between elements and is implied by the topology of the
|
|
mesh. For example, two vertices or two faces are adjacent if there
|
|
exists an edge incident to both.\\
|
|
|
|
|
|
% definition
|
|
|
|
A \italic{halfedge data structure} is an edge-centered data structure
|
|
capable of maintaining incidence informations of vertices, edges and
|
|
faces, for example for planar maps, polyhedra, or other orientable,
|
|
two-dimensional surfaces embedded in arbitrary dimension. Each edge is
|
|
decomposed into two halfedges with opposite orientations. One incident
|
|
face and one incident vertex are stored in each halfedge. For each
|
|
face and each vertex, one incident halfedge is stored (see
|
|
Fig.\ref{fig:halfedge}).
|
|
|
|
% halfedge
|
|
|
|
\begin{figure}[htb]
|
|
\centering{\includegraphics[width=\linewidth]{figs/halfedge}}
|
|
\caption{Halfedge.}
|
|
\label{fig:halfedge}
|
|
\end{figure}
|
|
|
|
Notice that the halfedge data structure is only a combinatorial data
|
|
structure, geometric interpretation being added by classes built on
|
|
top of the halfedge data structure. On example is the class
|
|
\italic{CGAL::Polyhedron\_3} that we use in this tutorial. The
|
|
halfedge data structure has been very successful for the design of
|
|
algorithms on meshes for several reasons:
|
|
|
|
\begin{itemize}
|
|
|
|
\item
|
|
an edge-based data structure leads to a constant size structure,
|
|
contrary to face-based data structures with inevitable variable
|
|
topological structure when dealing with arbitrary vertex valence and
|
|
face degrees.
|
|
|
|
\item
|
|
a halfedge encodes the orientation of an edge, facilitating the mesh
|
|
traversal.
|
|
|
|
\item
|
|
navigation around each vertex by visiting all surrounding edges or
|
|
faces is made easy.
|
|
|
|
\item
|
|
each halfedge can be associated with a unique corner, that is a couple
|
|
$\{$face,vertex$\}$. The storage of attributes such as normals or
|
|
texture coordinates per corner (instead of per vertex) is thus
|
|
allowed.
|
|
|
|
\end{itemize}
|
|
|
|
% STL CONCEPTS APPLIED TO MESHES
|
|
\section{STL concepts applied to meshes}
|
|
|
|
Concepts of iterators and circulators on a mesh.
|
|
|
|
Circulation around vertices, inside facets, along a boundary.
|
|
|
|
|
|
% POLYHEDRON DATA STRUCTURE
|
|
\section{Polyhedron data structure}
|
|
|
|
Description.
|
|
|
|
Example of declaration (equipped with a kernel).
|
|
|
|
Enrich primitives.
|
|
|
|
Euler operators.
|
|
|
|
Examples of iteration and circulation.
|
|
|
|
Incremental builder.
|
|
|
|
% SUBDIVISION SURFACES
|
|
\section{Subdivision surfaces}
|
|
|
|
A subdivision surface is the limit surface resulting from the
|
|
application of a \italic{subdivision scheme} to a control polyhedron
|
|
(see Fig.\ref{fig:subdivision}). During this process the polygon base
|
|
mesh is recursively subdivided and the mesh geometry is progressively
|
|
modified according to subdivision rules. A subdivision scheme is
|
|
characterized by a refinement operator that acts on the connectivity
|
|
by subdividing the mesh, and by a smoothing operator that modifies the
|
|
geometry. We choose the example of subdivision to illustrate (i)
|
|
iteration and circulation on a halfedge data structure, (ii)
|
|
modification of the connectivity, and (iii) modification of the
|
|
geometry.
|
|
|
|
% subdivision paradigm
|
|
|
|
\begin{figure}[htb]
|
|
\centering{\includegraphics[width=\linewidth]{figs/subdivision}}
|
|
\caption{Catmull-Clark subdivision of a quadrilateral control mesh.}
|
|
\label{fig:subdivision}
|
|
\end{figure}
|
|
|
|
|
|
\subsection{$\sqrt{3}$-Subdivision using Euler Operators}
|
|
|
|
The $\sqrt{3}$ subdivision scheme was introduced by
|
|
Kobbelt~\cite{k-sqrt3-00}. It takes as input a triangle mesh and
|
|
subdivide each facet into three triangles by splitting it at its
|
|
centroid. Next, all edges of the initial mesh are flipped so that they
|
|
join two adjacent centroids. Finally, each initial vertex is replaced
|
|
by a barycentric combination of its neighbors. An example of one step
|
|
of the $\sqrt{3}$ subdivision scheme is shown in
|
|
Fig.\ref{fig:sqrt3_basic}, and an example of several steps is shown in
|
|
Fig.\ref{fig:sqrt3}.
|
|
|
|
% sqrt3 subdivision (basic)
|
|
|
|
\begin{figure}[htb]
|
|
\centering{\includegraphics[width=\linewidth]{figs/sqrt3_basic}}
|
|
\caption{The $\sqrt{3}$-Subdivision scheme is decomposed as
|
|
a set of Euler operators: face splits and edge flips.}
|
|
\label{fig:sqrt3_basic}
|
|
\end{figure}
|
|
|
|
% sqrt3 subdivision
|
|
|
|
\begin{figure}[htb]
|
|
\centering{\includegraphics[width=\linewidth]{figs/sqrt3}}
|
|
\caption{$\sqrt{3}$-Subdivision of the mannequin mesh.}
|
|
\label{fig:sqrt3}
|
|
\end{figure}
|
|
|
|
|
|
\subsection{Quad-triangle Subdivision using Incremental Builder}
|
|
|
|
The quad-triangle subdivision scheme was introduced by
|
|
Levin~\cite{l-pg-03}, then Stam and Loop~\cite{sl-qts-02}. It applies
|
|
to polygon meshes and basically features Loop subdivision on triangles
|
|
and Catmull-Clark subdivision on polygons of the control mesh (see
|
|
Fig.\ref{fig:quad-triangle}). After one iteration of subdivision the
|
|
subdivided model is only composed of triangles and quads. A simple
|
|
solution for implementing such a scheme is to use the
|
|
\italic{incremental builder} concept featured by CGAL Polyhedron. The
|
|
utility class \italic{CGAL::Polyhedron\_incremental\_builder\_3} helps
|
|
in creating polyhedral surfaces from a list of vertices followed by a
|
|
list of facets that are represented as indices into the vertex
|
|
list. This is usually of particular interest for implementing file
|
|
readers for common file formats, and we use it here for generating a
|
|
subdivided mesh starting from a coarser initial mesh.
|
|
|
|
|
|
% quad-triangle subdivision scheme
|
|
|
|
\begin{figure}[htb]
|
|
\centering{\includegraphics[width=\linewidth]{figs/quad-triangle}}
|
|
\caption{Quad-triangle subdivision scheme.}
|
|
\label{fig:quad-triangle}
|
|
\end{figure}
|
|
|
|
Subdivision engine
|
|
|
|
{ \scriptsize
|
|
\begin{verbatim}
|
|
template <class Polyhedron,class kernel>
|
|
class CSubdivider_quad_triangle
|
|
{
|
|
public:
|
|
typedef typename Polyhedron::HalfedgeDS HalfedgeDS;
|
|
|
|
public:
|
|
// life cycle
|
|
CSubdivider_quad_triangle() {}
|
|
~CSubdivider_quad_triangle() {}
|
|
|
|
public:
|
|
void subdivide(Polyhedron &OriginalMesh,
|
|
Polyhedron &NewMesh,
|
|
bool smooth_boundary = true)
|
|
{
|
|
CModifierQuadTriangle<HalfedgeDS,Polyhedron,kernel>
|
|
builder(&OriginalMesh);
|
|
|
|
// delegate construction
|
|
NewMesh.delegate(builder);
|
|
|
|
// smooth
|
|
builder.smooth(&NewMesh,smooth_boundary);
|
|
}
|
|
};
|
|
\end{verbatim}}
|
|
|
|
Subdivision using a modified incremental builder
|
|
|
|
{ \scriptsize
|
|
\begin{verbatim}
|
|
template <class HDS,class Polyhedron,class kernel>
|
|
class CModifierQuadTriangle : public CGAL::Modifier_base<HDS>
|
|
{
|
|
private:
|
|
Polyhedron *m_pMesh;
|
|
typedef typename CGAL::Enriched_builder<HDS> builder;
|
|
|
|
public:
|
|
|
|
// life cycle
|
|
CModifierQuadTriangle(Polyhedron *pMesh)
|
|
{
|
|
m_pMesh = pMesh;
|
|
}
|
|
~CModifierQuadTriangle() {}
|
|
|
|
// subdivision
|
|
void operator()( HDS& hds)
|
|
{
|
|
builder B(hds,true);
|
|
B.begin_surface(3,1,6);
|
|
add_vertices(B);
|
|
add_facets(B);
|
|
B.end_surface();
|
|
}
|
|
...
|
|
};
|
|
\end{verbatim}}
|
|
|
|
|
|
|
|
|
|
% SurfLab
|
|
|
|
\subsection{Subdivision using a rule template}
|
|
|
|
Doo-Sabin, Catmull-Clark, Loop.
|
|
|
|
% APPLICATION DEMO
|
|
\section{Application demo}
|
|
|
|
List of features, snapshots.
|
|
|
|
\subsection{Compiling on Windows}
|
|
|
|
\subsection{Compiling on Linux}
|
|
|
|
% CONCLUSION
|
|
\section{Conclusion}
|
|
|
|
% REFERENCES
|
|
\bibliographystyle{alpha}
|
|
\bibliography{tutorial}
|
|
|
|
|
|
\end{document}
|