Extension of libigl which allows to also read the texture of wrl-files in Python as igl.read_triangle_mesh(wrFilePath, V, F, TC)

Alec Jacobson 802f7be0a4 fix background on teaser 10 years ago
documentation 23a51e62f6 point to mesh distances in cgal 11 years ago
examples 9969115ac8 matlab funcs in tutorial 10 years ago
file-formats b27d09470d deadlink 10 years ago
google-soc 7a507ec4b9 update google-soc/index.html to match google-soc/google-soc.md 10 years ago
include 8227b617cd missing header 10 years ago
optional c21fc633c9 update index.html to match README.md 10 years ago
scripts 7d3e0e9b01 update links to optional 10 years ago
tutorial cd69179cef libigl-logo.ai 10 years ago
.gitignore 62a5987078 added an opengl-less version of texture_from_png 10 years ago
.mailmap 83eacd6100 mailmap test 11 years ago
ACKNOWLEDGEMENTS bc64088603 better hgignores explicit instanciation for doublearea 11 years ago
LICENSE 695e3393cd readme 11 years ago
LICENSE.GPL 166ae80c7e strip copyrights 11 years ago
LICENSE.MPL2 166ae80c7e strip copyrights 11 years ago
README.md 7d3e0e9b01 update links to optional 10 years ago
RELEASE_HISTORY.txt cde5051cad rm old build dir, use cmake 10 years ago
VERSION.txt cde5051cad rm old build dir, use cmake 10 years ago
exclude.lst cb15a39694 better excludes and readme 11 years ago
index.html 10e313b561 update index.html to match README.md 10 years ago
libigl-dependency-diagram.ai.REMOVED.git-id 532720dc68 merge, orient_outward_ao compiles on mac os x 11 years ago
libigl-logo.ai.REMOVED.git-id 0f9dcf8931 fix crop on logo 10 years ago
libigl-teaser.pdf.REMOVED.git-id 802f7be0a4 fix background on teaser 10 years ago
libigl-teaser.png.REMOVED.git-id 802f7be0a4 fix background on teaser 10 years ago
matlab-to-eigen.html db399debee updated conversion table 10 years ago
style.css d10afaa873 fixed many missing IGL_INLINEs 11 years ago
style_guidelines.html 4783f7505d IGL_HEADER_ONLY --> ~IGL_STATIC_LIBRARY 11 years ago
todos.txt 516ffe9da8 links in references 11 years ago

README.md

libigl - A simple C++ geometry processing library

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 a header-only library. You do not need to compile anything to use, just include igl headers (e.g. #include <igl/cotmatrix.h>) and run. Each header file contains a single function (e.g. igl/cotmatrix.h contains igl::cotmatrix()). 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.

Optionally the library may also be pre-compiled into a statically linked library, for faster compile times with your projects. This only effects compile time (run-time performance and behavior is identical). If in doubt, use the header-only default mode: (i.e. just include the headers you want to use).

We use the Eigen library heavily in our code. Our group prototypes a lot in MATLAB, and we have a useful MATLAB to libigl+Eigen conversion table.

Tutorial

As of version 1.0, libigl includes an introductory tutorial that covers many functionalities.

Installation

Libigl is a header-only library. You do not need to build anything to install. Simply add libigl/include 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 /usr/local/include/eigen3):

gcc -I/usr/local/include/eigen3 -I./libigl/include/ 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

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.

GCC and the optional CGAL dependency

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.

OpenMP and Windows

Some of our functions will take advantage of OpenMP if available. However, it has come to our attention that Visual Studio + Eigen + OpenMP does not work properly. Since we use OpenMP only to improve performance, we recommend avoiding OpenMP on Windows or proceeding with caution.

Download

You can keep up to date by cloning a read-only copy of our GitHub repository.

Known Issues

We really heavily on Eigen. Nearly all inputs and outputs are Eigen matrices of some kind. However, we currently only officially 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.

How to contribute

If you are interested in joining development, please fork the repository and submit a pull request with your changes.

License

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.

Attribution

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},
}

Projects/Universities using libigl

Contact

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.

Copyright

2015 Alec Jacobson, Daniele Panozzo, Olga Diamanti, Christian Schüller, Kenshi Takayama, Leo Sacht, Wenzel Jacob, Nico Pietroni, Amir Vaxman