Мне дают 3D модели формата STL, выходящие из Cinema 4D. Моя цель — манипулировать ими, используя CGAL. На данный момент я только пытаюсь загрузить модель как Многогранник_3, используя следующий код:
using namespace std;
typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
typedef CGAL::Polyhedron_3<Kernel> Polyhedron_3;
typedef CGAL::Simple_cartesian<double> K;
typedef K::Point_2 Point_2;
typedef K::Point_3 Point_3;
int main()
{
std::string stl_file_name;
cout << "opening file\n";
stl_file_name = "D:\\Julien\\Edit3D_I5_STImier.stl";
Polyhedron_3 poly_Partition;
std::ifstream stl_file(stl_file_name, std::ifstream::in);
std::vector<CGAL::cpp11::array<double, 3> > points;
std::vector<CGAL::cpp11::array<int, 3> > triangles;
cout << "reading file\n";
CGAL::read_STL(stl_file, points, triangles);
cout << "closing file \n";
stl_file.close();
cout << "processing mesh\n";
int spoints_nb = points.size();
cout << "number of points in soup : " << spoints_nb << "\n";
int poly_nb = triangles.size();
cout << "number of polys in soup : " << poly_nb << "\n";
CGAL::Polygon_mesh_processing::orient_polygon_soup(points, triangles);
CGAL::Polygon_mesh_processing::polygon_soup_to_polygon_mesh(points, triangles, poly_Partition);
int vertices_nb = poly_Partition.size_of_facets();
cout << "number of facets : " << vertices_nb << "\n";
int points_nb = points.size();
cout << "number of points : " << points_nb << "\n";
int triangles_nb = triangles.size();
cout << "number of triangles : " << triangles_nb << "\n";
std::vector<Point_3> points_3;
std::vector<CGAL::cpp11::array<double, 3>>::iterator it;
for (it = points.begin() ; it != points.end(); ++it) {
CGAL::cpp11::array<double, 3> a = *it;
Point_3 point = Point_3(a[0], a[1], a[2]);
points_3.push_back(point);
}
K::Iso_cuboid_3 c3 = CGAL::bounding_box(points_3.begin(), points_3.end());
for (int i = 0; i < 8; i++) {
Point_3 vert = c3.vertex(i);
cout << vert.hx() << ", " << vert.hy() << ", " << vert.hz() << "\n";
}
return 0;
}
Проблема в том, что я получаю только 19 очков и 24 треугольника. Когда я включаю многословный на read_STL
Я получаю много ignore degenerate face
сообщения в консоли.
Мой вопрос: как сделать так, чтобы лица НЕ вырождались? Есть ли более щадящий (в отношении «вырождения») способ чтения STL-файлов?
Я новичок в C ++ и CGAL, поэтому, пожалуйста, прости меня, если мой код причиняет тебе боль.
Задача ещё не решена.
Других решений пока нет …