7 #include "imstkUnidirectionalPlaneToCapsuleCD.h" 8 #include "imstkCapsule.h" 9 #include "imstkCollisionData.h" 10 #include "imstkCollisionUtils.h" 11 #include "imstkPlane.h" 15 UnidirectionalPlaneToCapsuleCD::UnidirectionalPlaneToCapsuleCD()
17 setRequiredInputType<Plane>(0);
18 setRequiredInputType<Capsule>(1);
23 std::shared_ptr<Geometry> geomA,
24 std::shared_ptr<Geometry> geomB,
25 std::vector<CollisionElement>& elementsA,
26 std::vector<CollisionElement>& elementsB)
28 std::shared_ptr<Plane> plane = std::dynamic_pointer_cast<
Plane>(geomA);
29 std::shared_ptr<Capsule> capsule = std::dynamic_pointer_cast<
Capsule>(geomB);
33 const Vec3d n = plane->getNormal();
35 const Vec3d capsule0Pos = capsule->getPosition();
36 const Vec3d capsule0Axis = capsule->getOrientation().toRotationMatrix().col(1).normalized();
37 const double capsule0HalfLength = capsule->getLength() * 0.5;
38 const Vec3d diff0 = capsule0Axis * capsule0HalfLength;
39 const double capsule0Radius = capsule->getRadius();
43 const Vec3d p0 = capsule0Pos - diff0;
44 const Vec3d p1 = capsule0Pos + diff0;
46 const double signedDist0 = plane->getFunctionValue(p0);
47 const double signedDist1 = plane->getFunctionValue(p1);
50 Vec3d deepestPtOnEdge = p0;
51 double deepestDist = signedDist0;
52 if (signedDist1 < signedDist0)
55 deepestDist = signedDist1;
59 if (deepestDist - capsule0Radius < 0.0)
62 if ((signedDist1 - signedDist0) < IMSTK_DOUBLE_EPS)
64 deepestPtOnEdge = (p0 + p1) * 0.5;
67 const double depth = std::abs(deepestDist - capsule0Radius);
71 elemA.pt = deepestPtOnEdge + n * std::abs(deepestDist);
72 elemA.penetrationDepth = depth;
76 elemB.pt = deepestPtOnEdge - n * capsule0Radius;
77 elemB.penetrationDepth = depth;
79 elementsA.push_back(elemA);
80 elementsB.push_back(elemB);
Vec3d getPosition(DataType type=DataType::PostTransform)
Get the local or global position (post transformed)
Represents and infinite plane, width can be used for visual purposes.
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.
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.