7 #include "imstkRigidObjectLevelSetCollision.h" 8 #include "imstkCollisionData.h" 9 #include "imstkImplicitGeometry.h" 10 #include "imstkImplicitGeometryToPointSetCCD.h" 11 #include "imstkImplicitGeometryToPointSetCD.h" 12 #include "imstkLevelSetCH.h" 13 #include "imstkLevelSetDeformableObject.h" 14 #include "imstkLevelSetModel.h" 15 #include "imstkParallelFor.h" 16 #include "imstkRigidBodyCH.h" 17 #include "imstkRigidBodyModel2.h" 18 #include "imstkRigidObject2.h" 19 #include "imstkSurfaceMesh.h" 20 #include "imstkTaskGraph.h" 21 #include "imstkVecDataArray.h" 25 RigidObjectLevelSetCollision::RigidObjectLevelSetCollision(std::shared_ptr<RigidObject2> obj1, std::shared_ptr<LevelSetDeformableObject> obj2) :
26 CollisionInteraction(
"RigidObjectLevelSetCollision" + obj1->getName() +
"_vs_" + obj2->getName(), obj1, obj2,
std::string(
"ImplicitGeometryToPointSetCCD")),
27 m_prevVertices(
std::make_shared<VecDataArray<double, 3>>())
29 std::shared_ptr<RigidBodyModel2> rbdModel = obj1->getRigidBodyModel2();
30 std::shared_ptr<LevelSetModel> lvlSetModel = obj2->getLevelSetModel();
32 if (rbdModel ==
nullptr || lvlSetModel ==
nullptr)
34 LOG(WARNING) <<
"RigidObjectCollisionPair, could not create";
45 m_taskGraph->addNode(rbdModel->getComputeTentativeVelocitiesNode());
46 m_taskGraph->addNode(lvlSetModel->getGenerateVelocitiesBeginNode());
49 m_taskGraph->addNode(lvlSetModel->getGenerateVelocitiesEndNode());
52 auto rbdCH = std::make_shared<RigidBodyCH>();
53 rbdCH->setInputRigidObjectA(obj1);
54 rbdCH->setInputCollidingObjectB(obj2);
55 rbdCH->setInputCollisionData(
m_colDetect->getCollisionData());
56 rbdCH->setFriction(0.0);
60 auto lvlSetCH = std::make_shared<LevelSetCH>();
61 lvlSetCH->setInputLvlSetObj(obj2);
62 lvlSetCH->setInputRigidObj(obj1);
63 lvlSetCH->setInputCollisionData(
m_colDetect->getCollisionData());
66 m_copyVertToPrevNode = std::make_shared<TaskNode>([ = ]()
68 copyVertsToPrevious();
69 },
"CopyVertsToPrevious");
72 m_computeDisplacementNode =
73 std::make_shared<TaskNode>(std::bind(&RigidObjectLevelSetCollision::measureDisplacementFromPrevious,
this),
74 "ComputeDisplacements");
78 auto pointSet = std::dynamic_pointer_cast<PointSet>(obj1->getCollidingGeometry());
79 if (pointSet !=
nullptr && !pointSet->hasVertexAttribute(
"displacements"))
81 auto displacementsPtr = std::make_shared<VecDataArray<double, 3>>(pointSet->getNumVertices());
82 pointSet->setVertexAttribute(
"displacements", displacementsPtr);
83 displacementsPtr->fill(Vec3d::Zero());
86 m_taskGraph->addNode(obj1->getUpdateGeometryNode());
87 m_taskGraph->addNode(obj1->getTaskGraph()->getSource());
88 m_taskGraph->addNode(obj1->getTaskGraph()->getSink());
96 auto rbdObj1 = std::dynamic_pointer_cast<
RigidObject2>(m_objA);
102 std::shared_ptr<TaskNode> rbdHandlerNode = m_collisionHandleANode;
103 std::shared_ptr<TaskNode> lsmHandlerNode = m_collisionHandleBNode;
111 m_taskGraph->addEdge(rbdModel->getComputeTentativeVelocitiesNode(), m_collisionDetectionNode);
112 m_taskGraph->addEdge(lsmModel->getGenerateVelocitiesBeginNode(), m_collisionDetectionNode);
114 m_taskGraph->addEdge(m_collisionDetectionNode, rbdHandlerNode);
115 m_taskGraph->addEdge(m_collisionDetectionNode, lsmHandlerNode);
117 m_taskGraph->addEdge(rbdHandlerNode, rbdModel->getSolveNode());
118 m_taskGraph->addEdge(lsmHandlerNode, lsmModel->getGenerateVelocitiesEndNode());
120 std::shared_ptr<PointSet> pointSet = std::dynamic_pointer_cast<
PointSet>(rbdObj1->getPhysicsGeometry());
121 const bool measureDisplacements = (pointSet !=
nullptr && pointSet->hasVertexAttribute(
"displacements"));
125 if (measureDisplacements)
128 m_taskGraph->addEdge(rbdObj1->getTaskGraph()->getSource(), m_copyVertToPrevNode);
130 rbdObj1->getRigidBodyModel2()->getComputeTentativeVelocitiesNode());
135 m_taskGraph->addEdge(rbdObj1->getUpdateGeometryNode(), m_computeDisplacementNode);
136 m_taskGraph->addEdge(m_computeDisplacementNode, rbdObj1->getTaskGraph()->getSink());
141 RigidObjectLevelSetCollision::copyVertsToPrevious()
143 auto obj1 = std::dynamic_pointer_cast<
RigidObject2>(m_objA);
144 std::shared_ptr<PointSet> pointSet = std::dynamic_pointer_cast<
PointSet>(obj1->getPhysicsGeometry());
146 if (pointSet !=
nullptr && pointSet->hasVertexAttribute(
"displacements"))
148 std::shared_ptr<VecDataArray<double, 3>> verticesPtr = pointSet->
getVertexPositions();
152 if (prevVertices.size() != vertices.size())
154 prevVertices.
resize(vertices.size());
156 std::copy_n(vertices.getPointer(), vertices.size(), prevVertices.getPointer());
161 RigidObjectLevelSetCollision::measureDisplacementFromPrevious()
163 auto obj1 = std::dynamic_pointer_cast<
RigidObject2>(m_objA);
164 std::shared_ptr<PointSet> pointSet = std::dynamic_pointer_cast<
PointSet>(obj1->getPhysicsGeometry());
166 if (pointSet !=
nullptr && pointSet->hasVertexAttribute(
"displacements"))
168 std::shared_ptr<VecDataArray<double, 3>> displacements =
172 std::shared_ptr<VecDataArray<double, 3>> verticesPtr = pointSet->getVertexPositions();
176 ParallelUtils::parallelFor(displacements->size(),
179 displacementsArr[i] = vertices[i] - prevVertices[i];
Base class for all geometries represented by discrete points and elements The pointsets follow a pipe...
void setCollisionHandlingB(std::shared_ptr< CollisionHandling > colHandlingB)
Set the Collision Handling for object B.
void resize(const int size) override
Resize data array to hold exactly size number of values.
Base class for scene objects that move and/or deform under position based dynamics formulation...
std::shared_ptr< CollisionDetectionAlgorithm > m_colDetect
Collision detection algorithm.
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.
void setCollisionHandlingA(std::shared_ptr< CollisionHandling > colHandlingA)
Set the Collision Handling for object A.
std::shared_ptr< TaskGraph > m_taskGraph
Computational Graph.
std::shared_ptr< LevelSetModel > getLevelSetModel()
Get the LevelSet model of the object.
Scene objects that are governed by rigid body dynamics under the RigidBodyModel2. ...
void initGraphEdges()
Initializes the edges of the SceneObject's computational graph.