33#ifndef DART_MATH_DETAIL_GEOMETRY_IMPL_HPP_
34#define DART_MATH_DETAIL_GEOMETRY_IMPL_HPP_
38#include <unordered_map>
40#include "dart/external/convhull_3d/convhull_3d.h"
46template <
typename S,
typename Index>
48 std::vector<Eigen::Matrix<S, 3, 1>>,
49 std::vector<Eigen::Matrix<Index, 3, 1>>>
51 const std::vector<Eigen::Matrix<S, 3, 1>>& vertices,
52 const std::vector<Eigen::Matrix<Index, 3, 1>>& triangles)
54 auto newVertices = std::vector<Eigen::Matrix<S, 3, 1>>();
55 auto newTriangles = std::vector<Eigen::Matrix<Index, 3, 1>>();
56 newTriangles.resize(triangles.size());
57 auto indexMap = std::unordered_map<Index, Index>();
60 for (
auto i = 0u; i < triangles.size(); ++i)
62 const auto& triangle = triangles[i];
63 auto& newTriangle = newTriangles[i];
65 for (
auto j = 0u; j < 3; ++j)
68 = indexMap.insert(std::make_pair(triangle[j], newIndex));
69 const bool& inserted =
result.second;
72 newVertices.push_back(vertices[triangle[j]]);
76 newTriangle[j] = indexMap[triangle[j]];
80 return std::make_tuple(newVertices, newTriangles);
84template <
typename S,
typename Index>
86 std::vector<Eigen::Matrix<S, 3, 1>>,
87 std::vector<Eigen::Matrix<Index, 3, 1>>>
89 const std::vector<Eigen::Matrix<S, 3, 1>>& inputVertices,
bool optimize)
91 ch_vertex* vertices =
new ch_vertex[inputVertices.size()];
93 for (
auto i = 0u; i < inputVertices.size(); ++i)
95 const Eigen::Matrix<S, 3, 1>& inputV = inputVertices[i];
96 ch_vertex& v = vertices[i];
102 int* faces =
nullptr;
105 convhull_3d_build(vertices, inputVertices.size(), &faces, &numFaces);
107 std::vector<Eigen::Matrix<Index, 3, 1>> eigenFaces;
108 eigenFaces.reserve(numFaces);
110 for (
auto i = 0; i < numFaces; ++i)
112 const auto index1 = faces[3 * i];
113 const auto index2 = faces[3 * i + 1];
114 const auto index3 = faces[3 * i + 2];
116 eigenFaces.emplace_back(index1, index2, index3);
123 return discardUnusedVertices<S, Index>(inputVertices, eigenFaces);
125 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:50
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:88
Definition BulletCollisionDetector.cpp:65