We’ve finally published our paper A Simple Method for Correcting Facet Orientations in Polygon Meshes Based on Ray Casting in the Journal of Computer Graphics Tools. The paper was written by Kenshi Takayama, Alec Jacobson, Ladislav Kavan, and Olga Sorkine-Hornung.
Abstract: We present a method for fixing incorrect orientations of facets in an input polygon mesh, a problem often seen in popular 3D model repositories, such that the front side of facets is visible from viewpoints outside of a solid shape represented or implied by the mesh. As opposed to previously proposed methods which are rather complex and hard to reproduce, our method is very simple, only requiring sampling visibilities by shooting many rays. We also propose a simple heuristic to handle interior facets that are invisible from exterior viewpoints. Our method is evaluated extensively with the SHREC Generic 3D Warehouse dataset containing 3168 manually designed meshes, and is demonstrated to be very effective.
You can find an implementation of this method in the embree extension of libigl:
igl/embree/reorient_facets_raycast.h. If you store your mesh by its vertices in rows of a #V by 3 matrix
V and triangle indices in the rows of a #F by 3 matrix
F. Then you can quickly reorient your triangles to all point outward consistently with a single function call:
#include <igl/embree/reorient_facets_raycast.h> ... Eigen::MatrixXI FF; // #F by 3 list of output triangle indices, some rows potentially reversed Eigen::VectorXi I; // #F list of booleans revealing whether facet was reversed igl::reorient_facets_raycast(V,F,FF,I);
As a preprocessor to our generalized winding numbers, this forms a powerful tool for determining the inside from outside for arbitrary meshes. This is especially important for creating volumetric tetrahedral meshes.