33#ifndef DART_MATH_DETAIL_GEOMETRY_IMPL_HPP_
34#define DART_MATH_DETAIL_GEOMETRY_IMPL_HPP_
36#include <unordered_map>
38#include "dart/external/convhull_3d/convhull_3d.h"
45template <
typename S,
typename Index>
47 std::vector<Eigen::Matrix<S, 3, 1>>,
48 std::vector<Eigen::Matrix<Index, 3, 1>>>
50 const std::vector<Eigen::Matrix<S, 3, 1>>& vertices,
51 const std::vector<Eigen::Matrix<Index, 3, 1>>& triangles)
53 auto newVertices = std::vector<Eigen::Matrix<S, 3, 1>>();
54 auto newTriangles = std::vector<Eigen::Matrix<Index, 3, 1>>();
55 newTriangles.resize(triangles.size());
56 auto indexMap = std::unordered_map<Index, Index>();
59 for (
auto i = 0u; i < triangles.size(); ++i)
61 const auto& triangle = triangles[i];
62 auto& newTriangle = newTriangles[i];
64 for (
auto j = 0u; j < 3; ++j)
67 = indexMap.insert(std::make_pair(triangle[j], newIndex));
68 const bool& inserted =
result.second;
71 newVertices.push_back(vertices[triangle[j]]);
75 newTriangle[j] = indexMap[triangle[j]];
79 return std::make_tuple(newVertices, newTriangles);
83template <
typename S,
typename Index>
85 std::vector<Eigen::Matrix<S, 3, 1>>,
86 std::vector<Eigen::Matrix<Index, 3, 1>>>
88 const std::vector<Eigen::Matrix<S, 3, 1>>& inputVertices,
bool optimize)
90 ch_vertex* vertices =
new ch_vertex[inputVertices.size()];
92 for (
auto i = 0u; i < inputVertices.size(); ++i)
94 const Eigen::Matrix<S, 3, 1>& inputV = inputVertices[i];
95 ch_vertex& v = vertices[i];
101 int* faces =
nullptr;
104 convhull_3d_build(vertices, inputVertices.size(), &faces, &numFaces);
106 std::vector<Eigen::Matrix<Index, 3, 1>> eigenFaces;
107 eigenFaces.reserve(numFaces);
109 for (
auto i = 0; i < numFaces; ++i)
111 const auto index1 = faces[3 * i];
112 const auto index2 = faces[3 * i + 1];
113 const auto index3 = faces[3 * i + 2];
115 eigenFaces.emplace_back(index1, index2, index3);
122 return discardUnusedVertices<S, Index>(inputVertices, eigenFaces);
124 return std::make_pair(inputVertices, eigenFaces);
CollisionResult * result
Collision result of DART.
Definition FCLCollisionDetector.cpp:160
std::tuple< std::vector< Eigen::Matrix< S, 3, 1 > >, std::vector< Eigen::Matrix< Index, 3, 1 > > > discardUnusedVertices(const std::vector< Eigen::Matrix< S, 3, 1 > > &vertices, const std::vector< Eigen::Matrix< Index, 3, 1 > > &triangles)
Definition Geometry-impl.hpp:49
std::tuple< std::vector< Eigen::Matrix< S, 3, 1 > >, std::vector< Eigen::Matrix< Index, 3, 1 > > > computeConvexHull3D(const std::vector< Eigen::Matrix< S, 3, 1 > > &inputVertices, bool optimize)
Generates a 3D convex hull given vertices and indices.
Definition Geometry-impl.hpp:87
Definition BulletCollisionDetector.cpp:60