7 #include "imstkRigidObjectCollision.h" 8 #include "imstkCDObjectFactory.h" 9 #include "imstkCollisionData.h" 10 #include "imstkCollisionDetectionAlgorithm.h" 11 #include "imstkParallelFor.h" 12 #include "imstkPointSet.h" 13 #include "imstkRigidBodyCH.h" 14 #include "imstkRigidBodyModel2.h" 15 #include "imstkRigidObject2.h" 16 #include "imstkTaskGraph.h" 17 #include "imstkVecDataArray.h" 21 RigidObjectCollision::RigidObjectCollision(std::shared_ptr<RigidObject2> rbdObj1, std::shared_ptr<CollidingObject> obj2,
23 CollisionInteraction(
"RigidObjectCollision" + rbdObj1->getName() +
"_vs_" + obj2->getName(), rbdObj1, obj2, cdType)
25 std::shared_ptr<RigidBodyModel2> model1 = rbdObj1->getRigidBodyModel2();
29 auto ch = std::make_shared<RigidBodyCH>();
30 ch->setInputCollisionData(m_colDetect->getCollisionData());
31 ch->setInputObjectA(rbdObj1);
32 ch->setInputObjectB(obj2);
34 m_copyVertToPrevNode = std::make_shared<TaskNode>([ = ]()
36 copyVertsToPrevious();
37 },
"CopyVertsToPrevious");
39 m_computeDisplacementNode = std::make_shared<TaskNode>([ = ]()
41 measureDisplacementFromPrevious();
42 },
"ComputeDisplacements");
45 if (
auto rbdObj2 = std::dynamic_pointer_cast<RigidObject2>(obj2))
47 std::shared_ptr<RigidBodyModel2> model2 = rbdObj2->getRigidBodyModel2();
51 m_taskGraph->addNode(model1->getComputeTentativeVelocitiesNode());
52 m_taskGraph->addNode(model2->getComputeTentativeVelocitiesNode());
57 setCollisionHandlingAB(ch);
62 m_taskGraph->addNode(model1->getComputeTentativeVelocitiesNode());
63 m_taskGraph->addNode(obj2->getTaskGraph()->getSource());
69 m_colDetect->setGenerateCD(
true,
false);
70 setCollisionHandlingA(ch);
73 m_taskGraph->addNode(rbdObj1->getUpdateGeometryNode());
74 m_taskGraph->addNode(rbdObj1->getTaskGraph()->getSource());
75 m_taskGraph->addNode(rbdObj1->getTaskGraph()->getSink());
76 m_taskGraph->addNode(obj2->getTaskGraph()->getSource());
77 m_taskGraph->addNode(obj2->getTaskGraph()->getSink());
81 RigidObjectCollision::setBaumgarteStabilization(
double beta)
83 std::dynamic_pointer_cast<RigidBodyCH>(getCollisionHandlingA())->setBaumgarteStabilization(beta);
87 RigidObjectCollision::getBeta()
const 89 return std::dynamic_pointer_cast<RigidBodyCH>(getCollisionHandlingA())->getBeta();
93 RigidObjectCollision::setFriction(
double frictionalCoefficient)
95 std::dynamic_pointer_cast<RigidBodyCH>(getCollisionHandlingA())->setFriction(frictionalCoefficient);
99 RigidObjectCollision::getFriction()
const 101 return std::dynamic_pointer_cast<RigidBodyCH>(getCollisionHandlingA())->getFriction();
109 auto rbdObj1 = std::dynamic_pointer_cast<
RigidObject2>(m_objA);
112 std::shared_ptr<TaskNode> handlerABNode = m_collisionHandleANode;
114 if (
auto rbdObj2 = std::dynamic_pointer_cast<RigidObject2>(m_objB))
116 std::shared_ptr<RigidBodyModel2> rbdModel2 = rbdObj2->getRigidBodyModel2();
123 m_taskGraph->addEdge(rbdModel1->getComputeTentativeVelocitiesNode(), m_collisionDetectionNode);
124 m_taskGraph->addEdge(rbdModel2->getComputeTentativeVelocitiesNode(), m_collisionDetectionNode);
126 m_taskGraph->addEdge(m_collisionDetectionNode, handlerABNode);
127 m_taskGraph->addEdge(handlerABNode, rbdModel1->getSolveNode());
128 m_taskGraph->addEdge(handlerABNode, rbdModel2->getSolveNode());
137 m_taskGraph->addEdge(rbdModel1->getComputeTentativeVelocitiesNode(), m_collisionDetectionNode);
138 m_taskGraph->addEdge(m_objB->getTaskGraph()->getSource(), m_collisionDetectionNode);
140 m_taskGraph->addEdge(m_collisionDetectionNode, handlerABNode);
141 m_taskGraph->addEdge(handlerABNode, rbdModel1->getSolveNode());
142 m_taskGraph->addEdge(m_collisionDetectionNode, m_objB->getUpdateNode());
146 std::shared_ptr<PointSet> pointSet = std::dynamic_pointer_cast<
PointSet>(rbdObj1->getPhysicsGeometry());
147 const bool measureDisplacements = (pointSet !=
nullptr && pointSet->hasVertexAttribute(
"displacements"));
151 if (measureDisplacements)
154 m_taskGraph->addEdge(rbdObj1->getTaskGraph()->getSource(), m_copyVertToPrevNode);
155 m_taskGraph->addEdge(m_copyVertToPrevNode, rbdObj1->getRigidBodyModel2()->getComputeTentativeVelocitiesNode());
160 m_taskGraph->addEdge(rbdObj1->getUpdateGeometryNode(), m_computeDisplacementNode);
161 m_taskGraph->addEdge(m_computeDisplacementNode, rbdObj1->getTaskGraph()->getSink());
166 RigidObjectCollision::copyVertsToPrevious()
168 auto obj1 = std::dynamic_pointer_cast<
RigidObject2>(m_objA);
169 std::shared_ptr<PointSet> pointSet = std::dynamic_pointer_cast<
PointSet>(obj1->getPhysicsGeometry());
171 if (pointSet !=
nullptr && pointSet->hasVertexAttribute(
"displacements"))
173 std::shared_ptr<VecDataArray<double, 3>> verticesPtr = pointSet->
getVertexPositions();
177 if (prevVertices.size() != vertices.size())
179 prevVertices.
resize(vertices.size());
181 std::copy_n(vertices.getPointer(), vertices.size(), prevVertices.getPointer());
186 RigidObjectCollision::measureDisplacementFromPrevious()
188 auto obj1 = std::dynamic_pointer_cast<
RigidObject2>(m_objA);
189 std::shared_ptr<PointSet> pointSet = std::dynamic_pointer_cast<
PointSet>(obj1->getPhysicsGeometry());
191 if (pointSet !=
nullptr && pointSet->hasVertexAttribute(
"displacements"))
193 std::shared_ptr<VecDataArray<double, 3>> displacements =
197 std::shared_ptr<VecDataArray<double, 3>> verticesPtr = pointSet->getVertexPositions();
201 ParallelUtils::parallelFor(displacements->size(),
204 displacementsArr[i] = vertices[i] - prevVertices[i];
Base class for all geometries represented by discrete points and elements The pointsets follow a pipe...
void resize(const int size) override
Resize data array to hold exactly size number of values.
std::shared_ptr< VecDataArray< double, 3 > > getVertexPositions(DataType type=DataType::PostTransform) const
Returns the vector of current positions of the mesh vertices.
std::shared_ptr< RigidBodyModel2 > getRigidBodyModel2()
Add local force at a position relative to object.
std::shared_ptr< TaskGraph > m_taskGraph
Computational Graph.
Scene objects that are governed by rigid body dynamics under the RigidBodyModel2. ...
void initGraphEdges()
Initializes the edges of the SceneObject's computational graph.