https://github.com/libigl/libigl/
libigl is a simple C++ geometry processing library. We have a wide functionality including construction of sparse discrete differential geometry operators and finite-elements matrices such as the cotangent Laplacian and diagonalized mass matrix, simple facet and edge-based topology data structures, mesh-viewing utilities for OpenGL and GLSL, and many core functions for matrix manipulation which make Eigen feel a lot more like MATLAB.
It is first and foremost a header library. Each header file contains a single function. Most are tailored to operate on a generic triangle mesh stored in an n-by-3 matrix of vertex positions V and an m-by-3 matrix of triangle indices F. The library may also be compiled into a statically linked library, for faster compile times with your projects.
We use the Eigen library heavily in our code. Our group prototypes a lot in MATLAB, and we have a useful conversion table from MATLAB to libigl/Eigen.
As of version 1.0, libigl includes an introductory tutorial that covers its basic functionalities.
Libigl is a header library. You do not need to build anything to install.
Simply add igl/
to your include path and include relevant headers. Here is a
small "Hello, World" program:
#include <igl/cotmatrix.h>
#include <Eigen/Dense>
#include <Eigen/Sparse>
#include <iostream>
int main()
{
Eigen::MatrixXd V(4,2);
V<<0,0,
1,0,
1,1,
0,1;
Eigen::MatrixXi F(2,3);
F<<0,1,2,
0,2,3;
Eigen::SparseMatrix<double> L;
igl::cotmatrix(V,F,L);
std::cout<<"Hello, mesh: "<<std::endl<<L*V<<std::endl;
return 0;
}
If you save this in hello.cpp
, then you could compile this with (assuming
Eigen is installed in /opt/local/include/eigen3):
gcc -I/opt/local/include/eigen3 -I./igl/ hello.cpp -o hello
Running ./hello
would then produce
Hello, mesh:
0.5 0.5
-0.5 0.5
-0.5 -0.5
0.5 -0.5
Dependencies are on a per-include basis and the majority of the functions in libigl depends only on the Eigen library.
For more information see our tutorial.
The include/igl/cgal/*.h
headers depend on CGAL. It has come to our attention
that CGAL does not work properly with GCC 4.8. To the best of our knowledge,
GCC 4.7 and clang will work correctly.
Some of our functions will take advantage of OpenMP if available. However, it has come to our attention that Visual Studio + Eigen does not work properly with OpenMP. Since OpenMP only improves performance without affecting functionality we recommend avoiding OpenMP on Windows or proceeding with caution.
You can keep up to date by cloning a read-only copy of our GitHub repository.
We really heavily on Eigen. Nearly all inputs and outputs are Eigen matrices of
some kind. However, we currently only support Eigen's default column-major
ordering. That means, we do not expect our code to work for matrices using
the Eigen::RowMajor
flag. If you can, change definitions like:
Eigen::Matrix<double, Eigen::Dynamic, 3, Eigen::RowMajor> A;
to
Eigen::Matrix<double, Eigen::Dynamic, 3, Eigen::ColMajor> A;
// or simply
Eigen::Matrix<double, Eigen::Dynamic, 3> A;
We hope to fix this, or at least identify which functions are safe (many of them probably work just fine). This requires setting up unit testing, which is a major todo for our development.
If you are interested in joining development, please fork the repository and submit a pull request with your changes.
libigl is primarily MPL2 licensed (FAQ). Some files contain third-party code under other licenses. We're currently in the processes of identifying these and marking appropriately.
If you use libigl in your academic projects, please cite the papers we implement as appropriate. To cite the library in general, you could use this BibTeX entry:
@misc{libigl,
title = {{libigl}: A simple {C++} geometry processing library},
author = {Alec Jacobson and Daniele Panozzo and others},
note = {http://libigl.github.io/libigl/},
year = {2015},
}
- Spine by Esoteric Software is an animation tool dedicated to 2D characters.
- Columbia University, Columbia Computer Graphics Group, USA
- Cornell University, USA
- EPF Lausanne, Computer Graphics and Geometry Laboratory, Switzerland
- ETH Zurich, Interactive Geometry Lab and Advanced Technologies Lab, Swizterland
- George Mason University, CraGL, USA
- Hong Kong University of Science and Technology, USA
- National Institute of Informatics, Japan
- New York University, Media Research Lab, USA
- NYUPoly, Game Innovation Lab, USA
- Telecom ParisTech, Paris, France
- TU Delft, Netherlands
- Universidade Federal de Santa Catarina, Brazil
- Università della Svizzera Italiana, Switzerland
- University College London, England
- University of Cambridge, England
- University of Pennsylvania, USA
Libigl is a group endeavor led by Alec Jacobson and Daniele Panozzo. Please contact us if you have questions or comments. We are happy to get feedback!
If you're using libigl in your projects, quickly drop us a note. Tell us who you are and what you're using it for. This helps us apply for funding and justify spending time maintaining this.
If you find bugs or have problems please use our github issue tracking page.
2015 Alec Jacobson, Daniele Panozzo, Olga Diamanti, Christian Schüller, Kenshi Takayama, Leo Sacht, Wenzel Jacob, Nico Pietroni, Amir Vaxman