3 #include <console_bridge/console.h>
4 #include <bullet/HACD/hacdCircularList.h>
5 #include <bullet/HACD/hacdGraph.h>
6 #include <bullet/HACD/hacdHACD.h>
7 #include <bullet/HACD/hacdICHull.h>
8 #include <bullet/HACD/hacdVector.h>
19 std::vector<tesseract_geometry::ConvexMesh::Ptr>
24 std::vector<HACD::Vec3<HACD::Real>> points_local;
25 points_local.reserve(vertices.size());
26 for (
const auto& v : vertices)
28 points_local.emplace_back(v.x(), v.y(), v.z());
31 std::vector<HACD::Vec3<long>> triangles_local;
32 triangles_local.reserve(
static_cast<std::size_t
>(faces.size()) / 4);
33 for (Eigen::Index i = 0; i < faces.rows();)
35 int face_vertice_cnt = faces(i++);
36 if (face_vertice_cnt != 3)
37 throw std::runtime_error(
"Currently only supports triangle meshes");
39 HACD::Vec3<long> triangle;
43 triangles_local.push_back(triangle);
48 my_hacd.SetPoints(&points_local[0]);
49 my_hacd.SetNPoints(points_local.size());
50 my_hacd.SetTriangles(&triangles_local[0]);
51 my_hacd.SetNTriangles(triangles_local.size());
61 bool res = my_hacd.Compute();
63 std::vector<tesseract_geometry::ConvexMesh::Ptr> output;
66 std::size_t num_convex_hulls = my_hacd.GetNClusters();
67 CONSOLE_BRIDGE_logError(
"Convex decomposition generated %lu convex hulls!", num_convex_hulls);
69 for (
unsigned int p = 0; p < num_convex_hulls; ++p)
72 size_t num_points = my_hacd.GetNPointsCH(p);
73 size_t num_triangles = my_hacd.GetNTrianglesCH(p);
75 std::vector<HACD::Vec3<HACD::Real>> points_ch(num_points);
76 std::vector<HACD::Vec3<long>> triangles_ch(num_triangles);
77 my_hacd.GetCH(p, &points_ch[0], &triangles_ch[0]);
80 auto hacd_vertices = std::make_shared<tesseract_common::VectorVector3d>();
81 hacd_vertices->reserve(num_points);
82 for (
size_t v = 0; v < num_points; v++)
84 Eigen::Vector3d vert(points_ch[v].X(), points_ch[v].Y(), points_ch[v].Z());
85 hacd_vertices->push_back(vert);
88 auto ch_vertices = std::make_shared<tesseract_common::VectorVector3d>();
89 auto ch_faces = std::make_shared<Eigen::VectorXi>();
90 int ch_num_faces =
createConvexHull(*ch_vertices, *ch_faces, *hacd_vertices);
91 output.push_back(std::make_shared<tesseract_geometry::ConvexMesh>(ch_vertices, ch_faces, ch_num_faces));
96 CONSOLE_BRIDGE_logError(
"Decomposition cancelled by user!");
104 std::stringstream msg;
105 msg <<
"+ Parameters\n";
108 msg <<
"\t max. concavity " <<
concavity <<
"\n";
112 msg <<
"\t add faces points " << ((
add_faces_points) ?
"true" :
"false") <<
"\n";
114 std::cout << msg.str();