7 #include "NeedleInteraction.h" 8 #include "imstkLineMesh.h" 9 #include "imstkPbdModel.h" 10 #include "imstkPbdObject.h" 11 #include "imstkPuncturable.h" 12 #include "imstkStraightNeedle.h" 13 #include "imstkTaskGraph.h" 14 #include "imstkTetrahedralMesh.h" 15 #include "imstkTetraToLineMeshCD.h" 16 #include "NeedleEmbedder.h" 18 using namespace imstk;
20 NeedleInteraction::NeedleInteraction(std::shared_ptr<PbdObject> tissueObj,
21 std::shared_ptr<PbdObject> needleObj,
22 const std::string& collisionName) :
26 <<
"NeedleInteraction only works with objects that have a StraightNeedle component";
28 <<
"NeedleInteraction only works with objects that have a Puncturable component";
29 CHECK(std::dynamic_pointer_cast<TetrahedralMesh>(tissueObj->getPhysicsGeometry()) !=
nullptr)
30 <<
"NeedleInteraction only works with TetrahedralMesh physics geometry on pbd tissueObj";
33 m_embedder = std::make_shared<NeedleEmbedder>();
34 m_embedder->setCollisionHandleNode(m_collisionHandleANode);
35 m_embedder->setCollisionData(getCollisionDetection()->getCollisionData());
36 m_embedder->setTissueObject(tissueObj);
37 m_embedder->setNeedleObject(needleObj);
41 std::make_shared<TaskNode>([&]() { m_embedder->update(); },
"NeedleEmbedding",
true);
46 NeedleInteraction::setFriction(
const double friction)
48 m_embedder->setFriction(friction);
52 NeedleInteraction::getFriction()
const 54 return m_embedder->getFriction();
58 NeedleInteraction::setNeedleCompliance(
const double compliance)
60 m_embedder->setCompliance(compliance);
64 NeedleInteraction::getNeedleCompliance()
const 66 return m_embedder->getCompliance();
70 NeedleInteraction::setStaticFrictionForceThreshold(
const double force)
72 m_embedder->setStaticFrictionForceThreshold(force);
76 NeedleInteraction::getStaticFrictionForceThreshold()
const 78 return m_embedder->getStaticFrictionForceThreshold();
82 NeedleInteraction::setPunctureForceThreshold(
const double forceThreshold)
84 m_embedder->setPunctureForceThreshold(forceThreshold);
88 NeedleInteraction::getPunctureForceThreshold()
const 90 return m_embedder->getPunctureForceThreshold();
98 PbdObjectCollision::initGraphEdges(source, sink);
100 auto pbdObj = std::dynamic_pointer_cast<
PbdObject>(m_objA);
101 std::shared_ptr<CollisionHandling> pbdCH = m_colHandlingA;
105 m_taskGraph->addEdge(m_collisionDetectionNode, m_embedderNode);
106 m_taskGraph->addEdge(m_embedderNode, m_collisionHandleANode);
Place this on an object to make it puncturable by a needle. This allows puncturables to know they've ...
Definition of straight, single segment needle.
Base class for scene objects that move and/or deform under position based dynamics formulation...
This class defines a collision interaction between two PbdObjects or PbdObject & CollidingObject.
std::shared_ptr< TaskGraph > m_taskGraph
Computational Graph.
void initGraphEdges()
Initializes the edges of the SceneObject's computational graph.