7 #include "imstkAxesModel.h" 8 #include "imstkCamera.h" 9 #include "imstkCollidingObject.h" 10 #include "imstkDeviceManager.h" 11 #include "imstkDeviceManagerFactory.h" 12 #include "imstkDirectionalLight.h" 13 #include "imstkImplicitFunctionFiniteDifferenceFunctor.h" 14 #include "imstkKeyboardDeviceClient.h" 15 #include "imstkMeshIO.h" 16 #include "imstkScene.h" 17 #include "imstkSceneManager.h" 18 #include "imstkSimulationManager.h" 19 #include "imstkSimulationUtils.h" 20 #include "imstkSurfaceMesh.h" 21 #include "imstkSurfaceMeshFlyingEdges.h" 22 #include "imstkVTKViewer.h" 24 using namespace imstk;
36 auto scene = std::make_shared<Scene>(
"SDFHaptics");
37 scene->getActiveCamera()->setPosition(-2.3, 23.81, 45.65);
38 scene->getActiveCamera()->setFocalPoint(9.41, 8.45, 5.76);
40 auto bunnyObj = std::make_shared<CollidingObject>(
"Bunny");
41 std::shared_ptr<ImageData> sdfImage = MeshIO::read<ImageData>(iMSTK_DATA_ROOT
"/stanfordBunny/stanfordBunny_SDF.nii");
42 auto sdf = std::make_shared<SignedDistanceField>(sdfImage->cast(IMSTK_DOUBLE));
44 bunnyObj->setCollidingGeometry(sdf);
50 isoExtract.getOutputMesh()->flipNormals();
51 bunnyObj->setVisualGeometry(isoExtract.getOutputMesh());
53 scene->addSceneObject(bunnyObj);
55 auto axesObj = std::make_shared<Entity>(
"Axes");
56 auto axesModel = axesObj->addComponent<
AxesModel>(
"AxesModel");
57 scene->addSceneObject(axesObj);
60 auto light = std::make_shared<DirectionalLight>();
61 light->setDirection(Vec3d(0.0, -8.0, -5.0));
62 light->setIntensity(1.0);
63 scene->addLight(
"light", light);
67 std::shared_ptr<DeviceClient> deviceClient = hapticManager->makeDeviceClient();
72 auto viewer = std::make_shared<VTKViewer>();
73 viewer->setActiveScene(scene);
76 auto sceneManager = std::make_shared<SceneManager>();
77 sceneManager->setActiveScene(scene);
79 auto driver = std::make_shared<SimulationManager>();
80 driver->addModule(viewer);
81 driver->addModule(sceneManager);
82 driver->addModule(hapticManager);
85 centralGrad.setFunction(sdf);
86 centralGrad.setDx(sdf->getImage()->getSpacing());
87 connect<Event>(sceneManager, &SceneManager::postUpdate, [&](
Event*)
89 const Vec3d pos = deviceClient->getPosition() * 100.0 + Vec3d(10.0, 0.1, 10.0);
91 axesModel->setPosition(pos);
92 axesModel->setOrientation(deviceClient->getOrientation());
94 double dx = sdf->getFunctionValue(pos);
97 const Vec3d g = centralGrad(pos);
98 deviceClient->setForce(-g.normalized() * dx * 4.0);
103 std::shared_ptr<Entity> mouseAndKeyControls =
104 SimulationUtils::createDefaultSceneControl(driver);
105 scene->addSceneObject(mouseAndKeyControls);
Base class for events which contain a type, priority, and data priority defaults to 0 and uses a grea...
static std::shared_ptr< DeviceManager > makeDeviceManager()
Attempts to create a new DeviceManager by whichever is default If multiple haptic managers are built ...
This filter extracts a single isocontour from an imstkImageData.
void update()
Do the actual algorithm.
Gradient given by central finite differences.
Defines an axes that should be rendered.
void setInputImage(std::shared_ptr< ImageData > inputImage)
Required input, port 0.
static LoggerG3 & startLogger()
Starts logger with default sinks, use getInstance to create a logger with no sinks.