7 #include "imstkPbdObjectCollision.h" 8 #include "imstkCDObjectFactory.h" 9 #include "imstkCollisionData.h" 10 #include "imstkCCDAlgorithm.h" 11 #include "imstkCollisionDetectionAlgorithm.h" 12 #include "imstkPbdCollisionHandling.h" 13 #include "imstkPbdModel.h" 14 #include "imstkPbdObject.h" 15 #include "imstkPbdSolver.h" 16 #include "imstkTaskGraph.h" 22 CollisionInteraction(
"PbdObjectCollision_" + obj1->getName() +
"_vs_" + obj2->getName(), obj1, obj2, cdType)
24 setupConnections(obj1, obj2, cdType);
31 CHECK(pbdCH !=
nullptr) <<
"No PbdCollisionHandling set";
32 pbdCH->setRestitution(restitution);
36 PbdObjectCollision::getRestitution()
const 39 CHECK(pbdCH !=
nullptr) <<
"No PbdCollisionHandling set";
40 return pbdCH->getRestitution();
47 CHECK(pbdCH !=
nullptr) <<
"No PbdCollisionHandling set";
48 pbdCH->setFriction(friction);
52 PbdObjectCollision::getFriction()
const 55 CHECK(pbdCH !=
nullptr) <<
"No PbdCollisionHandling set";
56 return pbdCH->getFriction();
63 CHECK(pbdCH !=
nullptr) <<
"No PbdCollisionHandling set";
64 return pbdCH->getUseCorrectVelocity();
68 PbdObjectCollision::setUseCorrectVelocity(
const bool useCorrectVelocity)
71 CHECK(pbdCH !=
nullptr) <<
"No PbdCollisionHandling set";
72 pbdCH->setUseCorrectVelocity(useCorrectVelocity);
79 CHECK(pbdCH !=
nullptr) <<
"No PbdCollisionHandling set";
80 pbdCH->setRigidBodyCompliance(compliance);
84 PbdObjectCollision::getRigidBodyCompliance()
const 87 CHECK(pbdCH !=
nullptr) <<
"No PbdCollisionHandling set";
88 return pbdCH->getRigidBodyCompliance();
95 CHECK(pbdCH !=
nullptr) <<
"No PbdCollisionHandling set";
96 pbdCH->setDeformableStiffnessA(stiffness);
100 PbdObjectCollision::getDeformableStiffnessA()
const 103 CHECK(pbdCH !=
nullptr) <<
"No PbdCollisionHandling set";
104 return pbdCH->getDeformableStiffnessA();
108 PbdObjectCollision::setDeformableStiffnessB(
const double stiffness)
111 CHECK(pbdCH !=
nullptr) <<
"No PbdCollisionHandling set";
112 pbdCH->setDeformableStiffnessB(stiffness);
116 PbdObjectCollision::getDeformableStiffnessB()
const 119 CHECK(pbdCH !=
nullptr) <<
"No PbdCollisionHandling set";
120 return pbdCH->getDeformableStiffnessB();
128 auto pbdObj1 = std::dynamic_pointer_cast<
PbdObject>(m_objA);
129 std::shared_ptr<SceneObject> obj2 = m_objB;
131 std::shared_ptr<TaskNode> chNodeAB = m_collisionHandleANode;
134 m_taskGraph->addEdge(source, pbdObj1->getTaskGraph()->getSource());
135 m_taskGraph->addEdge(pbdObj1->getTaskGraph()->getSink(), sink);
136 m_taskGraph->addEdge(source, obj2->getTaskGraph()->getSource());
137 m_taskGraph->addEdge(obj2->getTaskGraph()->getSink(), sink);
144 m_taskGraph->addEdge(pbdObj1->getPbdModel()->getIntegratePositionNode(), m_collisionGeometryUpdateNode);
145 m_taskGraph->addEdge(m_collisionGeometryUpdateNode, m_collisionDetectionNode);
146 m_taskGraph->addEdge(m_collisionDetectionNode, chNodeAB);
147 m_taskGraph->addEdge(chNodeAB, pbdObj1->getPbdModel()->getSolveNode());
149 m_taskGraph->addEdge(pbdObj1->getPbdModel()->getSolveNode(), m_updatePrevGeometryCCDNode);
150 m_taskGraph->addEdge(m_updatePrevGeometryCCDNode, pbdObj1->getPbdModel()->getUpdateVelocityNode());
152 if (std::dynamic_pointer_cast<PbdObject>(obj2) ==
nullptr)
154 m_taskGraph->addEdge(obj2->getUpdateGeometryNode(), m_collisionGeometryUpdateNode);
155 m_taskGraph->addEdge(m_collisionDetectionNode, obj2->getTaskGraph()->getSink());
160 PbdObjectCollision::setupConnections(std::shared_ptr<PbdObject> obj1, std::shared_ptr<CollidingObject> obj2, std::string cdType )
163 std::shared_ptr<PbdCollisionHandling> ch = std::make_shared<PbdCollisionHandling>();
164 ch->setInputObjectA(obj1);
165 ch->setInputObjectB(obj2);
166 ch->setInputCollisionData(
m_colDetect->getCollisionDataVector());
168 m_updatePrevGeometryCCDNode = std::make_shared<TaskNode>([&]()
172 if (
auto pbdCCD = std::dynamic_pointer_cast<CCDAlgorithm>(getCollisionDetection()))
177 pbdCCD->updatePreviousTimestepGeometry(pbdCCD->getInput(0), pbdCCD->getInput(1));
184 m_taskGraph->addNode(obj1->getTaskGraph()->getSource());
185 m_taskGraph->addNode(obj1->getTaskGraph()->getSink());
186 m_taskGraph->addNode(obj2->getTaskGraph()->getSource());
187 m_taskGraph->addNode(obj2->getTaskGraph()->getSink());
189 std::shared_ptr<PbdModel> pbdModel = obj1->getPbdModel();
191 m_taskGraph->addNode(pbdModel->getIntegratePositionNode());
192 m_taskGraph->addNode(pbdModel->getUpdateVelocityNode());
194 if (
auto pbdObj2 = std::dynamic_pointer_cast<PbdObject>(obj2))
196 CHECK(pbdModel == pbdObj2->getPbdModel()) <<
"PbdObjectCollision may only be used with PbdObjects that share the same PbdModel";
200 m_taskGraph->addNode(obj2->getUpdateGeometryNode());
void setCollisionHandlingAB(std::shared_ptr< CollisionHandling > colHandlingAB)
Set the two-way Collision Handling for both objects.
void setRigidBodyCompliance(const double compliance)
Get/Set compliance of rigid body contacts. Defaults to 0 compliance/infinitely stiff. This is what is needed most of the time but sometimes making a contact a bit softer can be helpful.
bool getUseCorrectVelocity() const
Get/Set whether velocity is corrected (in some cases this could cause instabilities) ...
Implements PBD based collision handling. Given an input PbdObject and CollisionData it creates & adds...
void setDeformableStiffnessA(const double stiffness)
Get/Set stiffness of deformable contacts. Defaults to 1.0. This is what is needed most of the time bu...
virtual void updateGeometries()
Update the geometries.
std::shared_ptr< CollisionDetectionAlgorithm > m_colDetect
Collision detection algorithm.
PbdObjectCollision(std::shared_ptr< PbdObject > obj1, std::shared_ptr< CollidingObject > obj2, std::string cdType="")
Constructor for PbdObject-PbdObject or PbdObject-CollidingObject collisions.
Base class for scene objects that move and/or deform under position based dynamics formulation...
Abstract class for defining collision interactions between objects.
void setFriction(const double friction)
Get/Set the friction, which gives how much velocity is removed along the tangents during contact...
std::shared_ptr< TaskGraph > m_taskGraph
Computational Graph.
void setRestitution(const double restitution)
Get/Set the restitution, which gives how much velocity is removed along the contact normals during co...
A SceneObject with a geometry for collision.
void initGraphEdges()
Initializes the edges of the SceneObject's computational graph.