added tips for windows build
updated tutorials added Ultrecht added Amir as contributor
This commit is contained in:
+41
-20
@@ -115,6 +115,7 @@ lecture notes links to a cross-platform example application.</p>
|
||||
<li><a href="#conjugatevectorfields">508 Conjugate vector fields</a></li>
|
||||
<li><a href="#planarization">509 Planarization</a></li>
|
||||
<li><a href="#integrable">510 Integrable PolyVector Fields</a></li>
|
||||
<li><a href="#npolyvectorfields_general">511 General N-PolyVector Fields</a></li>
|
||||
</ul></li>
|
||||
<li><a href="#chapter6:externallibraries">Chapter 6: External libraries</a>
|
||||
|
||||
@@ -219,6 +220,9 @@ sudo apt-get install libxmu-dev
|
||||
sudo apt-get install libblas-dev
|
||||
</code></pre>
|
||||
|
||||
<p><em>Note for windows users</em>: libigl only supports the Microsoft Visual Studio 2015 compiler in 64bit mode. It will not work with a 32bit build and it will not work
|
||||
with older versions of visual studio.</p>
|
||||
|
||||
<p>A few examples in Chapter 5 requires the <a href="http://www.graphics.rwth-aachen.de/software/comiso">CoMiSo
|
||||
solver</a>. We provide a
|
||||
mirror of CoMISo that works out of the box with libigl. To install it:</p>
|
||||
@@ -2407,6 +2411,19 @@ of the parameterization functions (which are tangent vector fields on the surfac
|
||||
|
||||
<p>This method retains much of the core principles of the polyvector framework - it expresses the condition for zero discrete curl condition (which typically requires integers for the vector matchings) into a condition involving continuous variables only. This is done using coefficients of appropriately defined polynomials. The parameterizations generated by the resulting fields are exactly aligned to the field directions and contain no inverted triangles.</p>
|
||||
|
||||
<h2 id="npolyvectorfields_general"><a href="#npolyvectorfields_general">General N-PolyVector fields</a></h2>
|
||||
|
||||
<p>While mostly applicable for the design of symmetric fields (i.e. fields that comprise of vector sets with symmetries between them at each point, e.g. N-RoSy or frame-fields), the framework presented in <a class="citation" href="#fn:29" title="Jump to citation">[29]<span class="citekey" style="display:none">diamanti_2014</span></a> can be used to design completely general fields, with possibly no such symmetries. For example, one can design fields that at each point comprise of an arbitrary number of vectors, not required to be collinear - as opposed e.g. to the case of the 4 pairwise-collinear vectors designed in the example (<a href="507_PolyVectorField/main.cpp">Example 507</a>). This capability is implemented in the function igl::n_polyvector_general, and is illustrated in the example (<a href="511_PolyVectorFieldGeneral/main.cpp">Example 511</a>).</p>
|
||||
|
||||
<figure>
|
||||
<img src="images/511_PolyVectorFieldGeneral.png" alt="Interpolation of a general field with 3 (left) and 9 vectors per point field from a sparse set of random constraints (in red). The field is defined on all mesh faces, but is only shown on a subset for clarity. " />
|
||||
<figcaption>Interpolation of a general field with 3 (left) and 9 vectors per point field from a sparse set of random constraints (in red). The field is defined on all mesh faces, but is only shown on a subset for clarity. </figcaption>
|
||||
</figure>
|
||||
|
||||
<p>The design of these general directional fields (also called vector-set fields) is based on the same polynomial framework and includes the symmetric fields as a special case. Note that in the case that some symmetries do exist in the constraints, the final field is not guaranteed to have these symmetries everywhere else on the mesh. For example, designing a field with 3 vectors per point where, at the constrained faces, two of the vectors are on a line opposite to each other, we are not guaranteed to always have two pairwise-collinear vectors everywhere in the result, as can be seen in the picture. In some cases however (as is the case of the frame field in the previous example <a href="507_PolyVectorField/main.cpp">Example 507</a>) these symmetries are in fact guaranteed due to the particular nature of the polynomial that applies in that case (two coefficients are 0).</p>
|
||||
|
||||
<p>For a complete categorization of fields used in various applications (including these general ones) see Vaxman et al. 2016 <a class="citation" href="#fn:33" title="Jump to citation">[33]<span class="citekey" style="display:none">vaxman_2016</span></a>.</p>
|
||||
|
||||
<h1 id="chapter6:externallibraries">Chapter 6: External libraries</h1>
|
||||
|
||||
<p>An additional positive side effect of using matrices as basic types is that it
|
||||
@@ -2778,7 +2795,7 @@ elements. This is undesirable in many applications, and it is possible to
|
||||
avoid it by introducing a non-linear constraints that guarantees that the area
|
||||
of every element remain positive.</p>
|
||||
|
||||
<p>Libigl can be used to compute Locally Injective Maps <a class="citation" href="#fn:33" title="Jump to citation">[33]<span class="citekey" style="display:none">schuller_2013</span></a> using a variety of
|
||||
<p>Libigl can be used to compute Locally Injective Maps <a class="citation" href="#fn:34" title="Jump to citation">[34]<span class="citekey" style="display:none">schuller_2013</span></a> using a variety of
|
||||
deformation energies. A simple deformation of a 2D grid is computed in <a href="608_LIM/main.cpp">Example
|
||||
608</a>.</p>
|
||||
|
||||
@@ -2832,7 +2849,7 @@ compute robustly with boundary representations, but are nonetheless useful.</p>
|
||||
|
||||
<p>To compute a boolean operation on a triangle mesh with vertices <code>VA</code> and
|
||||
triangles <code>FA</code> and another mesh <code>VB</code> and <code>FB</code>, libigl first computes a unified
|
||||
“mesh arrangement” (see <a class="citation" href="#fn:34" title="Jump to citation">[34]<span class="citekey" style="display:none">zhou_2016</span></a>) with vertices <code>V</code> and triangles <code>F</code> where all triangle-triangle
|
||||
“mesh arrangement” (see <a class="citation" href="#fn:35" title="Jump to citation">[35]<span class="citekey" style="display:none">zhou_2016</span></a>) with vertices <code>V</code> and triangles <code>F</code> where all triangle-triangle
|
||||
intersections have been “resolved”. That is, edges and vertices are added
|
||||
exactly at the intersection lines, so the resulting <em>non-manifold</em> mesh <code>(V,F)</code>
|
||||
has no self-intersections.</p>
|
||||
@@ -2982,7 +2999,7 @@ mesh and which are outside. That is, which should be kept and which should be
|
||||
removed.</p>
|
||||
|
||||
<p>The “Generalized Winding Number” is a robust method for determined
|
||||
inside and outside for troublesome meshes <a class="citation" href="#fn:35" title="Jump to citation">[35]<span class="citekey" style="display:none">jacobson_2013</span></a>. The generalized
|
||||
inside and outside for troublesome meshes <a class="citation" href="#fn:36" title="Jump to citation">[36]<span class="citekey" style="display:none">jacobson_2013</span></a>. The generalized
|
||||
winding number with respect to <code>(V,F)</code> at some point <span class="math">\(\mathbf{p} \in
|
||||
\mathcal{R}^3\)</span> is defined as scalar function:</p>
|
||||
|
||||
@@ -3025,7 +3042,7 @@ methods are fairly advanced.</p>
|
||||
|
||||
<p>One family of mesh decimation methods operates by successively remove elements
|
||||
from the mesh. In particular, Hoppe advocates for successively remove or rather
|
||||
collapsing edges <a class="citation" href="#fn:36" title="Jump to citation">[36]<span class="citekey" style="display:none">hoppe_1996</span></a>. The generic form of this technique is to
|
||||
collapsing edges <a class="citation" href="#fn:37" title="Jump to citation">[37]<span class="citekey" style="display:none">hoppe_1996</span></a>. The generic form of this technique is to
|
||||
construct a sequence of n meshes from the initial high-resolution mesh <span class="math">\(M_0\)</span> to
|
||||
the lowest resolution mesh <span class="math">\(M_n\)</span> by collapsing a single edge:</p>
|
||||
|
||||
@@ -3226,8 +3243,8 @@ tree.squared_distance(V,F,P,sqrD,I,C);
|
||||
|
||||
<p>Finally, from the closest point or the winding number it’s possible to <em>sign</em>
|
||||
this distance. In <code>igl::signed_distance</code> we provide two methods for signing:
|
||||
the so-called “pseudo-normal test” <a class="citation" href="#fn:37" title="Jump to citation">[37]<span class="citekey" style="display:none">baerentzen_2005</span></a> and the generalized
|
||||
winding number <a class="citation" href="#fn:35" title="Jump to citation">[35]<span class="citekey" style="display:none">jacobson_2013</span></a>.</p>
|
||||
the so-called “pseudo-normal test” <a class="citation" href="#fn:38" title="Jump to citation">[38]<span class="citekey" style="display:none">baerentzen_2005</span></a> and the generalized
|
||||
winding number <a class="citation" href="#fn:36" title="Jump to citation">[36]<span class="citekey" style="display:none">jacobson_2013</span></a>.</p>
|
||||
|
||||
<p>The pseudo-normal test (see also <code>igl::pseudonormal_test</code>) assumes the input
|
||||
mesh is a watertight (closed, non-self-intersecting, manifold) mesh. Then given
|
||||
@@ -3271,7 +3288,7 @@ iso-surface at value <span class="math">\(v\)</span> is composed of all points <
|
||||
processing is to extract an iso-surface as a triangle mesh for further
|
||||
mesh-based processing or visualization. This is referred to as iso-contouring.</p>
|
||||
|
||||
<p>“Marching Cubes” <a class="citation" href="#fn:38" title="Jump to citation">[38]<span class="citekey" style="display:none">lorensen_1987</span></a> is a <a href="https://en.wikipedia.org/wiki/Marching_cubes">famous
|
||||
<p>“Marching Cubes” <a class="citation" href="#fn:39" title="Jump to citation">[39]<span class="citekey" style="display:none">lorensen_1987</span></a> is a <a href="https://en.wikipedia.org/wiki/Marching_cubes">famous
|
||||
method</a> for iso-contouring
|
||||
tri-linear functions <span class="math">\(f\)</span> on a regular lattice (aka grid). The core idea of this
|
||||
method is to contour the iso-surface passing through each cell (if it does at
|
||||
@@ -3322,7 +3339,7 @@ enforce a consistent facet orientation in the output faces <code>FF</code>.</p>
|
||||
<p>For (closed or nearly closed) surfaces representing the boundary of a solid
|
||||
object, libigl provides a routine to reorient faces so that the vertex ordering
|
||||
corresponds to a counter-clockwise ordering of the vertices with a
|
||||
right-hand-rule normal pointing outward. This method <a class="citation" href="#fn:39" title="Jump to citation">[39]<span class="citekey" style="display:none">takayama14</span></a> assumes
|
||||
right-hand-rule normal pointing outward. This method <a class="citation" href="#fn:40" title="Jump to citation">[40]<span class="citekey" style="display:none">takayama14</span></a> assumes
|
||||
that <a href="https://www.reddit.com/r/askscience/comments/32otgx/which_as_a_is_more_empty_an_atom_or_the_universe/">most of the universe is
|
||||
empty</a>.
|
||||
That is, most points in space are outside of the solid object than inside.
|
||||
@@ -3383,11 +3400,11 @@ discretizing time at a finite step of steps <span class="math">\([0,\Delta t,2\D
|
||||
and by 2) discretizing space with a regular grid and representing the distance
|
||||
field using trilinear interpolation of grid values. Finally the output mesh,
|
||||
<span class="math">\(\partial S\)</span> is approximated by contouring using Marching Cubes
|
||||
<a class="citation" href="#fn:38" title="Jump to citation">[38]<span class="citekey" style="display:none">lorensen_1987</span></a>.</p>
|
||||
<a class="citation" href="#fn:39" title="Jump to citation">[39]<span class="citekey" style="display:none">lorensen_1987</span></a>.</p>
|
||||
|
||||
<p>This method is similar to one described by Schroeder et al. in 1994
|
||||
<a class="citation" href="#fn:40" title="Jump to citation">[40]<span class="citekey" style="display:none">schroeder_1994</span></a>, and the one used in conjunction with boolean operations by
|
||||
Garg et al. 2016 <a class="citation" href="#fn:41" title="Jump to citation">[41]<span class="citekey" style="display:none">garg_2016</span></a>.</p>
|
||||
<a class="citation" href="#fn:41" title="Jump to citation">[41]<span class="citekey" style="display:none">schroeder_1994</span></a>, and the one used in conjunction with boolean operations by
|
||||
Garg et al. 2016 <a class="citation" href="#fn:42" title="Jump to citation">[42]<span class="citekey" style="display:none">garg_2016</span></a>.</p>
|
||||
|
||||
<p>In libigl, if your input solid’s surface is represented by <code>(V,F)</code> then the
|
||||
output surface mesh will be <code>(SV,SF)</code> after calling:</p>
|
||||
@@ -3667,53 +3684,57 @@ repository</a>.</p>
|
||||
Sorkine-Hornung. <a href="http://igl.ethz.ch/projects/integrable/">Integrable PolyVector Fields</a>, 2015</p>
|
||||
</li>
|
||||
|
||||
<li id="fn:33" class="citation"><span class="citekey" style="display:none">schuller_2013</span><p>Christian Schüller, Ladislav Kavan, Daniele Panozzo, Olga
|
||||
<li id="fn:33" class="citation"><span class="citekey" style="display:none">vaxman_2016</span><p>Amir Vaxman, Marcel Campen, Olga Diamanti, Daniele Panozzo, David Bommes, Klaus Hildebrandt, Mirela Ben-Chen. <a href="https://www.google.com/search?q=Directional+Field+Synthesis+Design+and+Processing">Directional Field Synthesis, Design, and Processing</a>,
|
||||
2016</p>
|
||||
</li>
|
||||
|
||||
<li id="fn:34" class="citation"><span class="citekey" style="display:none">schuller_2013</span><p>Christian Schüller, Ladislav Kavan, Daniele Panozzo, Olga
|
||||
Sorkine-Hornung. <a href="http://igl.ethz.ch/projects/LIM/">Locally Injective
|
||||
Mappings</a>, 2013.</p>
|
||||
</li>
|
||||
|
||||
<li id="fn:34" class="citation"><span class="citekey" style="display:none">zhou_2016</span><p>Qingnan Zhou, Eitan Grinspun, Denis Zorin. <a href="https://www.google.com/search?q=Mesh+Arrangements+for+Solid+Geometry">Mesh Arrangements for
|
||||
<li id="fn:35" class="citation"><span class="citekey" style="display:none">zhou_2016</span><p>Qingnan Zhou, Eitan Grinspun, Denis Zorin. <a href="https://www.google.com/search?q=Mesh+Arrangements+for+Solid+Geometry">Mesh Arrangements for
|
||||
Solid
|
||||
Geometry</a>,
|
||||
2016</p>
|
||||
</li>
|
||||
|
||||
<li id="fn:35" class="citation"><span class="citekey" style="display:none">jacobson_2013</span><p>Alec Jacobson, Ladislav Kavan, and Olga Sorkine.
|
||||
<li id="fn:36" class="citation"><span class="citekey" style="display:none">jacobson_2013</span><p>Alec Jacobson, Ladislav Kavan, and Olga Sorkine.
|
||||
<a href="https://www.google.com/search?q=Robust+Inside-Outside+Segmentation+using+Generalized+Winding+Numbers">Robust Inside-Outside Segmentation using Generalized Winding
|
||||
Numbers</a>,
|
||||
2013.</p>
|
||||
</li>
|
||||
|
||||
<li id="fn:36" class="citation"><span class="citekey" style="display:none">hoppe_1996</span><p>Hugues Hoppe. <a href="https://www.google.com/search?q=Progressive+meshes">Progressive
|
||||
<li id="fn:37" class="citation"><span class="citekey" style="display:none">hoppe_1996</span><p>Hugues Hoppe. <a href="https://www.google.com/search?q=Progressive+meshes">Progressive
|
||||
Meshes</a>, 1996</p>
|
||||
</li>
|
||||
|
||||
<li id="fn:37" class="citation"><span class="citekey" style="display:none">baerentzen_2005</span><p>J Andreas Baerentzen and Henrik Aanaes.
|
||||
<li id="fn:38" class="citation"><span class="citekey" style="display:none">baerentzen_2005</span><p>J Andreas Baerentzen and Henrik Aanaes.
|
||||
<a href="https://www.google.com/search?q=Signed+distance+computation+using+the+angle+weighted+pseudonormal">Signed distance computation using the angle weighted
|
||||
pseudonormal</a>,
|
||||
2005.</p>
|
||||
</li>
|
||||
|
||||
<li id="fn:38" class="citation"><span class="citekey" style="display:none">lorensen_1987</span><p>W.E. Lorensen and Harvey E. Cline. <a href="https://www.google.com/search?q=Marching+cubes:+A+high+resolution+3d+surface+construction+algorithm">Marching cubes: A high
|
||||
<li id="fn:39" class="citation"><span class="citekey" style="display:none">lorensen_1987</span><p>W.E. Lorensen and Harvey E. Cline. <a href="https://www.google.com/search?q=Marching+cubes:+A+high+resolution+3d+surface+construction+algorithm">Marching cubes: A high
|
||||
resolution 3d surface construction
|
||||
algorithm</a>,
|
||||
1987.</p>
|
||||
</li>
|
||||
|
||||
<li id="fn:39" class="citation"><span class="citekey" style="display:none">takayama14</span><p>Kenshi Takayama, Alec Jacobson, Ladislav Kavan, Olga
|
||||
<li id="fn:40" class="citation"><span class="citekey" style="display:none">takayama14</span><p>Kenshi Takayama, Alec Jacobson, Ladislav Kavan, Olga
|
||||
Sorkine-Hornung. <a href="https://www.google.com/search?q=A+Simple+Method+for+Correcting+Facet+Orientations+in+Polygon+Meshes+Based+on+Ray+Casting">A Simple Method for Correcting Facet Orientations in
|
||||
Polygon Meshes Based on Ray
|
||||
Casting</a>,
|
||||
2014.</p>
|
||||
</li>
|
||||
|
||||
<li id="fn:40" class="citation"><span class="citekey" style="display:none">schroeder_1994</span><p>William J. Schroeder, William E. Lorensen, and Steve
|
||||
<li id="fn:41" class="citation"><span class="citekey" style="display:none">schroeder_1994</span><p>William J. Schroeder, William E. Lorensen, and Steve
|
||||
Linthicum. <a href="https://www.google.com/search?q=implicit+modeling+of+swept+surfaces+and+volumes">Implicit Modeling of Swept Surfaces and
|
||||
Volumes</a>,
|
||||
1994.</p>
|
||||
</li>
|
||||
|
||||
<li id="fn:41" class="citation"><span class="citekey" style="display:none">garg_2016</span><p>Akash Garg, Alec Jacobson, Eitan Grinspun. <a href="https://www.google.com/search?q=Computational+Design+of+Reconfigurables">Computational Design
|
||||
<li id="fn:42" class="citation"><span class="citekey" style="display:none">garg_2016</span><p>Akash Garg, Alec Jacobson, Eitan Grinspun. <a href="https://www.google.com/search?q=Computational+Design+of+Reconfigurables">Computational Design
|
||||
of
|
||||
Reconfigurables</a>,
|
||||
2016</p>
|
||||
|
||||
Reference in New Issue
Block a user