CGAL read_OFF 根据顶点顺序丢弃面

CGAL read_OFF discards face depending on vertex order

阅读 off-file with cgal it appears that the vertex order of a face decides whether or not it is read in by read_OFF. But the off-file 定义时并没有说明面的顶点顺序。

我正在阅读自生成的 off-files using the read_OFF cgal 方法:

using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel;
using Point_3 = typename Kernel::Point_3;
...
CGAL::Surface_mesh<Point_3> test_mash;
CGAL::IO::read_OFF(file_name, test_mash);
std::cout << "Number of vertices: " << test_mash.vertices().size() 
      << ", Number of faces: " << test_mash.faces().size() << std::endl;

two_faces_read.off:

OFF
4 2 0
1 1 1 
2 -2 2
3 3 -3
-4 4 4
3  0 1 2
3  0 3 1

one_face_read.off:

OFF
4 2 0
1 1 1 
2 -2 2
3 3 -3
-4 4 4
3  0 1 2
3  0 1 3

阅读 two_faces_read.off 按预期工作,打印: Number of vertices: 4, Number of faces: 2。 但是当我阅读 one_face_read.off 时,我得到 Number of vertices: 4, Number of faces: 1。这两个文件的唯一区别是最后一行,第二个面的顶点顺序不同。在尝试了所有可能的组合之后,似乎 031、103、310 读入了 2 张面孔,而 013、130、301 仅读入了 1 张面孔。 off-file cgal 引用的规范没有提到任何关于面的顶点顺序的规则。

为什么会发生这种情况,如何确保所有面孔都被读入?

one_face_read.off 没有定义一个有效的表面网格,两个面的方向不兼容。您可以使用 following function to read points and faces and call CGAL::Polygon_mesh_processing::is_polygon_soup_a_polygon_mesh() to check if the input is a valid surface mesh. The function CGAL::Polygon_mesh_processing::orient_polygon_soup() can be used to fix orientations. CGAL::Polygon_mesh_processing::polygon_soup_to_polygon_mesh() 可用于创建网格。