7 #include "imstkCamera.h" 8 #include "imstkCollisionUtils.h" 9 #include "imstkGeometryUtilities.h" 10 #include "imstkImageData.h" 11 #include "imstkKeyboardDeviceClient.h" 12 #include "imstkKeyboardSceneControl.h" 13 #include "imstkMeshIO.h" 14 #include "imstkMouseDeviceClient.h" 15 #include "imstkMouseSceneControl.h" 17 #include "imstkPbdModel.h" 18 #include "imstkPbdModelConfig.h" 19 #include "imstkPbdObject.h" 20 #include "imstkPbdObjectCollision.h" 21 #include "imstkPbdObjectGrasping.h" 22 #include "imstkPlane.h" 23 #include "imstkRenderMaterial.h" 24 #include "imstkScene.h" 25 #include "imstkSceneManager.h" 26 #include "imstkSimulationManager.h" 27 #include "imstkSimulationUtils.h" 28 #include "imstkSphere.h" 29 #include "imstkSurfaceMesh.h" 30 #include "imstkVisualModel.h" 31 #include "imstkVTKViewer.h" 33 using namespace imstk;
43 static std::shared_ptr<PbdObject>
44 makeThinTissueObj(
const std::string& name,
52 std::shared_ptr<SurfaceMesh> tissueMesh =
54 Quatd::Identity(), 2.0);
58 pbdParams->
enableConstraint(PbdModelConfig::ConstraintGenType::Distance, 1.0e2);
59 pbdParams->
enableConstraint(PbdModelConfig::ConstraintGenType::Dihedral, 0.05);
60 pbdParams->
m_gravity = Vec3d(0.0, -9.8, 0.0);
61 pbdParams->
m_dt = 0.005;
70 material->setBackFaceCulling(
false);
71 material->setDisplayMode(RenderMaterial::DisplayMode::Surface);
73 auto diffuseTex = MeshIO::read<ImageData>(iMSTK_DATA_ROOT
"/textures/fleshDiffuse.jpg");
74 material->
addTexture(std::make_shared<Texture>(diffuseTex, Texture::Type::Diffuse));
75 auto normalTex = MeshIO::read<ImageData>(iMSTK_DATA_ROOT
"/textures/fleshNormal.jpg");
76 material->
addTexture(std::make_shared<Texture>(normalTex, Texture::Type::Normal));
77 auto ormTex = MeshIO::read<ImageData>(iMSTK_DATA_ROOT
"/textures/fleshORM.jpg");
78 material->
addTexture(std::make_shared<Texture>(ormTex, Texture::Type::ORM));
82 visualModel->setGeometry(tissueMesh);
86 tissueObj->addVisualModel(visualModel);
87 tissueObj->setPhysicsGeometry(tissueMesh);
88 tissueObj->setCollidingGeometry(tissueMesh);
89 tissueObj->setDynamicalModel(pbdModel);
90 tissueObj->getPbdBody()->uniformMassValue = size[0] * size[1] / (dim[0] * dim[1]) * 0.01;
107 std::shared_ptr<PbdObject> tissueObj =
108 makeThinTissueObj(
"Tissue", Vec2d(5.0, 5.0), Vec2i(4, 4), Vec3d(0.0, 6.0, 0.0));
109 scene->addSceneObject(tissueObj);
111 auto planeObj = std::make_shared<CollidingObject>(
"Plane");
113 plane->setWidth(10.0);
114 planeObj->setVisualGeometry(plane);
115 planeObj->getVisualModel(0)->getRenderMaterial()->setDisplayMode(RenderMaterial::DisplayMode::Wireframe);
116 planeObj->setCollidingGeometry(plane);
117 scene->addSceneObject(planeObj);
120 scene->getActiveCamera()->setFocalPoint(-0.116722, 1.70485, 0.625839);
121 scene->getActiveCamera()->setPosition(2.25549, 8.07292, 14.8692);
123 auto clothCollision = std::make_shared<PbdObjectCollision>(tissueObj, planeObj);
124 clothCollision->setDeformableStiffnessA(0.3);
125 scene->addInteraction(clothCollision);
127 auto pbdGrasping = std::make_shared<PbdObjectGrasping>(tissueObj);
128 pbdGrasping->setStiffness(0.3);
129 scene->addInteraction(pbdGrasping);
134 clickObj->setVisualGeometry(clickSphere);
136 clickObj->getVisualModel(0)->getRenderMaterial()->setColor(Color::Red);
137 scene->addSceneObject(clickObj);
148 sceneManager->pause();
156 std::shared_ptr<Entity> mouseAndKeyControls =
157 SimulationUtils::createDefaultSceneControl(driver);
158 scene->addSceneObject(mouseAndKeyControls);
160 connect<MouseEvent>(viewer->
getMouseDevice(), &MouseDeviceClient::mouseButtonPress,
163 if (e->m_buttonId == 0)
168 const Vec3d rayDir = scene->getActiveCamera()->getEyeRayDir(
169 Vec2d(mousePos[0] * 2.0 - 1.0, mousePos[1] * 2.0 - 1.0));
170 const Vec3d rayStart = scene->getActiveCamera()->getPosition();
172 pbdGrasping->beginRayPointGrasp(clickSphere, rayStart, rayDir);
175 connect<MouseEvent>(viewer->
getMouseDevice(), &MouseDeviceClient::mouseMove,
181 const Vec3d rayDir = scene->getActiveCamera()->getEyeRayDir(
182 Vec2d(mousePos[0] * 2.0 - 1.0, mousePos[1] * 2.0 - 1.0));
183 const Vec3d rayStart = scene->getActiveCamera()->getPosition();
185 Vec3d iPt = Vec3d::Zero();
186 if (CollisionUtils::testRayToPlane(rayStart, rayDir,
187 plane->getPosition(), plane->getNormal(), iPt))
189 clickSphere->setPosition(iPt);
193 connect<MouseEvent>(viewer->
getMouseDevice(), &MouseDeviceClient::mouseButtonRelease,
196 if (e->m_buttonId == 0)
198 pbdGrasping->endGrasp();
202 connect<Event>(sceneManager, &SceneManager::preUpdate, [&](
Event*)
205 tissueObj->getPbdModel()->getConfig()->m_dt = sceneManager->getDt();
void addTexture(std::shared_ptr< Texture > texture)
Add/Remove/Get texture.
void configure(std::shared_ptr< PbdModelConfig > params)
Set simulation parameters.
void setDesiredDt(const double dt)
Sets the target fixed timestep (may violate), seconds This ultimately effects the number of iteration...
void setActiveScene(std::shared_ptr< Scene > scene) override
Set scene to be rendered.
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.
Base class for events which contain a type, priority, and data priority defaults to 0 and uses a grea...
Renders without shading, no lighting.
void addModule(std::shared_ptr< Module > module) override
Add a module to run.
void enableConstraint(ConstraintGenType type, const double stiffness, const int bodyId=2)
Enables a constraint of type defined by ConstraintGenType with given stiffness. If constraint of that...
unsigned int m_iterations
Internal constraints pbd solver iterations.
std::shared_ptr<T> obj = std::make_shared<T>(); equivalent, convenience class for STL shared allocati...
void setRenderMaterial(std::shared_ptr< RenderMaterial > renderMaterial)
Set/Get render material.
double m_dt
Time step size.
Provides the information of a mouse event, this includes button presses/releases and scrolling...
void setActiveScene(std::string newSceneName)
Sets the currently updating scene.
Physically based rendering.
std::shared_ptr< MouseDeviceClient > getMouseDevice() const override
Returns the device that emits mouse events.
static LoggerG3 & startLogger()
Starts logger with default sinks, use getInstance to create a logger with no sinks.
Vec3d m_gravity
Gravity acceleration.