7 #include "imstkPbdObjectCutting.h" 8 #include "imstkAnalyticalGeometry.h" 9 #include "imstkLineMesh.h" 10 #include "imstkLineMeshCut.h" 11 #include "imstkPbdConstraintContainer.h" 12 #include "imstkPbdModel.h" 13 #include "imstkPbdObject.h" 14 #include "imstkPbdSolver.h" 15 #include "imstkSurfaceMesh.h" 16 #include "imstkSurfaceMeshCut.h" 17 #include "imstkLineMeshCut.h" 21 PbdObjectCutting::PbdObjectCutting(std::shared_ptr<PbdObject> pbdObj, std::shared_ptr<CollidingObject> cutObj) :
22 m_objA(pbdObj), m_objB(cutObj)
24 CHECK(std::dynamic_pointer_cast<SurfaceMesh>(pbdObj->getPhysicsGeometry()) !=
nullptr 25 || std::dynamic_pointer_cast<LineMesh>(pbdObj->getPhysicsGeometry())) <<
26 "PbdObj is not a SurfaceMesh, could not create cutting pair";
29 if (std::dynamic_pointer_cast<SurfaceMesh>(cutObj->getCollidingGeometry()) ==
nullptr 30 && std::dynamic_pointer_cast<AnalyticalGeometry>(cutObj->getCollidingGeometry()) ==
nullptr)
32 LOG(WARNING) <<
"CutObj is neither a SurfaceMesh nor an AnalyticalGeometry, could not create cutting pair";
40 std::shared_ptr<PbdModel> pbdModel = m_objA->getPbdModel();
42 m_addConstraintVertices->clear();
43 m_removeConstraintVertices->clear();
46 if (
auto surfMesh = std::dynamic_pointer_cast<SurfaceMesh>(m_objA->getPhysicsGeometry()))
49 cutter.setInputMesh(surfMesh);
50 cutter.setCutGeometry(m_objB->getCollidingGeometry());
51 cutter.setEpsilon(m_epsilon);
54 std::shared_ptr<SurfaceMesh> newMesh = cutter.getOutputMesh();
57 m_removeConstraintVertices = cutter.getRemoveConstraintVertices();
58 m_addConstraintVertices = cutter.getAddConstraintVertices();
61 surfMesh->setInitialVertexPositions(std::make_shared<
VecDataArray<double, 3>>(*newMesh->getInitialVertexPositions()));
65 else if (
auto lineMesh = std::dynamic_pointer_cast<LineMesh>(m_objA->getPhysicsGeometry()))
68 cutter.setInputMesh(lineMesh);
69 cutter.setCutGeometry(m_objB->getCollidingGeometry());
70 cutter.setEpsilon(m_epsilon);
73 std::shared_ptr<LineMesh> newMesh = cutter.getOutputMesh();
76 m_removeConstraintVertices = cutter.getRemoveConstraintVertices();
77 m_addConstraintVertices = cutter.getAddConstraintVertices();
80 lineMesh->setInitialVertexPositions(std::make_shared<
VecDataArray<double, 3>>(*newMesh->getInitialVertexPositions()));
86 m_objA->setBodyFromGeometry();
87 pbdModel->getConstraints()->removeConstraints(m_removeConstraintVertices,
88 m_objA->getPbdBody()->bodyHandle);
89 pbdModel->addConstraints(m_addConstraintVertices, m_objA->getPbdBody()->bodyHandle);
91 m_objA->getPhysicsGeometry()->postModified();
99 auto vertices = pbdMesh->getVertexPositions();
100 auto initialVertices = pbdMesh->getInitialVertexPositions();
102 auto nVertices = vertices->size();
103 auto nNewVertices = newVertices->size();
104 if (nNewVertices != newInitialVertices->size())
106 LOG(WARNING) <<
"Number of new vertices does not match number of new initial vertices";
110 vertices->reserve(nVertices + nNewVertices);
111 initialVertices->reserve(nVertices + nNewVertices);
112 for (
int i = 0; i < nNewVertices; ++i)
114 vertices->push_back((*newVertices)[i]);
115 initialVertices->push_back((*newInitialVertices)[i]);
121 std::shared_ptr<std::vector<size_t>> modifiedVertexIndices,
125 auto vertices = pbdMesh->getVertexPositions();
126 auto initialVertices = pbdMesh->getInitialVertexPositions();
128 auto nModifiedVertices = modifiedVertices->size();
129 if (nModifiedVertices != modifiedInitialVertices->size()
130 ||
static_cast<size_t>(nModifiedVertices) != modifiedVertexIndices->size())
132 LOG(WARNING) <<
"Numbers of vertices do not match.";
136 for (
int i = 0; i < nModifiedVertices; ++i)
138 auto vertexIdx = modifiedVertexIndices->at(i);
139 (*vertices)[vertexIdx] = (*modifiedVertices)[i];
140 (*initialVertices)[vertexIdx] = (*modifiedInitialVertices)[i];
141 m_removeConstraintVertices->insert(vertexIdx);
142 m_addConstraintVertices->insert(vertexIdx);
148 std::shared_ptr<std::vector<size_t>> modifiedTriangleIndices,
151 auto triangles = pbdMesh->getCells();
152 auto nModifiedTriangles =
static_cast<size_t>(modifiedTriangles->size());
153 if (nModifiedTriangles != modifiedTriangleIndices->size())
155 LOG(WARNING) <<
"Numbers of vertices do not match.";
159 for (
size_t i = 0; i < nModifiedTriangles; ++i)
161 auto triId = (*modifiedTriangleIndices)[i];
162 auto& oldTri = (*triangles)[triId];
163 m_removeConstraintVertices->insert(oldTri[0]);
164 m_removeConstraintVertices->insert(oldTri[1]);
165 m_removeConstraintVertices->insert(oldTri[2]);
167 auto& newTri = (*modifiedTriangles)[i];
168 (*triangles)[triId] = newTri;
169 m_addConstraintVertices->insert(newTri[0]);
170 m_addConstraintVertices->insert(newTri[1]);
171 m_addConstraintVertices->insert(newTri[2]);
void modifyTriangles(std::shared_ptr< SurfaceMesh > pbdMesh, std::shared_ptr< std::vector< size_t >> elementIndices, std::shared_ptr< VecDataArray< int, 3 >> elements)
Modify existing elements of pbdObj.
void apply()
Applies the cut when called.
void update()
Do the actual algorithm.
void modifyVertices(std::shared_ptr< SurfaceMesh > pbdMesh, std::shared_ptr< std::vector< size_t >> vertexIndices, std::shared_ptr< VecDataArray< double, 3 >> vertices, std::shared_ptr< VecDataArray< double, 3 >> initialVertices)
Modify current vertices of pbdObj.
This filter cuts the lines of a LineMesh into smaller lines using input cutting geometry Only support...
void addVertices(std::shared_ptr< SurfaceMesh > pbdMesh, std::shared_ptr< VecDataArray< double, 3 >> vertices, std::shared_ptr< VecDataArray< double, 3 >> initialVertices)
Add new vertices to pbdObj.
This filter cuts the triangles of a SurfaceMesh into smaller triangles using input cutting geometry...