convex_hull_utils.cpp
Go to the documentation of this file.
1 
29 #include <console_bridge/console.h>
30 #include <LinearMath/btConvexHullComputer.h>
32 
34 
35 namespace tesseract_collision
36 {
38  Eigen::VectorXi& faces,
40  double shrink,
41  double shrinkClamp)
42 {
43  vertices.clear();
44 
45  btConvexHullComputer conv;
46  std::vector<double> points;
47  points.reserve(input.size() * 3);
48  for (const auto& v : input)
49  {
50  points.push_back(v[0]);
51  points.push_back(v[1]);
52  points.push_back(v[2]);
53  }
54 
55  btScalar val = conv.compute(points.data(),
56  3 * sizeof(double),
57  static_cast<int>(input.size()),
58  static_cast<btScalar>(shrink),
59  static_cast<btScalar>(shrinkClamp));
60  if (val < 0)
61  {
62  CONSOLE_BRIDGE_logError("Failed to create convex hull");
63  return -1;
64  }
65 
66  int num_verts = conv.vertices.size();
67  vertices.reserve(static_cast<size_t>(num_verts));
68  for (int i = 0; i < num_verts; i++)
69  {
70  btVector3& v = conv.vertices[i];
71  vertices.emplace_back(static_cast<double>(v.getX()), static_cast<double>(v.getY()), static_cast<double>(v.getZ()));
72  }
73 
74  auto num_faces = static_cast<size_t>(conv.faces.size());
75  std::vector<int> local_faces;
76  local_faces.reserve(3UL * num_faces);
77  for (int i = 0; i < conv.faces.size(); i++)
78  {
79  std::vector<int> face;
80  face.reserve(3);
81 
82  const btConvexHullComputer::Edge* sourceEdge = &(conv.edges[conv.faces[i]]);
83  int a = sourceEdge->getSourceVertex();
84  face.push_back(a);
85 
86  int b = sourceEdge->getTargetVertex();
87  face.push_back(b);
88 
89  const btConvexHullComputer::Edge* edge = sourceEdge->getNextEdgeOfFace();
90  int c = edge->getTargetVertex();
91  face.push_back(c);
92 
93  edge = edge->getNextEdgeOfFace();
94  c = edge->getTargetVertex();
95  while (c != a)
96  {
97  face.push_back(c);
98 
99  edge = edge->getNextEdgeOfFace();
100  c = edge->getTargetVertex();
101  }
102  local_faces.push_back(static_cast<int>(face.size()));
103  local_faces.insert(local_faces.end(), face.begin(), face.end());
104  }
105 
106  faces.resize(static_cast<long>(local_faces.size()));
107  for (size_t i = 0; i < local_faces.size(); ++i)
108  faces[static_cast<long>(i)] = local_faces[i];
109 
110  return conv.faces.size();
111 }
112 
114 {
115  std::shared_ptr<tesseract_common::VectorVector3d> ch_vertices = std::make_shared<tesseract_common::VectorVector3d>();
116  std::shared_ptr<Eigen::VectorXi> ch_faces = std::make_shared<Eigen::VectorXi>();
117  int ch_num_faces = createConvexHull(*ch_vertices, *ch_faces, *mesh.getVertices());
118  auto convex_mesh = std::make_shared<tesseract_geometry::ConvexMesh>(
119  ch_vertices, ch_faces, ch_num_faces, mesh.getResource(), mesh.getScale());
120  convex_mesh->setCreationMethod(tesseract_geometry::ConvexMesh::CONVERTED);
121  return convex_mesh;
122 }
123 
124 } // namespace tesseract_collision
tesseract_geometry::Mesh
tesseract_collision::createConvexHull
int createConvexHull(tesseract_common::VectorVector3d &vertices, Eigen::VectorXi &faces, const tesseract_common::VectorVector3d &input, double shrink=-1, double shrinkClamp=-1)
Create a convex hull from vertices using Bullet Convex Hull Computer.
Definition: convex_hull_utils.cpp:37
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
#define TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
convex_hull_utils.h
This is a collection of common methods.
tesseract_collision::makeConvexMesh
tesseract_geometry::ConvexMesh::Ptr makeConvexMesh(const tesseract_geometry::Mesh &mesh)
Definition: convex_hull_utils.cpp:113
tesseract_geometry::ConvexMesh::Ptr
std::shared_ptr< ConvexMesh > Ptr
tesseract_common::VectorVector3d
std::vector< Eigen::Vector3d > VectorVector3d
TESSERACT_COMMON_IGNORE_WARNINGS_POP
Definition: create_convex_hull.cpp:37
tesseract_geometry::PolygonMesh::getScale
const Eigen::Vector3d & getScale() const
tesseract_collision
Definition: bullet_cast_bvh_manager.h:48
macros.h
tesseract_geometry::PolygonMesh::getVertices
const std::shared_ptr< const tesseract_common::VectorVector3d > & getVertices() const
tesseract_geometry::ConvexMesh::CONVERTED
CONVERTED
tesseract_geometry::PolygonMesh::getResource
std::shared_ptr< const tesseract_common::Resource > getResource() const


tesseract_collision
Author(s): Levi Armstrong
autogenerated on Sun May 18 2025 03:01:52