7 #include "imstkPointSetToCapsuleCD.h" 8 #include "imstkCapsule.h" 9 #include "imstkCollisionData.h" 10 #include "imstkCollisionUtils.h" 11 #include "imstkParallelUtils.h" 12 #include "imstkPointSet.h" 13 #include "imstkVecDataArray.h" 17 PointSetToCapsuleCD::PointSetToCapsuleCD()
19 setRequiredInputType<PointSet>(0);
20 setRequiredInputType<Capsule>(1);
25 std::shared_ptr<Geometry> geomA,
26 std::shared_ptr<Geometry> geomB,
27 std::vector<CollisionElement>& elementsA,
28 std::vector<CollisionElement>& elementsB)
30 std::shared_ptr<PointSet> pointSet = std::dynamic_pointer_cast<
PointSet>(geomA);
31 std::shared_ptr<Capsule> capsule = std::dynamic_pointer_cast<
Capsule>(geomB);
34 const Vec3d capsuleAxis = capsule->getOrientation().toRotationMatrix().col(1);
35 const double capsuleLength = capsule->getLength();
36 const double capsuleRadius = capsule->getRadius();
38 std::shared_ptr<VecDataArray<double, 3>> vertexData = pointSet->getVertexPositions();
41 ParallelUtils::parallelFor(vertices.size(),
44 Vec3d capsuleContactPt;
45 Vec3d capsuleContactNormal, pointContactNormal;
47 if (CollisionUtils::testCapsuleToPoint(
48 capsulePos, capsuleAxis, capsuleLength, capsuleRadius,
50 capsuleContactPt, capsuleContactNormal, pointContactNormal, depth))
53 elemA.dir = pointContactNormal;
55 elemA.penetrationDepth = depth;
58 elemB.dir = capsuleContactNormal;
59 elemB.pt = capsuleContactPt;
60 elemB.penetrationDepth = depth;
63 elementsA.push_back(elemA);
64 elementsB.push_back(elemB);
67 }, vertices.size() > 100);
72 std::shared_ptr<Geometry> geomA,
73 std::shared_ptr<Geometry> geomB,
74 std::vector<CollisionElement>& elementsA)
76 std::shared_ptr<PointSet> pointSet = std::dynamic_pointer_cast<
PointSet>(geomA);
77 std::shared_ptr<Capsule> capsule = std::dynamic_pointer_cast<
Capsule>(geomB);
80 const Vec3d capsuleAxis = capsule->getOrientation().toRotationMatrix().col(1);
81 const double capsuleLength = capsule->getLength();
82 const double capsuleRadius = capsule->getRadius();
84 std::shared_ptr<VecDataArray<double, 3>> vertexData = pointSet->getVertexPositions();
87 ParallelUtils::parallelFor(vertices.size(),
90 Vec3d capsuleContactPt;
91 Vec3d capsuleContactNormal, pointContactNormal;
93 if (CollisionUtils::testCapsuleToPoint(
94 capsulePos, capsuleAxis, capsuleLength, capsuleRadius,
96 capsuleContactPt, capsuleContactNormal, pointContactNormal, depth))
99 elemA.dir = pointContactNormal;
101 elemA.penetrationDepth = depth;
104 elementsA.push_back(elemA);
107 }, vertices.size() > 100);
112 std::shared_ptr<Geometry> geomA,
113 std::shared_ptr<Geometry> geomB,
114 std::vector<CollisionElement>& elementsB)
116 std::shared_ptr<PointSet> pointSet = std::dynamic_pointer_cast<
PointSet>(geomA);
117 std::shared_ptr<Capsule> capsule = std::dynamic_pointer_cast<
Capsule>(geomB);
120 const Vec3d capsuleAxis = capsule->getOrientation().toRotationMatrix().col(1);
121 const double capsuleLength = capsule->getLength();
122 const double capsuleRadius = capsule->getRadius();
124 std::shared_ptr<VecDataArray<double, 3>> vertexData = pointSet->getVertexPositions();
127 ParallelUtils::parallelFor(vertices.size(),
130 Vec3d capsuleContactPt;
131 Vec3d capsuleContactNormal, pointContactNormal;
133 if (CollisionUtils::testCapsuleToPoint(
134 capsulePos, capsuleAxis, capsuleLength, capsuleRadius,
136 capsuleContactPt, capsuleContactNormal, pointContactNormal, depth))
139 elemB.dir = capsuleContactNormal;
140 elemB.pt = capsuleContactPt;
141 elemB.penetrationDepth = depth;
144 elementsB.push_back(elemB);
147 }, vertices.size() > 100);
void unlock()
End a thread-safe region.
Base class for all geometries represented by discrete points and elements The pointsets follow a pipe...
void computeCollisionDataAB(std::shared_ptr< Geometry > geomA, std::shared_ptr< Geometry > geomB, std::vector< CollisionElement > &elementsA, std::vector< CollisionElement > &elementsB) override
Compute collision data for AB simultaneously.
Vec3d getPosition(DataType type=DataType::PostTransform)
Get the local or global position (post transformed)
void computeCollisionDataA(std::shared_ptr< Geometry > geomA, std::shared_ptr< Geometry > geomB, std::vector< CollisionElement > &elementsA) override
Compute collision data for side A.
void lock()
Start a thread-safe region, where only one thread can execute at a time until a call to the unlock fu...
Direclty gives a point-direction contact as its collision data, point given by index.
Capsule geometry, default configuration is centered at origin with length running up and down the y a...
Direclty gives a point-direction contact as its collision data.
void computeCollisionDataB(std::shared_ptr< Geometry > geomA, std::shared_ptr< Geometry > geomB, std::vector< CollisionElement > &elementsB) override
Compute collision data for side B.