english names for anchors

This commit is contained in:
Alec Jacobson
2015-05-18 12:55:56 -04:00
parent 6c2d56a8c9
commit a258a42b0c
+66 -66
View File
@@ -35,15 +35,15 @@ lecture notes links to a cross-platform example application.</p>
<h1 id="tableofcontents">Table of contents</h1>
<ul>
<li><a href="#100">Chapter 1: Introduction to libigl</a>
<li><a href="#chapter1:introductiontolibigl">Chapter 1: Introduction to libigl</a>
<ul>
<li><a href="#100b">Libigl design principles</a></li>
<li><a href="#101">101 Mesh representation</a></li>
<li><a href="#102">102 Visualizing surfaces</a></li>
<li><a href="#103">103 Interaction with keyboard and mouse</a></li>
<li><a href="#104">104 Scalar field visualization</a></li>
<li><a href="#105">105 Overlays</a></li>
<li><a href="#libigldesignprinciples">Libigl design principles</a></li>
<li><a href="#meshrepresentation">101 Mesh representation</a></li>
<li><a href="#visualizingsurfaces">102 Visualizing surfaces</a></li>
<li><a href="#interactionwithkeyboardandmouse">103 Interaction with keyboard and mouse</a></li>
<li><a href="#scalarfieldvisualization">104 Scalar field visualization</a></li>
<li><a href="#overlays">105 Overlays</a></li>
</ul></li>
<li><a href="#chapter2:discretegeometricquantitiesandoperators">Chapter 2: Discrete Geometric Quantities and
Operators</a>
@@ -99,49 +99,49 @@ lecture notes links to a cross-platform example application.</p>
<li><a href="#arapwithgroupededge-sets">ARAP with grouped edge-sets</a></li>
</ul></li>
</ul></li>
<li><a href="#500">Chapter 5: Parametrization</a>
<li><a href="#chapter5:parametrization">Chapter 5: Parametrization</a>
<ul>
<li><a href="#501">501 Harmonic parametrization</a></li>
<li><a href="#502">502 Least-Square Conformal Maps</a></li>
<li><a href="#503">503 As-Rigid-As-Possible</a></li>
<li><a href="#504">504 N-Rotationally symmetric tangent fields</a></li>
<li><a href="#505">505 Global, seamless integer-grid parametrization</a></li>
<li><a href="#506">506 Anisotropic remeshing using frame fields</a></li>
<li><a href="#507">507 N-PolyVector fields</a></li>
<li><a href="#508">508 Conjugate vector fields</a></li>
<li><a href="#509">509 Planarization</a></li>
<li><a href="#harmonicparametrization">501 Harmonic parametrization</a></li>
<li><a href="#leastsquareconformalmaps">502 Least-Square Conformal Maps</a></li>
<li><a href="#asrigidaspossible">503 As-Rigid-As-Possible</a></li>
<li><a href="#nrotationallysymmetrictangetfields">504 N-Rotationally symmetric tangent fields</a></li>
<li><a href="#globalseamlessintegergridparametrization">505 Global, seamless integer-grid parametrization</a></li>
<li><a href="#anisotropicremeshingusingframefields">506 Anisotropic remeshing using frame fields</a></li>
<li><a href="#npolyvectorfields">507 N-PolyVector fields</a></li>
<li><a href="#conjugatevectorfields">508 Conjugate vector fields</a></li>
<li><a href="#planarization">509 Planarization</a></li>
</ul></li>
<li><a href="#600">Chapter 6: External libraries</a>
<li><a href="#chapter6:externallibraries">Chapter 6: External libraries</a>
<ul>
<li><a href="#601">601 State serialization</a></li>
<li><a href="#602">602 Mixing Matlab code</a>
<li><a href="#stateserialization">601 State serialization</a></li>
<li><a href="#mixingmatlabcode">602 Mixing Matlab code</a>
<ul>
<li><a href="#savingamatlabworkspace">Saving a Matlab workspace</a></li>
<li><a href="#dumpingeigenmatricestocopyandpasteintomatlab">Dumping Eigen matrices to copy and paste into
Matlab</a></li>
</ul></li>
<li><a href="#603">603 Calling libigl functions from Matlab</a></li>
<li><a href="#604">604 Triangulation of closed polygons</a></li>
<li><a href="#605">605 Tetrahedralization of closed surfaces</a></li>
<li><a href="#606">606 Baking ambient occlusion</a></li>
<li><a href="#607">607 Picking vertices and faces</a></li>
<li><a href="#608">608 Locally Injective Maps</a></li>
<li><a href="#609">609 Boolean Operations on Meshes</a></li>
<li><a href="#callinglibiglfunctionsfrommatlab">603 Calling libigl functions from Matlab</a></li>
<li><a href="#triangulationofclosedpolygons">604 Triangulation of closed polygons</a></li>
<li><a href="#tetrahedralizationofclosedsurfaces">605 Tetrahedralization of closed surfaces</a></li>
<li><a href="#bakingambientocclusion">606 Baking ambient occlusion</a></li>
<li><a href="#pickingverticesandfaces">607 Picking vertices and faces</a></li>
<li><a href="#locallyinjectivemaps">608 Locally Injective Maps</a></li>
<li><a href="#booleanoperationsonmeshes">609 Boolean Operations on Meshes</a></li>
</ul></li>
<li><a href="#700">Chapter 7: Miscellaneous</a>
<li><a href="#chapter7:miscellaneous">Chapter 7: Miscellaneous</a>
<ul>
<li><a href="#701">701 Mesh Statistics</a></li>
<li><a href="#702">702 Generalized Winding Number</a></li>
<li><a href="#703">703 Mesh Decimation</a></li>
<li><a href="#meshstatistics">701 Mesh Statistics</a></li>
<li><a href="#generalizedwindingnumber">702 Generalized Winding Number</a></li>
<li><a href="#meshdecimation">703 Mesh Decimation</a></li>
</ul></li>
<li><a href="#future">Chapter 8: Outlook for continuing development</a></li>
</ul>
<h1 id="100">Chapter 1</h1>
<h1 id="chapter1:introductiontolibigl">Chapter 1</h1>
<p>We introduce libigl with a series of self-contained examples. The purpose of
each example is to showcase a feature of libigl while applying to a practical
@@ -150,7 +150,7 @@ concepts of libigl and introduce a simple mesh viewer that allows to
visualize a surface mesh and its attributes. All the tutorial examples are
cross-platform and can be compiled on MacOSX, Linux and Windows.</p>
<h2 id="100b">libigl design principles</h2>
<h2 id="libigldesignprinciples">libigl design principles</h2>
<p>Before getting into the examples, we summarize the main design principles in
libigl:</p>
@@ -209,7 +209,7 @@ inside each example folder.</p>
solver</a> which has to be
downloaded and compiled separately.</p>
<h2 id="101">Mesh representation</h2>
<h2 id="meshrepresentation">Mesh representation</h2>
<p>libigl uses the <a href="http://eigen.tuxfamily.org/">Eigen</a> library to encode vector
and matrices. We suggest that you keep the
@@ -262,7 +262,7 @@ Similarly, a mesh can be written in an OBJ file using:</p>
<p><a href="101_FileIO/main.cpp">Example 101</a> contains a simple mesh
converter from OFF to OBJ format.</p>
<h2 id="102">Visualizing surfaces</h2>
<h2 id="visualizingsurfaces">Visualizing surfaces</h2>
<p>Libigl provides an glfw-based OpenGL 3.2 viewer to visualize surfaces, their
properties and additional debugging informations.</p>
@@ -303,7 +303,7 @@ mesh." />
<figcaption>(<a href="102_DrawMesh/main.cpp">Example 102</a>) loads and draws a
mesh.</figcaption></figure>
<h2 id="103">Interaction with keyboard and mouse</h2>
<h2 id="interactionwithkeyboardandmouse">Interaction with keyboard and mouse</h2>
<p>Keyboard and mouse events triggers callbacks that can be registered in the
viewer. The viewer supports the following callbacks:</p>
@@ -356,7 +356,7 @@ control the camera directly in your code.</p>
the viewer&#8217;s callbacks. See the
<a href="../include/igl/viewer/ViewerPlugin.h">Viewer_plugin</a> for more details.</p>
<h2 id="104">Scalar field visualization</h2>
<h2 id="scalarfieldvisualization">Scalar field visualization</h2>
<p>Colors and normals can be associated to faces or vertices using the
set_colors function:</p>
@@ -394,7 +394,7 @@ color field.</figcaption></figure>
types and can be easily reused for many different tasks. Not committing to
heavy data structures types favors simplicity, ease of use and reusability.</p>
<h2 id="105">Overlays</h2>
<h2 id="overlays">Overlays</h2>
<p>In addition to plotting the surface, the viewer supports the visualization of points, lines and text labels: these overlays can be very helful while developing geometric processing algorithms to plot debug informations.</p>
@@ -1676,7 +1676,7 @@ ARAP deformation on a detailed shape (left of middle), to ARAP with grouped
rotation edge sets (right of middle), to the very fast subpsace method
(right).</figcaption></figure>
<h1 id="500">Chapter 5: Parametrization</h1>
<h1 id="chapter5:parametrization">Chapter 5: Parametrization</h1>
<p>In computer graphics, we denote as surface parametrization a map from the
surface to <span class="math">\(\mathbf{R}^2\)</span>. It is usually encoded by a new set of 2D
@@ -1702,7 +1702,7 @@ genus. They initially cut the mesh in multiple patches that can be separately pa
<li><p><strong>Global seamless parametrization</strong>: these are global parametrization algorithm that hides the seams, making the parametrization &#8220;continuous&#8221;, under specific assumptions that we will discuss later.</p></li>
</ol>
<h2 id="501">Harmonic parametrization</h2>
<h2 id="harmonicparametrization">Harmonic parametrization</h2>
<p>Harmonic parametrization <a class="citation" href="#fn:16" title="Jump to citation">[16]<span class="citekey" style="display:none">eck_2005</span></a> is a single patch, fixed boundary parametrization
algorithm that computes the 2D coordinates of the flattened mesh as two
@@ -1746,7 +1746,7 @@ texture" />
mesh with texture, (right) UV parametrization with
texture</figcaption></figure>
<h2 id="502">Least squares conformal maps</h2>
<h2 id="leastsquareconformalmaps">Least squares conformal maps</h2>
<p>Least squares conformal maps parametrization <a class="citation" href="#fn:17" title="Jump to citation">[17]<span class="citekey" style="display:none">levy_2002</span></a> minimizes the
conformal (angular) distortion of the parametrization. Differently from
@@ -1795,7 +1795,7 @@ with texture, (right) UV parametrization" />
<figcaption>(<a href="502_LSCMParam/main.cpp">Example 502</a>) LSCM parametrization. (left) mesh
with texture, (right) UV parametrization</figcaption></figure>
<h2 id="503">As-rigid-as-possible parametrization</h2>
<h2 id="asrigidaspossible">As-rigid-as-possible parametrization</h2>
<p>As-rigid-as-possible parametrization <a class="citation" href="#fn:19" title="Jump to citation">[19]<span class="citekey" style="display:none">liu_2008</span></a> is a powerful single-patch,
non-linear algorithm to compute a parametrization that strives to preserve
@@ -1821,7 +1821,7 @@ texture" />
(left) mesh with texture, (right) UV parametrization with
texture</figcaption></figure>
<h2 id="504">N-rotationally symmetric tangent fields</h2>
<h2 id="nrotationallysymmetrictangetfields">N-rotationally symmetric tangent fields</h2>
<p>The design of tangent fields is a basic tool used to design guidance fields for
uniform quadrilateral and hexahedral remeshing. Libigl contains an
@@ -1861,10 +1861,10 @@ N are of different types and they appear in different positions.</p>
504</a>, where the degree of the field can be change
pressing the number keys. <code>igl::nrosy</code> implements the algorithm proposed in
<a class="citation" href="#fn:21" title="Jump to citation">[21]<span class="citekey" style="display:none">bommes_2009</span></a>. N-RoSy fields can also be interpolated with the algorithm
proposed in <a class="citation" href="#fn:22" title="Jump to citation">[22]<span class="citekey" style="display:none">knoppel_2013</span></a>, see Section <a href="#507">507</a> for more details
proposed in <a class="citation" href="#fn:22" title="Jump to citation">[22]<span class="citekey" style="display:none">knoppel_2013</span></a>, see Section <a href="#npolyvectorfields">npolyvectorfields</a> for more details
(<a href="../include/igl/n_polyvector.h">igl::n_polyvector</a>).</p>
<h3 id="505">Global, seamless integer-grid parametrization</h3>
<h3 id="globalseamlessintegergridparametrization">Global, seamless integer-grid parametrization</h3>
<p>The previous parametrization methods were focusing on creating parametrizations
of surface patches aimed at texture mapping or baking of other surface
@@ -1962,7 +1962,7 @@ it contains many overlaps.</p>
<a href="https://github.com/hcebke/libQEx">libQEx</a> (not included in libigl).
The full pipeline is implemented in <a href="505_MIQ/main.cpp">Example 505</a>.</p>
<h2 id="506">Anisotropic remeshing</h2>
<h2 id="anisotropicremeshingusingframefields">Anisotropic remeshing</h2>
<p>Anisotropic and non-uniform quad remeshing is important to concentrate the
elements in the regions with more details. It is possible to extend the MIQ
@@ -2019,7 +2019,7 @@ generate the UV parametrization, but other algorithms could be applied: the
only desiderata is that the generated quad mesh should be as isotropic as
possible.</p>
<h2 id="507">N-PolyVector fields</h2>
<h2 id="npolyvectorfields">N-PolyVector fields</h2>
<p>N-RoSy vector fields can be further generalized to represent arbitrary
vector-sets, with arbitrary angles between them and with arbitrary lengths
@@ -2040,7 +2040,7 @@ PolyVector fields. If the constraints are taken from an N-RoSy field,
<code>igl::n_polyvector</code> generates a field that is equivalent, after normalization,
to a globally optimal direction field.</p>
<h2 id="508">Conjugate vector fields</h2>
<h2 id="conjugatevectorfields">Conjugate vector fields</h2>
<p>Two tangent vectors lying on a face of a triangle mesh are conjugate if</p>
@@ -2065,7 +2065,7 @@ closest conjugate field (<a href="508_ConjugateField/main.cpp">Example 508</a>).
<figcaption>A smooth 4-PolyVector field (left) is deformed to become a conjugate field
(right).</figcaption></figure>
<h2 id="509">Planarization</h2>
<h2 id="planarization">Planarization</h2>
<p>A quad mesh can be transformed in a planar quad mesh with Shape-Up
<a class="citation" href="#fn:26" title="Jump to citation">[26]<span class="citekey" style="display:none">bouaziz_2012</span></a>, a local/global approach that uses the global step to enforce
@@ -2082,12 +2082,12 @@ quads." />
igl::palanarize (right). The colors represent the planarity of the
quads.</figcaption></figure>
<h1 id="600">Chapter 6: External libraries</h1>
<h1 id="chapter6:externallibraries">Chapter 6: External libraries</h1>
<p>An additional positive side effect of using matrices as basic types is that it
is easy to exchange data between libigl and other softwares and libraries.</p>
<h2 id="601">State serialization</h2>
<h2 id="stateserialization">State serialization</h2>
<p>Geometry processing applications often require a considerable amount of
computational time and/or manual input. Serializing the state of the application is a simple strategy to greatly increase the development efficiency. It allows to quickly start debugging just
@@ -2206,7 +2206,7 @@ common to have to do small changes to figures, and being able to serialize the
entire state just before you take screenshots will save you many painful hours
before a submission deadline.</p>
<h2 id="602">Mixing Matlab code</h2>
<h2 id="mixingmatlabcode">Mixing Matlab code</h2>
<p>Libigl can be interfaced with Matlab to offload numerically heavy computation
to a Matlab script. The major advantage of this approach is that you will be
@@ -2330,7 +2330,7 @@ L = sparse(LIJV(:,1),LIJV(:,2),LIJV(:,3));
<p>which is easily copied and pasted into Matlab for debugging, etc.</p>
<h2 id="603">Calling libigl functions from Matlab</h2>
<h2 id="callinglibiglfunctionsfrommatlab">Calling libigl functions from Matlab</h2>
<p>It is also possible to call libigl functions from matlab, compiling them as MEX
functions. This can be used to offload to C++ code the computationally
@@ -2341,7 +2341,7 @@ We plan to provide wrappers for all our functions in the future, if you are
interested in this feature (or if you want to help implementing it) please let
us know.</p>
<h2 id="604">Triangulation of closed polygons</h2>
<h2 id="triangulationofclosedpolygons">Triangulation of closed polygons</h2>
<p>The generation of high-quality triangle and tetrahedral meshes is a very common
task in geometry processing. We provide wrappers in libigl to
@@ -2365,7 +2365,7 @@ in its interior) is triangulated.</p>
<img src="images/604_Triangle.png" alt="Triangulation of the interior of a polygon." />
<figcaption>Triangulation of the interior of a polygon.</figcaption></figure>
<h2 id="605">Tetrahedralization of closed surfaces</h2>
<h2 id="tetrahedralizationofclosedsurfaces">Tetrahedralization of closed surfaces</h2>
<p>Similarly, the interior of a closed manifold surface can be tetrahedralized
using the function <code>igl::tetrahedralize</code> which wraps the Tetgen library (<a href="605_Tetgen/main.c">Example
@@ -2378,7 +2378,7 @@ using the function <code>igl::tetrahedralize</code> which wraps the Tetgen libra
<img src="images/605_Tetgen.png" alt="Tetrahedralization of the interior of a surface mesh." />
<figcaption>Tetrahedralization of the interior of a surface mesh.</figcaption></figure>
<h2 id="606">Baking ambient occlusion</h2>
<h2 id="bakingambientocclusion">Baking ambient occlusion</h2>
<p><a href="http://en.wikipedia.org/wiki/Ambient_occlusion">Ambient occlusion</a> is a
rendering technique used to calculate the exposure of each point in a surface
@@ -2414,7 +2414,7 @@ occlusion." />
<figcaption>A mesh rendered without (left) and with (right) ambient
occlusion.</figcaption></figure>
<h2 id="607">Picking</h2>
<h2 id="pickingverticesandfaces">Picking</h2>
<p>Picking vertices and faces using the mouse is very common in geometry
processing applications. While this might seem a simple operation, its
@@ -2448,7 +2448,7 @@ vertices are colored in red." />
<figcaption>(<a href="607_Picking/main.cpp">Example 607</a>) Picking via ray casting. The selected
vertices are colored in red.</figcaption></figure>
<h2 id="608">Locally Injective Maps</h2>
<h2 id="locallyinjectivemaps">Locally Injective Maps</h2>
<p>Extreme deformations or parametrizations with high-distortion might flip
elements. This is undesirable in many applications, and it is possible to
@@ -2465,7 +2465,7 @@ editing plus the anti-flipping constraints (right)." />
<figcaption>A mesh (left) deformed using Laplacian editing (middle) and with Laplacian
editing plus the anti-flipping constraints (right).</figcaption></figure>
<h2 id="609">Boolean operations on meshes</h2>
<h2 id="booleanoperationsonmeshes">Boolean operations on meshes</h2>
<p>Constructive solid geometry (CSG) is a technique to define a complex surface as
the result of a number of set operations on solid regions of space: union,
@@ -2552,14 +2552,14 @@ together coincident vertices, maintaining original triangle orientations.</p>
<a href="https://github.com/gilbo/cork">cork</a>, which is typically faster, but is not
always robust.</p>
<h1 id="700">Miscellaneous</h1>
<h1 id="chapter7:miscellaneous">Miscellaneous</h1>
<p>Libigl contains a <em>wide</em> variety of geometry processing tools and functions for
dealing with meshes and the linear algebra related to them: far too many to
discuss in this introductory tutorial. We&#8217;ve pulled out a couple of the
interesting functions in this chapter to highlight.</p>
<h2 id="701">Mesh Statistics</h2>
<h2 id="meshstatistics">Mesh Statistics</h2>
<p>Libigl contains various mesh statistics, including face angles, face areas and
the detection of singular vertices, which are vertices with more or less than 6
@@ -2594,10 +2594,10 @@ the angles are to 60 degrees the more stable will the optimization be. In this
case, it is clear that the mesh is of bad quality and it will probably result
in artifacts if used for solving PDEs.</p>
<h2 id="702">Generalized Winding Number</h2>
<h2 id="generalizedwindingnumber">Generalized Winding Number</h2>
<p>The problem of tetrahedralizing the interior of closed watertight surface mesh
is a difficult, but well-posed problem (see our <a href="#605">Tetgen wrappers</a>). But
is a difficult, but well-posed problem (see our <a href="#tetrahedralizationofclosedsurfaces">Tetgen wrappers</a>). But
black-box tet-meshers like TetGen will <em>refuse</em> input triangle meshes with
self-intersections, open boundaries, non-manifold edges from multiple connected
components.
@@ -2635,20 +2635,20 @@ oriented), then <span class="math">\(w(\mathbf{p})\)</span> tends smoothly towar
<em>more</em> inside <code>(V,F)</code>, and toward 0 as <span class="math">\(\mathbf{p}\)</span> is more outside.</p>
<figure>
<img src="images/big-sigcat-winding-number.gif" alt="Example 702_WindingNumber computes the
<img src="images/big-sigcat-winding-number.gif" alt="Example generalizedwindingnumber_WindingNumber computes the
generalized winding number function for a tetrahedral mesh inside a cat with
holes and self intersections (gold). The silver mesh is surface of the
extracted interior tets, and slices show the winding number function on all
tets in the convex hull: blue (~0), green (~1), yellow
(~2)." />
<figcaption>Example <a href="702_WindingNumber/main.cpp">702_WindingNumber</a> computes the
<figcaption>Example <a href="702_WindingNumber/main.cpp">generalizedwindingnumber_WindingNumber</a> computes the
generalized winding number function for a tetrahedral mesh inside a cat with
holes and self intersections (gold). The silver mesh is surface of the
extracted interior tets, and slices show the winding number function on all
tets in the convex hull: blue (~0), green (~1), yellow
(~2).</figcaption></figure>
<h2 id="703">Mesh Decimation</h2>
<h2 id="meshdecimation">Mesh Decimation</h2>
<p>The study of mesh simplification or <em>decimation</em> is nearly as old as meshes
themselves. Given a high resolution mesh with too many triangles, find a &#8220;well