title: libigl Tutorial author: Alec Jacobson date: 17 June 2015 css: tutorial/style.css html header: # Libigl version tracking Version | Short description --------|---------------------------------------------------------------------- 1.2.1 | Reorganization opengl-dependent functions: opengl and opengl2 extras 1.2.0 | Reorganization of "extras", rm deprecated funcs, absorb boost & svd3x3 1.1.7 | Switch build for static library to cmake. 1.1.6 | Major boolean robustness fix, drop CGAL dependency for AABB/distances 1.1.5 | Bug fix in booleans 1.1.4 | Edge collapsing and linear program solving 1.1.3 | Bug fixes in active set and boundary_conditions 1.1.1 | PLY file format support 1.1.0 | Mesh boolean operations using CGAL and cork, implementing [Attene 14] 1.0.3 | Bone heat method 1.0.2 | Bug fix in winding number code 1.0.1 | Bug fixes and more CGAL support 1.0.0 | Major beta release: many renames, tutorial, triangle, org. build 0.4.6 | Generalized Winding Numbers 0.4.5 | CGAL extra: mesh selfintersection 0.4.4 | STL file format support 0.4.3 | ARAP implementation 0.4.1 | Migrated much of the FAST code including extra for Sifakis' 3x3 svd 0.4.0 | Release under MPL2 license 0.3.7 | Embree2.0 support 0.3.6 | boost extra, patches, mosek 7 support, libiglbbw (mosek optional) 0.3.5 | More examples, naive primitive sorting 0.3.3 | Many more examples, ambient occlusion with Embree. 0.3.1 | Linearly dependent constraints in min_quad_with_fixed, SparseQR buggy 0.3.0 | Better active set method support 0.2.3 | More explicits, active set method, opengl/anttweakbar guards 0.2.2 | More explicit instanciations, faster sorts and uniques 0.2.1 | Bug fixes in barycenter and doublearea found by Martin Bisson 0.2.0 | XML serializer more stable and fixed bug in remove_duplicate_vertices 0.1.8 | Embree and xml (windows only) extras 0.1.5 | Compilation on windows, bug fix for compilation with cygwin 0.1.1 | Alpha release with core functions, extras, examples ## Version 1.2 Changes ## This change introduces better organization of dependencies and removes some deprecated/repeated functions. The 3x3 svd code and dependent functions (including ARAP) were absorbed into the main library. Similarly, the boost dependency extra was absorbed. ### External libraries as git subrepos ### The core functionality of libigl (still) just depends on stl, c++11 and Eigen. There are additional _optional_ dependencies (e.g. CGAL, embree, glfw, tetgen, triangle). Libigl functions using these are located (still) in sub-folders of the include directory (e.g. `include/igl/cgal/`, `include/igl/embree/`). Prior to version 1.2 we included copies of the code for some of these dependencies in the `external/` directory. As of version 1.2, these have been replaced with git sub-repos. If you have cloned libigl _before version 1.2_ then you should issue git submodule update --init --recursive ### Deprecated/repeated functions ### Old | New --------------------------------------- | ----------------------------------- `igl::angles` | `igl::internal_angles` `igl::get_modifiers` | [deleted] `igl::nchoosek(offset,K,N,std::vector)` | `igl::nchoosek(Eigen,K,Eigen)` `#include ` | `#include ` `#include ` | `#include ` `#include ` | `#include ` `#include ` | `#include ` `#include ` | `#include ` `#include ` | `#include ` `#include ` | `#include ` `#include ` | `#include ` `#include ` | `#include ` `#include ` | `#include ` ## Version 1.0 Changes ## Our beta release marks our confidence that this library can be used outside of casual experimenting. To maintain order, we have made a few changes which current users should read and adapt their code accordingly. ### Renamed functions ### The following table lists functions which have changed name as of version 1.0.0: Old | New -------------------------------- | ------------------------------------- `igl::add_barycenter` | `igl::false_barycentric_subdivision` `igl::areamatrix` | `igl::vector_area_matrix` `igl::barycentric2global` | `igl::barycentric_to_global` `igl::boundary_faces` | `igl::boundary_facets` `igl::boundary_vertices_sorted` | `igl::boundary_loop` `igl::cotangent` | `igl::cotmatrix_entries` `igl::edgetopology` | `igl::edge_topology` `igl::gradMat` | `igl::grad` `igl::is_manifold` | `igl::is_edge_manifold` `igl::mexStream` | `igl::MexStream` `igl::moveFV` | `igl::average_onto_vertices` `igl::moveVF` | `igl::average_onto_faces` `igl::plot_vector` | `igl::print_vector` `igl::pos` | `igl::HalfEdgeIterator` `igl::plane_project` | `igl::project_isometrically_to_plane` `igl::project_points_mesh` | `igl::line_mesh_intersection` `igl::read` | `igl::read_triangle_mesh` `igl::removeDuplicates.cpp` | `igl::remove_duplicates` `igl::removeUnreferenced` | `igl::remove_unreferenced` `igl::tt` | `igl::triangle_triangle_adjacency` `igl::vf` | `igl::vertex_triangle_adjacency` `igl::write` | `igl::write_triangle_mesh` `igl::manifold_patches` | `igl::orientable_patches` `igl::selfintersect` | `igl::remesh_self_intersections` `igl::project_mesh` | `igl::line_mesh_intersection` `igl::triangulate` | `igl::polygon_mesh_to_triangle_mesh` `igl::is_manifold` | `igl::is_edge_manifold` `igl::triangle_wrapper` | `igl::triangulate` ### Miscellaneous ### - To match interfaces provided by (all) other quadratic optimization libraries, `igl::min_quad_with_fixed` and `igl::active_set` now expect as input twice the quadratic coefficients matrix, i.e. the Hessian. For example, `igl::min_quad_with_fixed(H,B,...)` minimizes $\frac{1}{2}x^T H x+x^T B$. - We have inverted the `IGL_HEADER_ONLY` macro to `IGL_STATIC_LIBRARY`. To compile using libigl as a header-only library, simply include headers and libigl in the header search path. To link to libigl, you must define the `IGL_STATIC_LIBRARY` macro at compile time and link to the `libigl*.a` libraries. - Building libigl as a static library is now more organized. There is a `build/` directory with Makefiles for the main library (`Makefile`) and each dependency (e.g. `Makefile_mosek` for `libiglmosek.a`) - `igl::polar_svd` now always returns a rotation in `R`, never a reflection. This mirrors the behavior of `igl::polar_svd3x3`. Consequently the `T` part may have negative skews. - We have organized the static library build - The previous `igl::grad` function, which computed the per-triangle gradient of a per-vertex scalar function has been replaced. Now `igl::grad` computes the linear operator (previous computed using `igl::gradMat`). The gradient values can still be recovered by multiplying the operator against the scalar field as a vector and reshaping to have gradients per row. - `MASSMATRIX_*` has become `MASSMATRIX_TYPE_*` - The function `igl::project_normals`, which cast a line for each vertex of mesh _A_ in the normal direction and found the closest intersection along these lines with mesh _B_, has been removed.