7 #include "imstkCamera.h" 8 #include "imstkDeviceManager.h" 9 #include "imstkDeviceManagerFactory.h" 10 #include "imstkDirectionalLight.h" 11 #include "imstkGeometryUtilities.h" 12 #include "imstkKeyboardDeviceClient.h" 13 #include "imstkKeyboardSceneControl.h" 14 #include "imstkMouseDeviceClient.h" 15 #include "imstkMouseSceneControl.h" 16 #include "imstkPbdModel.h" 17 #include "imstkPbdModelConfig.h" 18 #include "imstkPbdObject.h" 19 #include "imstkPbdObjectCollision.h" 20 #include "imstkPbdObjectController.h" 21 #include "imstkPbdObjectCutting.h" 22 #include "imstkRenderMaterial.h" 23 #include "imstkScene.h" 24 #include "imstkSceneManager.h" 25 #include "imstkSceneObjectController.h" 26 #include "imstkSimulationManager.h" 27 #include "imstkSimulationUtils.h" 28 #include "imstkVertexLabelVisualModel.h" 29 #include "imstkVTKViewer.h" 31 using namespace imstk;
36 static std::shared_ptr<PbdObject>
37 makeTissueObj(
const std::string& name,
42 std::shared_ptr<PbdModel> model)
45 std::shared_ptr<SurfaceMesh> clothMesh =
47 Vec2d(width, height), Vec2i(nRows, nCols));
48 clothMesh->translate(Vec3d(0.0, height * 0.5, width * 0.5),
49 Geometry::TransformType::ApplyToData);
52 auto material = std::make_shared<RenderMaterial>();
53 material->setBackFaceCulling(
false);
54 material->setDisplayMode(RenderMaterial::DisplayMode::WireframeSurface);
56 auto visualModel = std::make_shared<VisualModel>();
57 visualModel->setGeometry(clothMesh);
58 visualModel->setRenderMaterial(material);
60 auto vertexLabelModel = std::make_shared<VertexLabelVisualModel>();
61 vertexLabelModel->setGeometry(clothMesh);
62 vertexLabelModel->setFontSize(20.0);
63 vertexLabelModel->setTextColor(Color::Red);
66 auto tissueObj = std::make_shared<PbdObject>();
67 tissueObj->addVisualModel(visualModel);
68 tissueObj->addVisualModel(vertexLabelModel);
69 tissueObj->setPhysicsGeometry(clothMesh);
70 tissueObj->setCollidingGeometry(clothMesh);
71 tissueObj->setDynamicalModel(model);
72 tissueObj->getPbdBody()->fixedNodeIds = { 0, nCols - 1 };
73 tissueObj->getPbdBody()->uniformMassValue = 0.01;
75 model->getConfig()->enableConstraint(PbdModelConfig::ConstraintGenType::Distance,
76 1e4, tissueObj->getPbdBody()->bodyHandle);
77 model->getConfig()->enableConstraint(PbdModelConfig::ConstraintGenType::Dihedral,
78 0.1, tissueObj->getPbdBody()->bodyHandle);
83 static std::shared_ptr<PbdObject>
84 makeToolObj(std::shared_ptr<PbdModel> model)
87 std::shared_ptr<SurfaceMesh> cutGeom =
89 Vec2d(0.03, 0.03), Vec2i(2, 2));
90 cutGeom->updatePostTransformData();
92 auto toolObj = std::make_shared<PbdObject>(
"CuttingObject");
93 toolObj->setVisualGeometry(cutGeom);
94 toolObj->setCollidingGeometry(cutGeom);
95 toolObj->setPhysicsGeometry(cutGeom);
96 toolObj->getVisualModel(0)->getRenderMaterial()->setDisplayMode(RenderMaterial::DisplayMode::WireframeSurface);
97 toolObj->getVisualModel(0)->getRenderMaterial()->setBackFaceCulling(
false);
99 toolObj->setDynamicalModel(model);
100 toolObj->getPbdBody()->setRigid(
101 Vec3d(0.0, 0.0, 0.0),
104 Mat3d::Identity() * 10000.0);
107 controller->setControlledObject(toolObj);
108 controller->setLinearKs(20000.0);
109 controller->setAngularKs(8000000.0);
110 controller->setUseCritDamping(
true);
111 controller->setForceScaling(0.025);
112 controller->setSmoothingKernelSize(10);
113 controller->setUseForceSmoothening(
true);
129 auto scene = std::make_shared<Scene>(
"PbdThinTissueCut");
130 scene->getActiveCamera()->setPosition(Vec3d(0.0, 0.1, 0.3));
131 scene->getActiveCamera()->setFocalPoint(Vec3d(0.0, 0.02, 0.05));
134 auto pbdModel = std::make_shared<PbdModel>();
135 pbdModel->getConfig()->m_doPartitioning =
false;
136 pbdModel->getConfig()->m_dt = 0.005;
137 pbdModel->getConfig()->m_iterations = 5;
139 pbdModel->getConfig()->m_gravity = Vec3d(0.0, -7.0, 0.0);
141 std::shared_ptr<PbdObject> toolObj = makeToolObj(pbdModel);
142 scene->addSceneObject(toolObj);
145 std::shared_ptr<PbdObject> tissueObj = makeTissueObj(
"Tissue",
148 scene->addSceneObject(tissueObj);
151 auto cutting = std::make_shared<PbdObjectCutting>(tissueObj, toolObj);
152 cutting->setEpsilon(0.001);
153 scene->addInteraction(cutting);
161 std::shared_ptr<DeviceClient> deviceClient = hapticManager->makeDeviceClient();
163 controller->setDevice(deviceClient);
166 auto light = std::make_shared<DirectionalLight>();
167 light->setFocalPoint(Vec3d(5.0, -8.0, -5.0));
168 light->setIntensity(1.0);
169 scene->addLight(
"light", light);
173 auto viewer = std::make_shared<VTKViewer>();
174 viewer->setActiveScene(scene);
177 auto sceneManager = std::make_shared<SceneManager>();
178 sceneManager->setActiveScene(scene);
179 sceneManager->pause();
181 auto driver = std::make_shared<SimulationManager>();
182 driver->addModule(hapticManager);
183 driver->addModule(viewer);
184 driver->addModule(sceneManager);
185 driver->setDesiredDt(0.005);
188 std::shared_ptr<Entity> mouseAndKeyControls =
189 SimulationUtils::createDefaultSceneControl(driver);
190 scene->addSceneObject(mouseAndKeyControls);
193 queueConnect<ButtonEvent>(deviceClient, &DeviceClient::buttonStateChanged, sceneManager,
197 if (e->m_button == 0 && e->m_buttonState == BUTTON_PRESSED)
202 connect<KeyEvent>(viewer->getKeyboardDevice(), &KeyboardDeviceClient::keyPress,
211 std::cout <<
"================================================\n";
212 std::cout <<
"Haptic button 0 or key 'g' to cut the cloth.\n";
213 std::cout <<
"================================================\n\n";
std::shared_ptr< SurfaceMesh > toTriangleGrid(const Vec3d ¢er, const Vec2d &size, const Vec2i &dim, const Quatd orientation=Quatd::Identity(), const double uvScale=1.0)
Produces a triangle grid on a plane given the imstkPlane.
This class uses the provided device to control the provided rigid object via virtual coupling...
static std::shared_ptr< DeviceManager > makeDeviceManager()
Attempts to create a new DeviceManager by whichever is default If multiple haptic managers are built ...
Provides the information of a key event (press, release, & which key)
static LoggerG3 & startLogger()
Starts logger with default sinks, use getInstance to create a logger with no sinks.