Вот простое приложение для чтения CGAL .off
. Я пытался прочитать ModelNet40/airplane/train/airplane_0001.off
и ModelNet40/airplane/train/airplane_0002.off
соответственно, но ModelNet40/airplane/train/airplane_0002.off
дает surface_mesh
с 0 вершинами и 0 гранями.
Эти два файла взяты из ModelNet40 без каких-либо изменений.
# console output for airplane_0001.off
Initial Vertices: 90714
Initial Edges: 193500
# console output for airplane_0002.off
Initial Vertices: 0
Initial Edges: 0
прореживание.cpp
#include <CGAL/Simple_cartesian.h>
#include <CGAL/Surface_mesh.h>
// Simplification function
#include <CGAL/Surface_mesh_simplification/edge_collapse.h>
// Visitor base
#include <CGAL/Surface_mesh_simplification/Edge_collapse_visitor_base.h>
// Stop-condition policy
#include <CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Count_ratio_stop_predicate.h>
#include <iostream>
#include <fstream>
typedef CGAL::Simple_cartesian<double> Kernel;
typedef Kernel::Point_3 Point_3;
typedef CGAL::Surface_mesh<Point_3> Surface_mesh;
typedef boost::graph_traits<Surface_mesh>::halfedge_descriptor halfedge_descriptor;
typedef boost::graph_traits<Surface_mesh>::vertex_descriptor vertex_descriptor;
namespace SMS = CGAL::Surface_mesh_simplification;
typedef SMS::Edge_profile<Surface_mesh> Profile;
int main(int argc, char ** argv)
{
Surface_mesh surface_mesh;
const std::string filename = CGAL::data_file_path(argv[1]);
std::cout << filename << std::endl;
std::ifstream is(filename);
if (!is || !(is >> surface_mesh))
{
std::cerr << "Failed to read input mesh: " << filename << std::endl;
return EXIT_FAILURE;
}
if (!CGAL::is_triangle_mesh(surface_mesh))
{
std::cerr << "Input geometry is not triangulated." << std::endl;
return EXIT_FAILURE;
}
std::cout << "Initial Vertices: " << surface_mesh.number_of_vertices() << std::endl
<< "Initial Edges: " << surface_mesh.number_of_edges() << std::endl;
return EXIT_SUCCESS;
}
CMakeLists.txt
project(modelnet40)
cmake_minimum_required(VERSION 3.23.0)
set(CMAKE_BUILD_TYPE Release)
find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5)
find_package(Qt5 COMPONENTS Widgets REQUIRED)
find_package(OpenGL)
include_directories(${OPENGL_INCLUDE_DIR})
add_executable(modelnet40 decimation.cpp)
set(CMAKE_CXX_FLAGS "-DCGAL_USE_BASIC_VIEWER")
target_link_libraries(modelnet40 CGAL::CGAL CGAL::CGAL_Basic_viewer)
import open3d as o3d
path = "ModelNet40/airplane/train/airplane_0002.off"
mesh = o3d.io.read_triangle_mesh(path)
print(mesh)
Я протестировал оба файла, используя open3d.io.read_triangle_mesh(path)
в python, и оба они в порядке, но в CGAL они дают 0 вершин и 0 граней.
Результат в питоне
# console for airplane_0001.off
TriangleMesh with 90714 points and 104773 triangles.
# console for airplane_0002.off
TriangleMesh with 94335 points and 118614 triangles.
Вы не можете просто использовать operator>>()
, потому что ваша сетка имеет изолированные вершины и неоднородные ребра. Вместо этого вы должны прочитать полигональный суп, сориентировать треугольники и, если необходимо, дублировать ребра, чтобы получить 2-многообразие, потенциально с граничными ребрами. Взгляните на этот пример в Руководстве пользователя.
Или используйте напрямую read_polygon_mesh()