7 #include "imstkCamera.h" 8 #include "imstkDeviceManager.h" 9 #include "imstkDeviceManagerFactory.h" 10 #include "imstkDirectionalLight.h" 11 #include "imstkKeyboardDeviceClient.h" 12 #include "imstkMeshIO.h" 13 #include "imstkMouseDeviceClient.h" 14 #include "imstkMouseSceneControl.h" 15 #include "imstkObjectControllerGhost.h" 16 #include "imstkOrientedBox.h" 17 #include "imstkPbdModel.h" 18 #include "imstkPbdModelConfig.h" 19 #include "imstkPbdObject.h" 20 #include "imstkPbdObjectCollision.h" 21 #include "imstkPbdObjectController.h" 22 #include "imstkPlane.h" 23 #include "imstkRenderMaterial.h" 24 #include "imstkScene.h" 25 #include "imstkSceneManager.h" 26 #include "imstkSimulationManager.h" 27 #include "imstkVisualModel.h" 29 #ifdef iMSTK_USE_RENDERING_VTK 30 #include "imstkKeyboardSceneControl.h" 31 #include "imstkSimulationUtils.h" 32 #include "imstkVTKViewer.h" 33 #include "imstkVTKRenderer.h" 36 using namespace imstk;
51 std::shared_ptr<DeviceClient> deviceClient = hapticManager->makeDeviceClient();
54 auto scene = std::make_shared<Scene>(
"VirtualCoupling");
55 scene->getActiveCamera()->setPosition(Vec3d(0.0, 0.2, 0.35));
56 scene->getActiveCamera()->setFocalPoint(Vec3d(0.0, 0.0, 0.0));
57 scene->getActiveCamera()->setViewUp(Vec3d(0.0, 1.0, 0.0));
59 std::shared_ptr<CollidingObject> obstacleObjs[] =
61 std::make_shared<CollidingObject>(
"Plane"),
62 std::make_shared<CollidingObject>(
"Cube")
66 auto plane = std::make_shared<Plane>();
68 obstacleObjs[0]->setVisualGeometry(plane);
69 obstacleObjs[0]->setCollidingGeometry(plane);
72 auto cube = std::make_shared<OrientedBox>(Vec3d(0.0, 0.0, 0.0),
73 Vec3d(0.05, 0.05, 0.05), Quatd(Rotd(1.0, Vec3d(0.0, 1.0, 0.0))));
74 obstacleObjs[1]->setVisualGeometry(cube);
75 obstacleObjs[1]->setCollidingGeometry(cube);
77 for (
int i = 0; i < 2; i++)
79 obstacleObjs[i]->getVisualModel(0)->getRenderMaterial()->setIsDynamicMesh(
false);
80 scene->addSceneObject(obstacleObjs[i]);
84 auto rbdObj = std::make_shared<PbdObject>();
86 auto model = std::make_shared<PbdModel>();
87 model->getConfig()->m_dt = 0.001;
88 model->getConfig()->m_gravity = Vec3d::Zero();
89 rbdObj->setDynamicalModel(model);
90 rbdObj->getPbdBody()->setRigid(
91 Vec3d(0.0, 0.05, 0.0),
94 Mat3d::Identity() * 100000000.0);
96 auto surfMesh = MeshIO::read<SurfaceMesh>(iMSTK_DATA_ROOT
"/Surgical Instruments/Scissors/Metzenbaum Scissors/Metz_Scissors.stl");
97 rbdObj->setCollidingGeometry(surfMesh);
98 rbdObj->setVisualGeometry(surfMesh);
99 rbdObj->setPhysicsGeometry(surfMesh);
101 std::shared_ptr<RenderMaterial> mat = rbdObj->getVisualModel(0)->getRenderMaterial();
103 mat->setRoughness(0.5);
104 mat->setMetalness(1.0);
105 mat->setIsDynamicMesh(
false);
109 controller->setControlledObject(rbdObj);
110 controller->setDevice(deviceClient);
111 controller->setTranslationOffset(Vec3d(0.0, 0.05, 0.0));
112 controller->setLinearKs(50000.0);
113 controller->setAngularKs(1000000000000.0);
114 controller->setTranslationScaling(1.0);
115 controller->setForceScaling(0.005);
116 controller->setSmoothingKernelSize(10);
117 controller->setUseForceSmoothening(
true);
118 controller->setUseCritDamping(
true);
122 controllerGhost->setController(controller);
124 scene->addSceneObject(rbdObj);
127 scene->addInteraction(
128 std::make_shared<PbdObjectCollision>(rbdObj, obstacleObjs[0]));
129 scene->addInteraction(
130 std::make_shared<PbdObjectCollision>(rbdObj, obstacleObjs[1]));
133 auto light = std::make_shared<DirectionalLight>();
134 light->setFocalPoint(Vec3d(5.0, -8.0, -5.0));
135 light->setIntensity(1.0);
136 scene->addLight(
"light0", light);
141 auto sceneManager = std::make_shared<SceneManager>();
142 sceneManager->setActiveScene(scene);
143 sceneManager->setPaused(
true);
145 auto driver = std::make_shared<SimulationManager>();
146 driver->addModule(hapticManager);
147 #ifdef iMSTK_USE_RENDERING_VTK 149 auto viewer = std::make_shared<VTKViewer>();
150 viewer->setActiveScene(scene);
151 driver->addModule(viewer);
153 driver->addModule(sceneManager);
154 driver->setDesiredDt(0.001);
156 connect<Event>(sceneManager, &SceneManager::preUpdate, [&](
Event*)
159 rbdObj->getPbdModel()->getConfig()->m_dt = driver->getDt();
163 #ifdef iMSTK_USE_RENDERING_VTK 165 std::shared_ptr<Entity> mouseAndKeyControls =
166 SimulationUtils::createDefaultSceneControl(driver);
167 scene->addSceneObject(mouseAndKeyControls);
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...
static std::shared_ptr< DeviceManager > makeDeviceManager()
Attempts to create a new DeviceManager by whichever is default If multiple haptic managers are built ...
A behaviour that renders a second copy of the controlled object at a lower opacity in the physical po...
Physically based rendering.
static LoggerG3 & startLogger()
Starts logger with default sinks, use getInstance to create a logger with no sinks.