PhysicsBasedAnimationToolkit 0.0.10
Cross-platform C++20 library of algorithms and data structures commonly used in computer graphics research on physically-based simulation.
Loading...
Searching...
No Matches
TetrahedralAabbHierarchy.h
Go to the documentation of this file.
1
10
11#ifndef PBAT_GEOMETRY_TETRAHEDRALAABBHIERARCHY_H
12#define PBAT_GEOMETRY_TETRAHEDRALAABBHIERARCHY_H
13
16#include "DistanceQueries.h"
17#include "OverlapQueries.h"
18#include "PhysicsBasedAnimationToolkitExport.h"
19#include "pbat/Aliases.h"
20#include "pbat/common/Eigen.h"
22
23#include <limits>
24#include <tbb/parallel_for.h>
25#include <utility>
26
27namespace pbat {
28namespace geometry {
29
33class TetrahedralAabbHierarchy : public BoundingVolumeHierarchy<
34 TetrahedralAabbHierarchy,
35 AxisAlignedBoundingBox<3>,
36 IndexVector<4>,
37 3>
38{
39 public:
40 static auto constexpr kDims = 3;
42 using BaseType = BoundingVolumeHierarchy<
46 kDims>;
47
55 Eigen::Ref<MatrixX const> const& V,
56 Eigen::Ref<IndexMatrixX const> const& C,
57 Index maxPointsInLeaf = 10);
58
64 PBAT_API PrimitiveType Primitive(Index p) const;
70 PBAT_API Vector<kDims> PrimitiveLocation(PrimitiveType const& primitive) const;
77 template <class RPrimitiveIndices>
78 BoundingVolumeType BoundingVolumeOf(RPrimitiveIndices&& pinds) const;
82 PBAT_API void Update();
90 PBAT_API IndexMatrixX
91 OverlappingPrimitives(TetrahedralAabbHierarchy const& bvh, std::size_t reserve = 1000ULL) const;
101 template <class TDerivedP, class FCull>
103 Eigen::MatrixBase<TDerivedP> const& P,
104 FCull fCull,
105 bool bParallelize = true) const;
113 template <class TDerivedP>
115 Eigen::MatrixBase<TDerivedP> const& P,
116 bool bParallelize = true) const;
124 template <class TDerivedP>
125 auto
126 NearestPrimitivesToPoints(Eigen::MatrixBase<TDerivedP> const& P, bool bParallelize = true) const
127 -> std::pair<IndexVectorX, VectorX>;
132 [[maybe_unused]] auto const& GetBoundingVolumes() const { return mBoundingVolumes; }
138 template <class TDerivedP>
139 void SetV(Eigen::MatrixBase<TDerivedP> const& P)
140 {
141 V = P;
142 }
143
147 [[maybe_unused]] auto GetV() const { return V; }
152 [[maybe_unused]] auto GetC() const { return C; }
153
154 Eigen::Ref<MatrixX const> V;
155 Eigen::Ref<IndexMatrixX const> C;
156};
157
158template <class RPrimitiveIndices>
160TetrahedralAabbHierarchy::BoundingVolumeOf(RPrimitiveIndices&& pinds) const
161{
162 auto vertices = C(Eigen::placeholders::all, common::Slice(pinds)).reshaped();
163 return BoundingVolumeType(V(Eigen::placeholders::all, vertices));
164}
165
166template <class TDerivedP, class FCull>
168 Eigen::MatrixBase<TDerivedP> const& P,
169 FCull fCull,
170 bool bParallelize) const
171{
172 PBAT_PROFILE_NAMED_SCOPE("pbat.geometry.TetrahedralAabbHierarchy.PrimitivesContainingPoints");
173 using math::linalg::mini::FromEigen;
174 IndexVectorX p(P.cols());
175 p.setConstant(-1);
176 auto const FindContainingPrimitive = [&](Index i) {
177 std::vector<Index> const intersectingPrimitives = this->PrimitivesIntersecting(
178 [&](BoundingVolumeType const& bv) -> bool { return bv.contains(P.col(i)); },
179 [&](PrimitiveType const& T) -> bool {
180 if (fCull(i, T))
181 return false;
182 auto const VT = V(Eigen::placeholders::all, T);
184 FromEigen(P.col(i).template head<kDims>()),
185 FromEigen(VT.col(0).head<kDims>()),
186 FromEigen(VT.col(1).head<kDims>()),
187 FromEigen(VT.col(2).head<kDims>()),
188 FromEigen(VT.col(3).head<kDims>()));
189 });
190 if (not intersectingPrimitives.empty())
191 {
192 p(i) = intersectingPrimitives.front();
193 }
194 };
195 if (bParallelize)
196 {
197 tbb::parallel_for(Index{0}, Index{P.cols()}, FindContainingPrimitive);
198 }
199 else
200 {
201 for (auto i = 0; i < P.cols(); ++i)
202 FindContainingPrimitive(i);
203 }
204 return p;
205}
206
207template <class TDerivedP>
209 Eigen::MatrixBase<TDerivedP> const& P,
210 bool bParallelize) const
211{
212 return PrimitivesContainingPoints(P, [](auto, auto) { return false; }, bParallelize);
213}
214
215template <class TDerivedP>
217 Eigen::MatrixBase<TDerivedP> const& P,
218 bool bParallelize) const -> std::pair<IndexVectorX, VectorX>
219{
220 PBAT_PROFILE_NAMED_SCOPE("pbat.geometry.TetrahedralAabbHierarchy.NearestPrimitivesToPoints");
221 using math::linalg::mini::FromEigen;
222 IndexVectorX p(P.cols());
223 p.setConstant(-1);
224 VectorX d(P.cols());
225 d.setConstant(std::numeric_limits<Scalar>::max());
226 auto const FindNearestPrimitive = [&](Index i) {
227 std::size_t constexpr K{1};
228 auto const [nearestPrimitives, distances] = this->NearestPrimitivesTo(
229 [&](BoundingVolumeType const& bv) -> Scalar {
230 return bv.squaredExteriorDistance(P.col(i));
231 },
232 [&](PrimitiveType const& T) -> Scalar {
233 auto const VT = V(Eigen::placeholders::all, T);
235 FromEigen(P.col(i).template head<kDims>()),
236 FromEigen(VT.col(0).head<kDims>()),
237 FromEigen(VT.col(1).head<kDims>()),
238 FromEigen(VT.col(2).head<kDims>()),
239 FromEigen(VT.col(3).head<kDims>()));
240 },
241 K);
242 p(i) = nearestPrimitives.front();
243 d(i) = distances.front();
244 };
245 if (bParallelize)
246 {
247 tbb::parallel_for(Index{0}, Index{P.cols()}, FindNearestPrimitive);
248 }
249 else
250 {
251 for (auto i = 0; i < P.cols(); ++i)
252 FindNearestPrimitive(i);
253 }
254 return {p, d};
255}
256
257} // namespace geometry
258} // namespace pbat
259
260#endif // PBAT_GEOMETRY_TETRAHEDRALAABBHIERARCHY_H
Axis-aligned bounding box class.
Bounding volume hierarchy (BVH) implementation for spatial partitioning of primitives.
This file contains functions to answer distance queries.
This file contains functions to answer overlap queries.
Axis-aligned bounding box class.
Definition AxisAlignedBoundingBox.h:29
std::vector< Index > PrimitivesIntersecting(FIntersectsBoundingVolume &&ibv, FIntersectsPrimitive &&ip, std::size_t reserve=50ULL) const
Definition BoundingVolumeHierarchy.h:223
auto NearestPrimitivesTo(FDistanceToBoundingVolume &&db, FDistanceToPrimitive &&dp, std::size_t K) const -> std::pair< std::vector< Index >, std::vector< Scalar > >
Definition BoundingVolumeHierarchy.h:259
std::vector< BoundingVolumeType > mBoundingVolumes
Definition BoundingVolumeHierarchy.h:179
PBAT_API Vector< kDims > PrimitiveLocation(PrimitiveType const &primitive) const
Returns the location of the primitive.
Definition TetrahedralAabbHierarchy.cpp:44
auto NearestPrimitivesToPoints(Eigen::MatrixBase< TDerivedP > const &P, bool bParallelize=true) const -> std::pair< IndexVectorX, VectorX >
For each point in P, returns the index of the nearest primitive to it.
Definition TetrahedralAabbHierarchy.h:216
auto GetV() const
Returns this BVH's mesh's vertex positions.
Definition TetrahedralAabbHierarchy.h:147
auto GetC() const
Returns this BVH's mesh's cell indices.
Definition TetrahedralAabbHierarchy.h:152
IndexVectorX PrimitivesContainingPoints(Eigen::MatrixBase< TDerivedP > const &P, FCull fCull, bool bParallelize=true) const
For each point in P, returns the index of the primitive containing it.
Definition TetrahedralAabbHierarchy.h:167
PBAT_API PrimitiveType Primitive(Index p) const
Returns the primitive at index p.
Definition TetrahedralAabbHierarchy.cpp:37
TetrahedralAabbHierarchy SelfType
Type of this class.
Definition TetrahedralAabbHierarchy.h:41
PBAT_API IndexMatrixX OverlappingPrimitives(TetrahedralAabbHierarchy const &bvh, std::size_t reserve=1000ULL) const
Returns the overlapping primitives of this BVH and another BVH.
Definition TetrahedralAabbHierarchy.cpp:55
static auto constexpr kDims
Dimension of the space.
Definition TetrahedralAabbHierarchy.h:40
BoundingVolumeHierarchy< SelfType, AxisAlignedBoundingBox< kDims >, IndexVector< 4 >, kDims > BaseType
Base type.
Definition TetrahedralAabbHierarchy.h:42
PBAT_API void Update()
Updates the AABBs.
Definition TetrahedralAabbHierarchy.cpp:49
Eigen::Ref< MatrixX const > V
|kDims|x|# verts| vertex positions
Definition TetrahedralAabbHierarchy.h:154
PBAT_API TetrahedralAabbHierarchy(Eigen::Ref< MatrixX const > const &V, Eigen::Ref< IndexMatrixX const > const &C, Index maxPointsInLeaf=10)
Construct a TetrahedralAabbHierarchy from a tetrahedral mesh (V,C)
Definition TetrahedralAabbHierarchy.cpp:13
Eigen::Ref< IndexMatrixX const > C
4x|# tetrahedra| cell indices into V
Definition TetrahedralAabbHierarchy.h:155
BoundingVolumeType BoundingVolumeOf(RPrimitiveIndices &&pinds) const
Returns the bounding volume of the primitive.
Definition TetrahedralAabbHierarchy.h:160
auto const & GetBoundingVolumes() const
Returns this BVH's bounding volumes.
Definition TetrahedralAabbHierarchy.h:132
void SetV(Eigen::MatrixBase< TDerivedP > const &P)
Updates this BVH's mesh's vertex positions.
Definition TetrahedralAabbHierarchy.h:139
Eigen adaptors for ranges.
auto Slice(R &&r)
Slice view over a range for Eigen advanced indexing.
Definition Eigen.h:86
PBAT_HOST_DEVICE auto PointTetrahedron(TMatrixP const &P, TMatrixA const &A, TMatrixB const &B, TMatrixC const &C, TMatrixD const &D) -> typename TMatrixP::ScalarType
Obtain squared distance between point P and tetrahedron ABCD.
Definition DistanceQueries.h:230
PBAT_HOST_DEVICE bool PointTetrahedron3D(TMatrixP const &P, TMatrixA const &A, TMatrixB const &B, TMatrixC const &C, TMatrixD const &D)
Checks if point P is contained in tetrahedron ABCD, in at least 3D.
Definition OverlapQueries.h:562
Geometric queries, quantities and data structures.
Definition AabbKdTreeHierarchy.h:23
The main namespace of the library.
Definition Aliases.h:15
Eigen::Vector< Index, N > IndexVector
Fixed-size index vector type.
Definition Aliases.h:40
Eigen::Vector< Index, Eigen::Dynamic > IndexVectorX
Dynamic-size index vector type.
Definition Aliases.h:49
Eigen::Vector< Scalar, N > Vector
Fixed-size vector type.
Definition Aliases.h:24
Eigen::Vector< Scalar, Eigen::Dynamic > VectorX
Dynamic-size vector type.
Definition Aliases.h:33
std::ptrdiff_t Index
Index type.
Definition Aliases.h:17
Eigen::Matrix< Index, Eigen::Dynamic, Eigen::Dynamic > IndexMatrixX
Dynamic-size index matrix type.
Definition Aliases.h:50
double Scalar
Scalar type.
Definition Aliases.h:18
Profiling utilities for the Physics-Based Animation Toolkit (PBAT)