7 #include "imstkBurnable.h" 8 #include "imstkBurner.h" 9 #include "imstkCamera.h" 10 #include "imstkCapsule.h" 11 #include "imstkCollisionUtils.h" 12 #include "imstkDirectionalLight.h" 13 #include "imstkGeometryUtilities.h" 14 #include "imstkKeyboardDeviceClient.h" 15 #include "imstkKeyboardSceneControl.h" 16 #include "imstkMeshIO.h" 17 #include "imstkMouseDeviceClient.h" 18 #include "imstkMouseSceneControl.h" 19 #include "imstkObjectControllerGhost.h" 20 #include "imstkPbdConnectiveTissueConstraintGenerator.h" 21 #include "imstkPbdModel.h" 22 #include "imstkPbdModelConfig.h" 23 #include "imstkPbdObject.h" 24 #include "imstkPbdObjectCollision.h" 25 #include "imstkPbdObjectController.h" 26 #include "imstkPbdObjectGrasping.h" 27 #include "imstkPointwiseMap.h" 28 #include "imstkRenderMaterial.h" 29 #include "imstkScene.h" 30 #include "imstkSceneManager.h" 31 #include "imstkSimulationManager.h" 32 #include "imstkSimulationUtils.h" 33 #include "imstkTearable.h" 34 #include "imstkVisualModel.h" 35 #include "imstkVTKViewer.h" 37 #ifdef iMSTK_USE_HAPTICS 38 #include "imstkDeviceManager.h" 39 #include "imstkDeviceManagerFactory.h" 41 #include "imstkDummyClient.h" 45 #include "imstkCompoundGeometry.h" 47 using namespace imstk;
60 std::shared_ptr<PbdObject>
61 makeGallBladder(
const std::string& name, std::shared_ptr<PbdModel> model)
64 auto tissueMesh = MeshIO::read<TetrahedralMesh>(iMSTK_DATA_ROOT
"/Organs/Gallblader/gallblader.msh");
65 const Vec3d center = tissueMesh->getCenter();
66 tissueMesh->translate(-center, Geometry::TransformType::ApplyToData);
67 tissueMesh->scale(100.0, Geometry::TransformType::ApplyToData);
68 tissueMesh->rotate(Vec3d(0.0, 0.0, 1.0), 30.0 / 180.0 * 3.14, Geometry::TransformType::ApplyToData);
70 const Vec3d shift = { -4.0, 0.0, 0.0 };
71 tissueMesh->translate(shift, Geometry::TransformType::ApplyToData);
73 auto surfMesh = tissueMesh->extractSurfaceMesh();
76 auto material = std::make_shared<RenderMaterial>();
77 material->setDisplayMode(RenderMaterial::DisplayMode::WireframeSurface);
78 material->setBackFaceCulling(
false);
79 material->setOpacity(0.5);
82 auto visualModel = std::make_shared<VisualModel>();
83 visualModel->setGeometry(surfMesh);
84 visualModel->setRenderMaterial(material);
87 auto tissueObj = std::make_shared<PbdObject>(name);
88 tissueObj->addVisualModel(visualModel);
90 tissueObj->setPhysicsGeometry(tissueMesh);
91 tissueObj->setCollidingGeometry(surfMesh);
92 tissueObj->setDynamicalModel(model);
95 tissueObj->setPhysicsToCollidingMap(std::make_shared<PointwiseMap>(tissueMesh, surfMesh));
98 tissueObj->getPbdBody()->uniformMassValue = 0.06 / tissueMesh->getNumVertices();
100 model->getConfig()->m_femParams->m_YoungModulus = 100.0;
101 model->getConfig()->m_femParams->m_PoissonRatio = 0.4;
102 model->getConfig()->enableFemConstraint(PbdFemConstraint::MaterialType::StVK);
103 model->getConfig()->setBodyDamping(tissueObj->getPbdBody()->bodyHandle, 0.01);
106 std::shared_ptr<VecDataArray<double, 3>> vertices = tissueMesh->getVertexPositions();
107 for (
int i = 0; i < tissueMesh->getNumVertices(); i++)
109 const Vec3d& pos = (*vertices)[i];
112 tissueObj->getPbdBody()->fixedNodeIds.push_back(i);
116 LOG(INFO) <<
"Per particle mass: " << tissueObj->getPbdBody()->uniformMassValue;
118 tissueObj->initialize();
126 static std::shared_ptr<PbdObject>
127 makeKidney(
const std::string& name, std::shared_ptr<PbdModel> model)
130 auto tissueMesh = MeshIO::read<TetrahedralMesh>(iMSTK_DATA_ROOT
"/Organs/Kidney/kidney_vol_low_rez.vtk");
131 const Vec3d center = tissueMesh->getCenter();
133 tissueMesh->translate(-center, Geometry::TransformType::ApplyToData);
134 tissueMesh->scale(100.0, Geometry::TransformType::ApplyToData);
135 tissueMesh->rotate(Vec3d(0.0, 0.0, 1.0), 30.0 / 180.0 * 3.14, Geometry::TransformType::ApplyToData);
136 tissueMesh->rotate(Vec3d(0.0, 1.0, 0.0), 90.0 / 180.0 * 3.14, Geometry::TransformType::ApplyToData);
138 const Vec3d shift = { 4.0, 0.0, 0.0 };
139 tissueMesh->translate(shift, Geometry::TransformType::ApplyToData);
141 auto surfMesh = tissueMesh->extractSurfaceMesh();
144 auto material = std::make_shared<RenderMaterial>();
145 material->setDisplayMode(RenderMaterial::DisplayMode::WireframeSurface);
146 material->setBackFaceCulling(
false);
147 material->setOpacity(0.5);
150 auto visualModel = std::make_shared<VisualModel>();
151 visualModel->setGeometry(surfMesh);
152 visualModel->setRenderMaterial(material);
155 auto tissueObj = std::make_shared<PbdObject>(name);
157 tissueObj->addVisualModel(visualModel);
159 tissueObj->setPhysicsGeometry(surfMesh);
160 tissueObj->setDynamicalModel(model);
161 tissueObj->setCollidingGeometry(surfMesh);
164 tissueObj->getPbdBody()->uniformMassValue = 0.06 / surfMesh->getNumVertices();
167 std::shared_ptr<VecDataArray<double, 3>> vertices = surfMesh->getVertexPositions();
168 for (
int i = 0; i < surfMesh->getNumVertices(); i++)
170 tissueObj->getPbdBody()->fixedNodeIds.push_back(i);
173 LOG(INFO) <<
"Per particle mass: " << tissueObj->getPbdBody()->uniformMassValue;
178 static std::shared_ptr<PbdObject>
179 makeHookToolObject(std::shared_ptr<PbdModel> model)
181 auto body = std::make_shared<Capsule>();
182 body->setRadius(0.4);
183 body->setLength(4.0);
184 body->setPosition(Vec3d(0.0, 0.0, 0.0));
185 body->setOrientation(Quatd(0.707, 0.707, 0.0, 0.0));
187 auto geometry = std::make_shared<CompoundGeometry>();
190 auto hook = std::make_shared<Capsule>();
191 hook->setRadius(0.15);
193 hook->setPosition(Vec3d(0.0, -0.5, -2));
197 auto toolObj = std::make_shared<PbdObject>(
"Tool");
201 toolObj->setPhysicsGeometry(geometry);
202 toolObj->setCollidingGeometry(geometry);
203 toolObj->setDynamicalModel(model);
204 toolObj->getPbdBody()->setRigid(
205 Vec3d(0.0, 2.0, 2.0),
208 Mat3d::Identity() * 100000.0);
210 auto visuals = std::make_shared<VisualModel>();
211 visuals->setGeometry(body);
212 toolObj->addVisualModel(visuals);
213 toolObj->getVisualModel(0)->getRenderMaterial()->setOpacity(0.9);
216 auto visuals = std::make_shared<VisualModel>();
217 visuals->setGeometry(hook);
218 toolObj->addVisualModel(visuals);
219 toolObj->getVisualModel(1)->getRenderMaterial()->setOpacity(0.9);
223 controller->setControlledObject(toolObj);
224 controller->setTranslationScaling(100.0);
225 controller->setLinearKs(1000.0);
226 controller->setAngularKs(1000000000.0);
227 controller->setUseCritDamping(
true);
228 controller->setForceScaling(0.01);
229 controller->setSmoothingKernelSize(15);
230 controller->setUseForceSmoothening(
true);
233 controllerGhost->setController(controller);
239 getJawPosition(
double angle)
241 const double toolLength = 2.0;
242 const double capsuleLength = 1.0;
243 Eigen::Affine3d t(Eigen::Translation3d(0.0, 0.0, -toolLength));
244 t.rotate(Eigen::AngleAxisd(angle, Eigen::Vector3d::UnitX()));
245 t.translate(Eigen::Vector3d(0.0, capsuleLength / 2.0, 0));
249 static std::shared_ptr<PbdObject>
250 makeGraspingToolObject(std::shared_ptr<PbdModel> model)
252 auto body = std::make_shared<Capsule>();
253 body->setRadius(0.4);
254 body->setLength(4.0);
255 body->setPosition(Vec3d(0.0, 0.0, 0.0));
256 body->setOrientation(Quatd(0.707, 0.707, 0.0, 0.0));
258 auto geometry = std::make_shared<CompoundGeometry>();
261 auto hook1 = std::make_shared<Capsule>();
262 hook1->setRadius(0.15);
267 geometry->add(hook1);
269 geometry->setLocalTransform(1, getJawPosition(1.5));
271 auto hook2 = std::make_shared<Capsule>();
272 hook2->setRadius(0.15);
276 geometry->add(hook2);
278 geometry->setLocalTransform(2, getJawPosition(-1.5));
280 auto toolObj = std::make_shared<PbdObject>(
"Tool");
284 toolObj->setPhysicsGeometry(geometry);
285 toolObj->setCollidingGeometry(geometry);
286 toolObj->setDynamicalModel(model);
287 toolObj->getPbdBody()->setRigid(
288 Vec3d(0.0, 2.0, 2.0),
291 Mat3d::Identity() * 100000.0);
293 auto visuals = std::make_shared<VisualModel>();
294 visuals->setGeometry(body);
295 toolObj->addVisualModel(visuals);
296 toolObj->getVisualModel(0)->getRenderMaterial()->setOpacity(0.9);
299 auto visuals = std::make_shared<VisualModel>();
300 visuals->setGeometry(hook1);
301 toolObj->addVisualModel(visuals);
302 toolObj->getVisualModel(1)->getRenderMaterial()->setOpacity(0.9);
305 auto visuals = std::make_shared<VisualModel>();
306 visuals->setGeometry(hook2);
307 toolObj->addVisualModel(visuals);
308 toolObj->getVisualModel(2)->getRenderMaterial()->setOpacity(0.9);
312 controller->setControlledObject(toolObj);
313 controller->setTranslationScaling(100.0);
314 controller->setLinearKs(1000.0);
315 controller->setAngularKs(1000000000.0);
316 controller->setUseCritDamping(
true);
317 controller->setForceScaling(0.01);
318 controller->setSmoothingKernelSize(15);
319 controller->setUseForceSmoothening(
true);
322 controllerGhost->setController(controller);
330 static std::shared_ptr<PbdObject>
331 makeCapsuleToolObj(std::shared_ptr<PbdModel> model)
333 auto toolGeometry = std::make_shared<Capsule>();
334 toolGeometry->setRadius(0.4);
335 toolGeometry->setLength(4.0);
336 toolGeometry->setPosition(Vec3d(0.0, 0.0, 0.0));
337 toolGeometry->setOrientation(Quatd(0.707, 0.707, 0.0, 0.0));
339 auto toolObj = std::make_shared<PbdObject>(
"Tool");
342 toolObj->setVisualGeometry(toolGeometry);
343 toolObj->setPhysicsGeometry(toolGeometry);
344 toolObj->setCollidingGeometry(toolGeometry);
345 toolObj->setDynamicalModel(model);
346 toolObj->getPbdBody()->setRigid(
347 Vec3d(0.0, 2.0, 2.0),
350 Mat3d::Identity() * 100000.0);
352 toolObj->getVisualModel(0)->getRenderMaterial()->setOpacity(1.0);
356 controller->setControlledObject(toolObj);
357 controller->setTranslationScaling(100.0);
358 controller->setLinearKs(1000.0);
359 controller->setAngularKs(1000000000.0);
360 controller->setUseCritDamping(
true);
361 controller->setForceScaling(0.01);
362 controller->setSmoothingKernelSize(15);
363 controller->setUseForceSmoothening(
true);
367 controllerGhost->setController(controller);
374 std::shared_ptr<PbdObject> tool;
375 std::shared_ptr<CompoundGeometry> compoundGeometry;
376 std::vector<std::shared_ptr<PbdObjectGrasping>> graspers;
377 std::vector<std::shared_ptr<AnalyticalGeometry>> geometry;
383 data.geometry.clear();
384 for (
int i = 0; i < data.graspers.size(); ++i)
386 auto capsule = std::dynamic_pointer_cast<
Capsule>(data.compoundGeometry->get(i + 1));
387 CHECK(capsule !=
nullptr);
388 auto dilatedCapsule = std::make_shared<Capsule>(*capsule);
389 dilatedCapsule->setRadius(capsule->getRadius() * 1.1);
390 data.geometry.push_back(dilatedCapsule);
391 data.graspers[i]->beginCellGrasp(dilatedCapsule);
398 for (
int i = 0; i < data.graspers.size(); ++i)
400 auto t = data.compoundGeometry->get(i + 1)->getTransform();
401 data.geometry[i]->setTransform(t);
402 data.graspers[i]->regrasp();
413 auto scene = std::make_shared<Scene>(
"PbdConnectiveTissue");
414 scene->getActiveCamera()->setPosition(0.944275, 8.47551, 21.4164);
415 scene->getActiveCamera()->setFocalPoint(-0.450427, 0.519797, 0.817356);
416 scene->getActiveCamera()->setViewUp(-0.0370536, 0.933044, -0.357851);
419 auto pbdModel = std::make_shared<PbdModel>();
420 pbdModel->getConfig()->m_doPartitioning =
false;
421 pbdModel->getConfig()->m_dt = 0.001;
422 pbdModel->getConfig()->m_iterations = 6;
423 pbdModel->getConfig()->m_gravity = Vec3d(0.0, -981.0, 0.0);
424 pbdModel->getConfig()->m_linearDampingCoeff = 0.005;
425 pbdModel->getConfig()->m_angularDampingCoeff = 0.005;
428 std::shared_ptr<PbdObject> gallbladerObj = makeGallBladder(
"Gallbladder", pbdModel);
429 scene->addSceneObject(gallbladerObj);
430 gallbladerObj->addComponent<
Burnable>();
433 std::shared_ptr<PbdObject> kidneyObj = makeKidney(
"Kidney", pbdModel);
434 scene->addSceneObject(kidneyObj);
437 double maxDist = 3.5;
438 std::shared_ptr<PbdObject> connectiveStrands = makeConnectiveTissue(gallbladerObj, kidneyObj, pbdModel, maxDist, 2.5, 10);
439 pbdModel->getConfig()->setBodyDamping(connectiveStrands->getPbdBody()->bodyHandle, 0.015, 0.0);
445 connectiveStrands->addComponent<
Burnable>();
448 scene->addSceneObject(connectiveStrands);
451 std::shared_ptr<PbdObject> toolObj = makeHookToolObject(pbdModel);
452 scene->addSceneObject(toolObj);
455 auto strandCollision = std::make_shared<PbdObjectCollision>(connectiveStrands, toolObj);
456 scene->addInteraction(strandCollision);
458 auto gallCollision = std::make_shared<PbdObjectCollision>(gallbladerObj, toolObj);
459 scene->addInteraction(gallCollision);
462 auto grasper = std::make_shared<PbdObjectGrasping>(connectiveStrands, toolObj);
463 grasper->setStiffness(0.5);
464 scene->addInteraction(grasper);
466 auto grasper_gall = std::make_shared<PbdObjectGrasping>(gallbladerObj, toolObj);
467 grasper_gall->setStiffness(0.5);
468 scene->addInteraction(grasper_gall);
471 auto burning = std::make_shared<Burner>();
472 burning->addObject(connectiveStrands);
473 burning->addObject(gallbladerObj);
474 burning->setOnTime(1.0);
475 burning->setWattage(200);
477 auto compound = std::dynamic_pointer_cast<
CompoundGeometry>(toolObj->getCollidingGeometry());
479 burning->setBurnerGeometry(geom);
482 toolObj->addComponent(burning);
485 auto light = std::make_shared<DirectionalLight>();
486 light->setFocalPoint(Vec3d(5.0, -8.0, -5.0));
487 light->setIntensity(1.0);
488 scene->addLight(
"Light", light);
493 auto viewer = std::make_shared<VTKViewer>();
494 viewer->setVtkLoggerMode(VTKViewer::VTKLoggerMode::MUTE);
495 viewer->setActiveScene(scene);
496 viewer->setDebugAxesLength(1.0, 1.0, 1.0);
499 auto sceneManager = std::make_shared<SceneManager>();
500 sceneManager->setActiveScene(scene);
501 sceneManager->pause();
503 auto driver = std::make_shared<SimulationManager>();
504 driver->setDesiredDt(0.005);
505 driver->addModule(viewer);
506 driver->addModule(sceneManager);
509 #ifdef iMSTK_USE_HAPTICS 512 if (hapticManager->getTypeName() ==
"HaplyDeviceManager")
514 controller->setTranslationOffset(Vec3d(2.0, 0.0, -2.0));
516 std::shared_ptr<DeviceClient> deviceClient = hapticManager->makeDeviceClient();
517 driver->addModule(hapticManager);
519 connect<ButtonEvent>(deviceClient, &DeviceClient::buttonStateChanged,
522 if (e->m_buttonState == BUTTON_PRESSED)
524 if (e->m_button == 1)
526 std::shared_ptr<Capsule> capsule;
527 capsule = std::dynamic_pointer_cast<
Capsule>(toolObj->getCollidingGeometry());
529 if (capsule ==
nullptr)
531 auto compound = std::dynamic_pointer_cast<
CompoundGeometry>(toolObj->getCollidingGeometry());
532 capsule = std::dynamic_pointer_cast<
Capsule>(compound->get(1));
535 auto dilatedCapsule = std::make_shared<Capsule>(*capsule);
536 dilatedCapsule->setRadius(capsule->getRadius() * 1.1);
537 grasper->beginCellGrasp(dilatedCapsule);
538 grasper_gall->beginCellGrasp(dilatedCapsule);
540 gallCollision->setEnabled(
false);
542 std::cout <<
"Grasping! \n";
545 else if (e->m_buttonState == BUTTON_RELEASED)
547 if (e->m_button == 1)
550 grasper_gall->endGrasp();
551 gallCollision->setEnabled(
true);
553 std::cout <<
"Released! \n";
558 auto deviceClient = std::make_shared<DummyClient>();
559 connect<Event>(sceneManager, &SceneManager::postUpdate,
562 const Vec2d mousePos = viewer->getMouseDevice()->getPos();
563 const Vec3d worldPos = Vec3d(mousePos[0] - 0.5, mousePos[1] - 0.5, 0.0) * 0.1;
565 deviceClient->setPosition(worldPos);
569 connect<Event>(viewer->getMouseDevice(), &MouseDeviceClient::mouseButtonPress,
572 grasper->beginVertexGrasp(std::dynamic_pointer_cast<Capsule>(toolObj->getCollidingGeometry()));
575 connect<Event>(viewer->getMouseDevice(), &MouseDeviceClient::mouseButtonRelease,
584 controller->setDevice(deviceClient);
587 std::shared_ptr<Entity> mouseAndKeyControls =
588 SimulationUtils::createDefaultSceneControl(driver);
589 scene->addSceneObject(mouseAndKeyControls);
591 double origin = PI + PI / 2;
593 std::shared_ptr<KeyboardDeviceClient> keyDevice = viewer->getKeyboardDevice();
594 connect<Event>(sceneManager, &SceneManager::postUpdate, [&](
Event*)
597 if (keyDevice->getButton(
'b') == KEY_PRESS)
601 if (keyDevice->getButton(
'b') == KEY_RELEASE)
606 if (keyDevice->getButton(
'g') == KEY_PRESS && grasper->getGraspState() ==
false && grasper_gall->getGraspState() ==
false)
609 std::shared_ptr<Capsule> capsule;
610 capsule = std::dynamic_pointer_cast<
Capsule>(toolObj->getCollidingGeometry());
612 if (capsule ==
nullptr)
614 auto compound = std::dynamic_pointer_cast<
CompoundGeometry>(toolObj->getCollidingGeometry());
615 capsule = std::dynamic_pointer_cast<
Capsule>(compound->get(1));
617 auto dilatedCapsule = std::make_shared<Capsule>(*capsule);
618 dilatedCapsule->setRadius(capsule->getRadius() * 1.1);
619 grasper->beginCellGrasp(dilatedCapsule);
620 grasper_gall->beginCellGrasp(dilatedCapsule);
622 std::cout <<
"Grasping! \n";
624 if (keyDevice->getButton(
'g') == KEY_RELEASE && (grasper_gall->getGraspState() || grasper->getGraspState()))
627 grasper_gall->endGrasp();
629 std::cout <<
"Released! \n";
631 if (keyDevice->getButton(
'o') == KEY_PRESS)
633 auto compound = std::dynamic_pointer_cast<
CompoundGeometry>(toolObj->getCollidingGeometry());
634 angle += (angle < 0.6) ? 0.025 : 0.0;
636 compound->setLocalTransform(2, getJawPosition(origin - angle));
638 if (keyDevice->getButton(
'i') == KEY_PRESS)
640 auto compound = std::dynamic_pointer_cast<
CompoundGeometry>(toolObj->getCollidingGeometry());
641 angle -= (angle > 0) ? 0.025 : 0.0;
643 compound->setLocalTransform(2, getJawPosition(origin - angle));
654 runGraspingToolScene()
660 auto scene = std::make_shared<Scene>(
"PbdConnectiveTissue");
661 scene->getActiveCamera()->setPosition(0.944275, 8.47551, 21.4164);
662 scene->getActiveCamera()->setFocalPoint(-0.450427, 0.519797, 0.817356);
663 scene->getActiveCamera()->setViewUp(-0.0370536, 0.933044, -0.357851);
666 auto pbdModel = std::make_shared<PbdModel>();
667 pbdModel->getConfig()->m_doPartitioning =
false;
668 pbdModel->getConfig()->m_dt = 0.001;
669 pbdModel->getConfig()->m_iterations = 6;
670 pbdModel->getConfig()->m_gravity = Vec3d(0.0, -981.0, 0.0);
671 pbdModel->getConfig()->m_linearDampingCoeff = 0.005;
672 pbdModel->getConfig()->m_angularDampingCoeff = 0.005;
675 std::shared_ptr<PbdObject> gallbladerObj = makeGallBladder(
"Gallbladder", pbdModel);
676 scene->addSceneObject(gallbladerObj);
679 std::shared_ptr<PbdObject> kidneyObj = makeKidney(
"Kidney", pbdModel);
680 scene->addSceneObject(kidneyObj);
683 double maxDist = 3.5;
684 std::shared_ptr<PbdObject> connectiveStrands = makeConnectiveTissue(gallbladerObj, kidneyObj, pbdModel, maxDist, 2.5, 10);
685 pbdModel->getConfig()->setBodyDamping(connectiveStrands->getPbdBody()->bodyHandle, 0.015, 0.0);
688 connectiveStrands->addComponent<
Tearable>();
691 auto burnable = std::make_shared<Burnable>();
692 connectiveStrands->addComponent(burnable);
695 scene->addSceneObject(connectiveStrands);
698 std::shared_ptr<PbdObject> toolObj = makeGraspingToolObject(pbdModel);
699 scene->addSceneObject(toolObj);
702 auto strandCollision = std::make_shared<PbdObjectCollision>(connectiveStrands, toolObj);
703 scene->addInteraction(strandCollision);
705 auto gallCollision = std::make_shared<PbdObjectCollision>(gallbladerObj, toolObj);
706 scene->addInteraction(gallCollision);
709 graspingData.tool = toolObj;
710 graspingData.compoundGeometry = std::dynamic_pointer_cast<
CompoundGeometry>(toolObj->getCollidingGeometry());
712 auto compoundGeomtry = std::dynamic_pointer_cast<
CompoundGeometry>(toolObj->getCollidingGeometry());
713 CHECK(compoundGeomtry !=
nullptr);
716 auto grasper = std::make_shared<PbdObjectGrasping>(connectiveStrands, toolObj);
718 grasper->setStiffness(0.5);
719 scene->addInteraction(grasper);
720 graspingData.graspers.push_back(grasper);
723 auto grasper = std::make_shared<PbdObjectGrasping>(connectiveStrands, toolObj);
724 grasper->setStiffness(0.5);
725 scene->addInteraction(grasper);
726 graspingData.graspers.push_back(grasper);
731 auto grasper_gall = std::make_shared<PbdObjectGrasping>(gallbladerObj, toolObj);
732 grasper_gall->setStiffness(0.5);
733 scene->addInteraction(grasper_gall);
736 auto light = std::make_shared<DirectionalLight>();
737 light->setFocalPoint(Vec3d(5.0, -8.0, -5.0));
738 light->setIntensity(1.0);
739 scene->addLight(
"Light", light);
744 auto viewer = std::make_shared<VTKViewer>();
745 viewer->setVtkLoggerMode(VTKViewer::VTKLoggerMode::MUTE);
746 viewer->setActiveScene(scene);
747 viewer->setDebugAxesLength(1.0, 1.0, 1.0);
750 auto sceneManager = std::make_shared<SceneManager>();
751 sceneManager->setActiveScene(scene);
752 sceneManager->pause();
754 auto driver = std::make_shared<SimulationManager>();
755 driver->setDesiredDt(0.005);
756 driver->addModule(viewer);
757 driver->addModule(sceneManager);
760 #ifdef iMSTK_USE_HAPTICS 763 if (hapticManager->getTypeName() ==
"HaplyDeviceManager")
765 controller->setTranslationOffset(Vec3d(2.0, 0.0, -2.0));
767 std::shared_ptr<DeviceClient> deviceClient = hapticManager->makeDeviceClient();
768 driver->addModule(hapticManager);
770 auto deviceClient = std::make_shared<DummyClient>();
771 connect<Event>(sceneManager, &SceneManager::postUpdate,
774 const Vec2d mousePos = viewer->getMouseDevice()->getPos();
775 const Vec3d worldPos = Vec3d(mousePos[0] - 0.5, mousePos[1] - 0.5, 0.0) * 0.1;
777 deviceClient->setPosition(worldPos);
783 controller->setDevice(deviceClient);
786 std::shared_ptr<Entity> mouseAndKeyControls =
787 SimulationUtils::createDefaultSceneControl(driver);
788 scene->addSceneObject(mouseAndKeyControls);
790 double origin = PI + PI / 2;
792 std::shared_ptr<KeyboardDeviceClient> keyDevice = viewer->getKeyboardDevice();
794 bool m_closing =
false;
795 bool m_opening =
true;
797 auto openJaws = [&]() {
801 for (
auto& grasper : graspingData.graspers)
808 auto compound = std::dynamic_pointer_cast<
CompoundGeometry>(toolObj->getCollidingGeometry());
809 angle += (angle < 0.6) ? 0.025 : 0.0;
811 compound->setLocalTransform(2, getJawPosition(origin - angle));
814 auto closeJaws = [&]() {
818 startGraspingToolGrasp(graspingData);
824 regraspGraspingTool(graspingData);
827 auto compound = std::dynamic_pointer_cast<
CompoundGeometry>(toolObj->getCollidingGeometry());
828 angle -= (angle > 0) ? 0.025 : 0.0;
830 compound->setLocalTransform(2, getJawPosition(origin - angle));
833 connect<Event>(sceneManager, &SceneManager::postUpdate, [&](
Event*)
835 if (keyDevice->getButton(
'o') == KEY_PRESS || deviceClient->getButton(0) != 0)
839 if (keyDevice->getButton(
'i') == KEY_PRESS || deviceClient->getButton(1) != 0)
Base class for any analytical geometrical representation.
Base class for events which contain a type, priority, and data priority defaults to 0 and uses a grea...
This class uses the provided device to control the provided rigid object via virtual coupling...
Defines the behaviour to allow a Pbd Object to be burned. This object creates the state data on the m...
Defines the behaviour to allow a mesh to seperate based on strain in a given cell. This class approximates strain using the constraint value in from the PBD solver. This is well defined for line meshes, but the behavior may not be what is expected for surface or tet meshes.
static std::shared_ptr< DeviceManager > makeDeviceManager()
Attempts to create a new DeviceManager by whichever is default If multiple haptic managers are built ...
void setLocalTransform(size_t index, const Mat4d &transform)
A behaviour that renders a second copy of the controlled object at a lower opacity in the physical po...
Capsule geometry, default configuration is centered at origin with length running up and down the y a...
static LoggerG3 & startLogger()
Starts logger with default sinks, use getInstance to create a logger with no sinks.