7 #include "imstkCamera.h" 8 #include "imstkCapsule.h" 9 #include "imstkCompositeImplicitGeometry.h" 10 #include "imstkDirectionalLight.h" 11 #include "imstkGeometryUtilities.h" 12 #include "imstkImplicitGeometryToImageData.h" 13 #include "imstkKeyboardDeviceClient.h" 14 #include "imstkKeyboardSceneControl.h" 15 #include "imstkMouseDeviceClient.h" 16 #include "imstkMouseSceneControl.h" 17 #include "imstkOrientedBox.h" 18 #include "imstkPbdAngularConstraint.h" 19 #include "imstkPbdModel.h" 20 #include "imstkPbdModelConfig.h" 21 #include "imstkPbdObject.h" 22 #include "imstkPbdObjectCollision.h" 23 #include "imstkPlane.h" 24 #include "imstkRenderMaterial.h" 25 #include "imstkScene.h" 26 #include "imstkSceneManager.h" 27 #include "imstkSimulationManager.h" 28 #include "imstkSimulationUtils.h" 29 #include "imstkSphere.h" 30 #include "imstkSurfaceMeshFlyingEdges.h" 31 #include "imstkSurfaceMeshSubdivide.h" 32 #include "imstkVisualModel.h" 33 #include "imstkVTKViewer.h" 35 using namespace imstk;
40 static std::shared_ptr<PbdObject>
41 makeTissueObj(
const std::string& name,
42 std::shared_ptr<PbdModel> model,
47 const double particleMassValue,
48 const double distStiffness,
const double bendStiffness)
51 std::shared_ptr<SurfaceMesh> tissueMesh =
53 Vec2d(width, height), Vec2i(rowCount, colCount));
56 model->getConfig()->enableConstraint(PbdModelConfig::ConstraintGenType::Distance, distStiffness);
57 model->getConfig()->enableConstraint(PbdModelConfig::ConstraintGenType::Dihedral, bendStiffness);
60 auto material = std::make_shared<RenderMaterial>();
61 material->setBackFaceCulling(
false);
62 material->setDisplayMode(RenderMaterial::DisplayMode::WireframeSurface);
65 auto visualModel = std::make_shared<VisualModel>();
66 visualModel->setGeometry(tissueMesh);
67 visualModel->setRenderMaterial(material);
70 auto pbdObject = std::make_shared<PbdObject>(name);
71 pbdObject->addVisualModel(visualModel);
72 pbdObject->setPhysicsGeometry(tissueMesh);
73 pbdObject->setCollidingGeometry(tissueMesh);
74 pbdObject->setDynamicalModel(model);
76 pbdObject->getPbdBody()->uniformMassValue = particleMassValue;
77 for (
int x = 0; x < rowCount; x++)
79 for (
int y = 0; y < colCount; y++)
81 if (x == 0 || y == 0 || x == rowCount - 1 || y == colCount - 1)
83 pbdObject->getPbdBody()->fixedNodeIds.push_back(x * colCount + y);
98 auto scene = std::make_shared<Scene>(
"PbdRigidBody");
99 scene->getActiveCamera()->setFocalPoint(0.0, 0.0, 0.0);
100 scene->getActiveCamera()->setPosition(-0.0237419, 0.0368787, 0.338374);
101 scene->getActiveCamera()->setViewUp(0.0, 1.0, 0.0);
103 auto pbdModel = std::make_shared<PbdModel>();
104 auto pbdConfig = std::make_shared<PbdModelConfig>();
106 pbdConfig->m_gravity = Vec3d(0.0, -9.8, 0.0);
107 pbdConfig->m_dt = 0.001;
108 pbdConfig->m_iterations = 10;
109 pbdConfig->m_linearDampingCoeff = 0.001;
110 pbdConfig->m_angularDampingCoeff = 0.001;
111 pbdConfig->m_doPartitioning =
false;
112 pbdModel->configure(pbdConfig);
114 auto planeObj = std::make_shared<CollidingObject>(
"plane");
115 auto planeGeom = std::make_shared<Plane>(Vec3d(0.0, 0.0, 0.0), Vec3d(0.0, 1.0, 0.0));
116 planeGeom->setWidth(1.0);
117 planeObj->setVisualGeometry(planeGeom);
118 planeObj->setCollidingGeometry(planeGeom);
119 scene->addSceneObject(planeObj);
122 auto rigidPbdObj = std::make_shared<PbdObject>(
"rigidPbdObj");
126 auto rigidGeom = std::make_shared<Capsule>(Vec3d(0.0, 0.0, 0.0), 0.05, 0.25);
128 rigidPbdObj->setVisualGeometry(surfMesh);
129 rigidPbdObj->setCollidingGeometry(surfMesh);
130 rigidPbdObj->setPhysicsGeometry(surfMesh);
133 rigidPbdObj->getVisualModel(0)->getRenderMaterial()->setColor(
Color(0.9, 0.0, 0.0));
135 rigidPbdObj->getVisualModel(0)->getRenderMaterial()->setDisplayMode(RenderMaterial::DisplayMode::WireframeSurface);
136 rigidPbdObj->getVisualModel(0)->getRenderMaterial()->setRoughness(0.5);
137 rigidPbdObj->getVisualModel(0)->getRenderMaterial()->setMetalness(1.0);
138 rigidPbdObj->getVisualModel(0)->getRenderMaterial()->setIsDynamicMesh(
false);
140 rigidPbdObj->setDynamicalModel(pbdModel);
143 const Quatd orientation = Quatd::FromTwoVectors(Vec3d(0.0, 1.0, 0.0), Vec3d(1.0, 1.0, 1.0).normalized());
144 rigidPbdObj->getPbdBody()->setRigid(Vec3d(0.0, 0.2, 0.0),
145 1.0, orientation, Mat3d::Identity() * 0.01);
147 scene->addSceneObject(rigidPbdObj);
149 auto collision = std::make_shared<PbdObjectCollision>(rigidPbdObj, planeObj);
150 collision->setRigidBodyCompliance(0.000001);
151 scene->addSceneObject(collision);
154 auto light = std::make_shared<DirectionalLight>();
155 light->setFocalPoint(Vec3d(5.0, -8.0, -5.0));
156 light->setIntensity(1.0);
157 scene->addLight(
"Light", light);
162 auto viewer = std::make_shared<VTKViewer>();
163 viewer->setVtkLoggerMode(VTKViewer::VTKLoggerMode::MUTE);
164 viewer->setActiveScene(scene);
165 viewer->setDebugAxesLength(0.01, 0.01, 0.01);
168 auto sceneManager = std::make_shared<SceneManager>();
169 sceneManager->setActiveScene(scene);
170 sceneManager->pause();
172 auto driver = std::make_shared<SimulationManager>();
173 driver->addModule(viewer);
174 driver->addModule(sceneManager);
175 driver->setDesiredDt(0.001);
179 std::shared_ptr<Entity> mouseAndKeyControls =
180 SimulationUtils::createDefaultSceneControl(driver);
181 scene->addSceneObject(mouseAndKeyControls);
183 std::shared_ptr<KeyboardDeviceClient> keyDevice = viewer->getKeyboardDevice();
184 const Vec3d dx = scene->getActiveCamera()->getPosition() - scene->getActiveCamera()->getFocalPoint();
185 const double speed = 10.0;
186 connect<KeyEvent>(keyDevice, &KeyboardDeviceClient::keyPress, [&](
KeyEvent* e)
190 if (collision->getFriction() == 0.0)
192 collision->setFriction(0.5);
196 collision->setFriction(0.0);
200 connect<Event>(sceneManager, &SceneManager::postUpdate, [&](
Event*)
202 Vec3d extForce = Vec3d(0.0, 0.0, 0.0);
203 Vec3d extTorque = Vec3d(0.0, 0.0, 0.0);
205 if (keyDevice->getButton(
'i') == KEY_PRESS)
207 extForce += Vec3d(0.0, 0.0, -1.0) * speed;
209 if (keyDevice->getButton(
'k') == KEY_PRESS)
211 extForce += Vec3d(0.0, 0.0, 1.0) * speed;
213 if (keyDevice->getButton(
'j') == KEY_PRESS)
215 extForce += Vec3d(-1.0, 0.0, 0.0) * speed;
217 if (keyDevice->getButton(
'l') == KEY_PRESS)
219 extForce += Vec3d(1.0, 0.0, 0.0) * speed;
222 if (keyDevice->getButton(
'u') == KEY_PRESS)
224 extTorque += Vec3d(0.0, -0.1, 0.0);
226 if (keyDevice->getButton(
'o') == KEY_PRESS)
228 extTorque += Vec3d(0.0, 0.1, 0.0);
230 rigidPbdObj->getPbdBody()->externalForce = extForce;
231 rigidPbdObj->getPbdBody()->externalTorque = extTorque;
245 auto scene = std::make_shared<Scene>(
"RbdSDFCollision");
246 auto cubeObj = std::make_shared<PbdObject>(
"Cube");
249 auto pbdModel = std::make_shared<PbdModel>();
250 auto pbdConfig = std::make_shared<PbdModelConfig>();
252 pbdConfig->m_gravity = Vec3d(0.0, -9.8, 0.0);
253 pbdConfig->m_dt = 0.001;
254 pbdConfig->m_iterations = 10;
255 pbdConfig->m_linearDampingCoeff = 0.001;
256 pbdConfig->m_angularDampingCoeff = 0.001;
257 pbdConfig->m_doPartitioning =
false;
258 pbdModel->configure(pbdConfig);
261 auto planeObj = std::make_shared<CollidingObject>(
"Plane");
264 auto planeGeom = std::make_shared<Plane>();
265 planeGeom->setWidth(1.0);
266 auto sphereGeom = std::make_shared<Sphere>();
267 sphereGeom->setRadius(0.625);
268 sphereGeom->setPosition(0.0, 0.4, 0.0);
269 auto compGeom = std::make_shared<CompositeImplicitGeometry>();
270 compGeom->addImplicitGeometry(planeGeom, CompositeImplicitGeometry::GeometryBoolType::Union);
271 compGeom->addImplicitGeometry(sphereGeom, CompositeImplicitGeometry::GeometryBoolType::Difference);
283 toImage.setBounds(bounds);
284 toImage.setDimensions(Vec3i(80, 80, 80));
291 toSurfMesh.getOutputMesh()->flipNormals();
294 planeObj->setVisualGeometry(toSurfMesh.getOutputMesh());
295 planeObj->setCollidingGeometry(compGeom);
297 scene->addSceneObject(planeObj);
302 auto cubeGeom = std::make_shared<OrientedBox>(Vec3d::Zero(), Vec3d(0.0375, 0.075, 0.025));
306 subdivide.setInputMesh(surfMesh);
307 subdivide.setNumberOfSubdivisions(1);
311 auto visualModel = std::make_shared<VisualModel>();
312 visualModel->setGeometry(subdivide.getOutputMesh());
313 auto material = std::make_shared<RenderMaterial>();
314 material->setDisplayMode(RenderMaterial::DisplayMode::WireframeSurface);
315 material->setLineWidth(2.0);
316 material->setColor(Color::Orange);
317 visualModel->setRenderMaterial(material);
320 cubeObj->setDynamicalModel(pbdModel);
321 cubeObj->setPhysicsGeometry(subdivide.getOutputMesh());
322 cubeObj->setCollidingGeometry(subdivide.getOutputMesh());
323 cubeObj->addVisualModel(visualModel);
324 cubeObj->getPbdBody()->setRigid(Vec3d(0.0, 0.2, 0.0), 1.0,
325 Quatd(Rotd(0.4, Vec3d(1.0, 0.0, 0.0))), Mat3d::Identity() * 0.01);
327 scene->addSceneObject(cubeObj);
330 auto rbdInteraction = std::make_shared<PbdObjectCollision>(cubeObj, planeObj,
"ImplicitGeometryToPointSetCD");
331 rbdInteraction->setRigidBodyCompliance(0.00001);
334 scene->addInteraction(rbdInteraction);
337 scene->getActiveCamera()->setPosition(0.0, 1.0, 1.0);
340 auto light = std::make_shared<DirectionalLight>();
341 light->setIntensity(1.0);
342 scene->addLight(
"light", light);
348 auto viewer = std::make_shared<VTKViewer>();
349 viewer->setActiveScene(scene);
352 auto sceneManager = std::make_shared<SceneManager>();
353 sceneManager->setActiveScene(scene);
354 sceneManager->pause();
356 auto driver = std::make_shared<SimulationManager>();
357 driver->addModule(viewer);
358 driver->addModule(sceneManager);
359 driver->setDesiredDt(0.001);
362 std::shared_ptr<Entity> mouseAndKeyControls =
363 SimulationUtils::createDefaultSceneControl(driver);
364 scene->addSceneObject(mouseAndKeyControls);
366 LOG(INFO) <<
"Cube Controls:";
367 LOG(INFO) <<
"----------------------------------------------------------------------";
368 LOG(INFO) <<
" | i - forward movement";
369 LOG(INFO) <<
" | j - left movement";
370 LOG(INFO) <<
" | l - right movement";
371 LOG(INFO) <<
" | k - backwards movement";
372 LOG(INFO) <<
" | u - rotate left";
373 LOG(INFO) <<
" | o - rotate right";
375 std::shared_ptr<KeyboardDeviceClient> keyDevice = viewer->getKeyboardDevice();
377 const Vec3d dx = scene->getActiveCamera()->getPosition() - scene->getActiveCamera()->getFocalPoint();
378 const double speed = 10.0;
379 connect<Event>(sceneManager, &SceneManager::postUpdate, [&](
Event*)
381 Vec3d extForce = Vec3d(0.0, 0.0, 0.0);
382 Vec3d extTorque = Vec3d(0.0, 0.0, 0.0);
384 if (keyDevice->getButton(
'i') == KEY_PRESS)
386 extForce += Vec3d(0.0, 0.0, -1.0) * speed;
388 if (keyDevice->getButton(
'k') == KEY_PRESS)
390 extForce += Vec3d(0.0, 0.0, 1.0) * speed;
392 if (keyDevice->getButton(
'j') == KEY_PRESS)
394 extForce += Vec3d(-1.0, 0.0, 0.0) * speed;
396 if (keyDevice->getButton(
'l') == KEY_PRESS)
398 extForce += Vec3d(1.0, 0.0, 0.0) * speed;
400 if (keyDevice->getButton(
'u') == KEY_PRESS)
402 extTorque += Vec3d(0.0, 1.5, 0.0);
404 if (keyDevice->getButton(
'o') == KEY_PRESS)
406 extTorque += Vec3d(0.0, -1.5, 0.0);
408 cubeObj->getPbdBody()->externalForce = extForce;
409 cubeObj->getPbdBody()->externalTorque = extTorque;
410 scene->getActiveCamera()->setFocalPoint((*cubeObj->getPbdBody()->vertices)[0]);
411 scene->getActiveCamera()->setPosition((*cubeObj->getPbdBody()->vertices)[0] + dx);
429 auto scene = std::make_shared<Scene>(
"PbdRigidBody");
430 scene->getActiveCamera()->setFocalPoint(0.0, 0.0, 0.0);
431 scene->getActiveCamera()->setPosition(-0.0237419, 0.0368787, 0.338374);
432 scene->getActiveCamera()->setViewUp(0.0, 1.0, 0.0);
434 auto pbdModel = std::make_shared<PbdModel>();
435 auto pbdConfig = std::make_shared<PbdModelConfig>();
436 pbdConfig->m_gravity = Vec3d(0.0, -9.8, 0.0);
437 pbdConfig->m_dt = 0.001;
438 pbdConfig->m_iterations = 5;
439 pbdConfig->m_linearDampingCoeff = 0.0;
440 pbdConfig->m_angularDampingCoeff = 0.0;
441 pbdConfig->m_doPartitioning =
false;
442 pbdModel->configure(pbdConfig);
445 std::shared_ptr<PbdObject> tissueObj = makeTissueObj(
"Tissue", pbdModel,
450 scene->addSceneObject(tissueObj);
451 pbdConfig->setBodyDamping(tissueObj->getPbdBody()->bodyHandle, 0.1);
454 auto capsuleObj = std::make_shared<PbdObject>(
"capsule0");
458 auto rigidGeom = std::make_shared<Capsule>(Vec3d(-0.005, 0.0, 0.0), 0.005, 0.015);
459 capsuleObj->setVisualGeometry(rigidGeom);
460 capsuleObj->setCollidingGeometry(rigidGeom);
461 capsuleObj->setPhysicsGeometry(rigidGeom);
464 capsuleObj->getVisualModel(0)->getRenderMaterial()->setColor(
Color(0.9, 0.0, 0.0));
466 capsuleObj->getVisualModel(0)->getRenderMaterial()->setRoughness(0.5);
467 capsuleObj->getVisualModel(0)->getRenderMaterial()->setMetalness(1.0);
468 capsuleObj->getVisualModel(0)->getRenderMaterial()->setIsDynamicMesh(
false);
470 capsuleObj->setDynamicalModel(pbdModel);
471 pbdConfig->setBodyDamping(capsuleObj->getPbdBody()->bodyHandle, 0.04, 0.01);
474 const Quatd orientation = Quatd::FromTwoVectors(Vec3d(0.0, 1.0, 0.0), Vec3d(1.0, 1.0, 0.0).normalized());
475 capsuleObj->getPbdBody()->setRigid(Vec3d(0.0, 0.05, 0.0), 1.0,
476 orientation, Mat3d::Identity() * 0.01);
478 scene->addSceneObject(capsuleObj);
480 auto collision = std::make_shared<PbdObjectCollision>(tissueObj, capsuleObj);
481 collision->setRigidBodyCompliance(0.00001);
482 scene->addSceneObject(collision);
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(0.01, 0.01, 0.01);
499 auto sceneManager = std::make_shared<SceneManager>();
500 sceneManager->setActiveScene(scene);
501 sceneManager->pause();
503 connect<Event>(sceneManager, &SceneManager::preUpdate, [&](
Event*)
505 pbdModel->getConfig()->m_dt = sceneManager->getDt();
508 auto driver = std::make_shared<SimulationManager>();
509 driver->addModule(viewer);
510 driver->addModule(sceneManager);
511 driver->setDesiredDt(0.001);
514 std::shared_ptr<Entity> mouseAndKeyControls =
515 SimulationUtils::createDefaultSceneControl(driver);
516 scene->addSceneObject(mouseAndKeyControls);
529 auto scene = std::make_shared<Scene>(
"PbdRigidBody");
530 scene->getActiveCamera()->setFocalPoint(0.0, 0.0, 0.0);
531 scene->getActiveCamera()->setPosition(-0.0237419, 0.0368787, 0.338374);
532 scene->getActiveCamera()->setViewUp(0.0, 1.0, 0.0);
534 auto pbdModel = std::make_shared<PbdModel>();
535 auto pbdConfig = std::make_shared<PbdModelConfig>();
536 pbdConfig->m_gravity = Vec3d(0.0, 0.0, 0.0);
537 pbdConfig->m_dt = 0.001;
538 pbdConfig->m_iterations = 5;
539 pbdConfig->m_linearDampingCoeff = 0.003;
540 pbdConfig->m_angularDampingCoeff = 0.003;
541 pbdConfig->m_doPartitioning =
false;
542 pbdModel->configure(pbdConfig);
545 auto rigidPbdObj = std::make_shared<PbdObject>(
"rigidPbdObj");
549 auto rigidGeom = std::make_shared<Capsule>(Vec3d(0.0, 0.0, 0.0), 0.5, 2.0);
551 rigidPbdObj->setVisualGeometry(surfMesh);
552 rigidPbdObj->setCollidingGeometry(surfMesh);
553 rigidPbdObj->setPhysicsGeometry(surfMesh);
556 rigidPbdObj->getVisualModel(0)->getRenderMaterial()->setColor(
Color(0.9, 0.0, 0.0));
558 rigidPbdObj->getVisualModel(0)->getRenderMaterial()->setRoughness(0.5);
559 rigidPbdObj->getVisualModel(0)->getRenderMaterial()->setMetalness(1.0);
560 rigidPbdObj->getVisualModel(0)->getRenderMaterial()->setIsDynamicMesh(
false);
562 rigidPbdObj->setDynamicalModel(pbdModel);
565 const Quatd orientation = Quatd::FromTwoVectors(Vec3d(1.0, 0.0, 0.0), Vec3d(0.0, 0.0, 1.0).normalized());
567 const Mat3d inertia = Vec3d(1.0, 1.0, 100.0).asDiagonal();
568 rigidPbdObj->getPbdBody()->setRigid(Vec3d(0.0, 0.0, 0.0),
569 1.0, orientation, inertia);
574 auto hingeConstraint = std::make_shared<PbdAngularHingeConstraint>();
575 hingeConstraint->initConstraint({ rigidPbdObj->getPbdBody()->bodyHandle, 0 }, Vec3d(1.0, 0.0, 0.0), 0.1);
579 scene->addSceneObject(rigidPbdObj);
582 auto light = std::make_shared<DirectionalLight>();
583 light->setFocalPoint(Vec3d(5.0, -8.0, -5.0));
584 light->setIntensity(1.0);
585 scene->addLight(
"Light", light);
590 auto viewer = std::make_shared<VTKViewer>();
591 viewer->setVtkLoggerMode(VTKViewer::VTKLoggerMode::MUTE);
592 viewer->setActiveScene(scene);
596 auto sceneManager = std::make_shared<SceneManager>();
597 sceneManager->setActiveScene(scene);
598 sceneManager->pause();
600 auto driver = std::make_shared<SimulationManager>();
601 driver->addModule(viewer);
602 driver->addModule(sceneManager);
603 driver->setDesiredDt(0.001);
606 std::shared_ptr<Entity> mouseAndKeyControls =
607 SimulationUtils::createDefaultSceneControl(driver);
608 scene->addSceneObject(mouseAndKeyControls);
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.
Container for pbd constraints.
Base class for events which contain a type, priority, and data priority defaults to 0 and uses a grea...
This filter rasterizes an implicit function to image of specified dimensions and bounds.
void setInputGeometry(std::shared_ptr< ImplicitGeometry > inputGeometry)
Required input, port 0.
This filter extracts a single isocontour from an imstkImageData.
void update()
Do the actual algorithm.
Provides the information of a key event (press, release, & which key)
void setInputImage(std::shared_ptr< ImageData > inputImage)
Required input, port 0.
virtual void addConstraint(std::shared_ptr< PbdConstraint > constraint)
Adds a constraint to the system, thread safe.
std::shared_ptr< SurfaceMesh > toSurfaceMesh(std::shared_ptr< AnalyticalGeometry > geom)
Produces SurfaceMesh from an analytical geometry.
Physically based rendering.
static LoggerG3 & startLogger()
Starts logger with default sinks, use getInstance to create a logger with no sinks.