7 #include "imstkCamera.h" 8 #include "imstkDataArray.h" 9 #include "imstkDirectionalLight.h" 10 #include "imstkDummyClient.h" 11 #include "imstkKeyboardDeviceClient.h" 12 #include "imstkKeyboardSceneControl.h" 13 #include "imstkLogger.h" 14 #include "imstkMeshIO.h" 15 #include "imstkMouseDeviceClient.h" 16 #include "imstkMouseSceneControl.h" 18 #include "imstkRbdConstraint.h" 19 #include "imstkRenderDelegateObjectFactory.h" 20 #include "imstkRenderMaterial.h" 21 #include "imstkRigidBodyModel2.h" 22 #include "imstkRigidObject2.h" 23 #include "imstkRigidObjectController.h" 24 #include "imstkScene.h" 25 #include "imstkSceneManager.h" 26 #include "imstkSimulationManager.h" 27 #include "imstkSimulationUtils.h" 28 #include "imstkSurfaceMesh.h" 29 #include "imstkVTKChartRenderDelegate.h" 30 #include "imstkVTKViewer.h" 32 using namespace imstk;
53 static std::shared_ptr<DataArray<T>>
56 auto arrPtr = std::make_shared<DataArray<T>>(size);
58 for (
int i = 0; i < size; i++)
60 arr[i] =
static_cast<T
>(i);
81 const int rbdCount = 2;
82 std::vector<std::shared_ptr<RigidObject2>> rbdObjs(rbdCount);
83 std::vector<std::shared_ptr<RigidObjectController>> rbdControllers(rbdCount);
84 std::vector<std::shared_ptr<DummyClient>> deviceClients(rbdCount);
85 for (
int i = 0; i < rbdCount; i++)
87 rbdObjs[i] = std::make_shared<RigidObject2>(
"rbdObj" + std::to_string(i));
90 rbdModel->getConfig()->m_dt = 0.001;
91 rbdModel->getConfig()->m_gravity = Vec3d::Zero();
92 rbdObjs[i]->setDynamicalModel(rbdModel);
93 rbdObjs[i]->getRigidBody()->m_mass = 0.5;
94 rbdObjs[i]->getRigidBody()->m_intertiaTensor = Mat3d::Identity() * 1000000.0;
95 rbdObjs[i]->getRigidBody()->m_initPos = Vec3d(1.0, 0.0, 0.0);
97 auto surfMesh = MeshIO::read<SurfaceMesh>(iMSTK_DATA_ROOT
"/Surgical Instruments/Scissors/Metzenbaum Scissors/Metz_Scissors.stl");
98 rbdObjs[i]->setCollidingGeometry(surfMesh);
99 rbdObjs[i]->setVisualGeometry(surfMesh);
100 rbdObjs[i]->setPhysicsGeometry(surfMesh);
102 std::shared_ptr<RenderMaterial> mat = rbdObjs[i]->getVisualModel(0)->getRenderMaterial();
104 mat->setRoughness(0.5);
105 mat->setMetalness(1.0);
107 scene->addSceneObject(rbdObjs[i]);
109 deviceClients[i] = std::make_shared<DummyClient>(
"test");
112 rbdControllers[i] = std::make_shared<RigidObjectController>();
113 rbdControllers[i]->setControlledObject(rbdObjs[i]);
114 rbdControllers[i]->setDevice(deviceClients[i]);
117 rbdControllers[i]->setLinearKs(10.0);
118 rbdControllers[i]->setLinearKd(1.0);
122 rbdControllers[i]->setLinearKs(30.0);
123 rbdControllers[i]->setLinearKd(1.0);
125 rbdControllers[i]->setAngularKs(1000000000.0);
126 rbdControllers[i]->setAngularKd(300000000.0);
127 rbdControllers[i]->setTranslationScaling(1.0);
129 rbdControllers[i]->setForceScaling(0.001);
130 scene->addControl(rbdControllers[i]);
136 graphObject->addVisualModel(chartModel);
137 chartModel->setViewBounds(Vec4d(0.0, 1000.0, 0.0, 300.0));
138 scene->addSceneObject(graphObject);
141 scene->getActiveCamera()->setPosition(Vec3d(0.0, 5.0, 10.0));
142 scene->getActiveCamera()->setFocalPoint(Vec3d(0.0, -1.0, 0.0));
143 scene->getActiveCamera()->setViewUp(Vec3d(0.0, 1.0, 0.0));
149 scene->addLight(
"light0", light);
168 const int recordSize = 5000;
169 auto timesPtr = std::make_shared<DataArray<double>>(recordSize);
171 std::deque<double> timesQueue;
172 for (
int j = 0; j < recordSize; j++)
174 timesQueue.push_back(0.0);
176 queueToArray(timesQueue, *timesPtr);
178 std::vector<std::deque<double>> springForceQueues(rbdCount);
179 std::vector<std::shared_ptr<DataArray<double>>> springForcesPtrs(rbdCount);
180 std::vector<Plot2d> plots(rbdCount);
181 for (
int i = 0; i < rbdCount; i++)
183 springForcesPtrs[i] = std::make_shared<DataArray<double>>(recordSize);
184 for (
int j = 0; j < recordSize; j++)
186 springForceQueues[i].push_back(0.0);
188 queueToArray(springForceQueues[i], *springForcesPtrs[i]);
191 plot.xVals = timesPtr;
192 plot.yVals = springForcesPtrs[i];
195 plot.lineColor = Color::Red;
199 plot.lineColor = Color::Green;
203 plot.lineColor = Color::Blue;
205 chartModel->addPlot(plot);
209 connect<Event>(sceneManager, &SceneManager::postUpdate,
212 t += sceneManager->
getDt();
214 timesQueue.pop_front();
215 timesQueue.push_back(t);
216 queueToArray(timesQueue, *timesPtr);
218 for (
int i = 0; i < rbdCount; i++)
220 springForceQueues[i].pop_front();
221 springForceQueues[i].push_back(rbdControllers[i]->getSpringForce().norm());
222 queueToArray(springForceQueues[i], *springForcesPtrs[i]);
226 connect<Event>(sceneManager, &SceneManager::postUpdate, [&](
Event*)
229 for (
int i = 0; i < rbdCount; i++)
231 rbdObjs[i]->getRigidBodyModel2()->getConfig()->m_dt = sceneManager->getDt();
236 std::shared_ptr<Entity> mouseAndKeyControls =
237 SimulationUtils::createDefaultSceneControl(driver);
238 scene->addSceneObject(mouseAndKeyControls);
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.
Base class for events which contain a type, priority, and data priority defaults to 0 and uses a grea...
void addModule(std::shared_ptr< Module > module) override
Add a module to run.
void setIntensity(const double intensity)
Set the light intensity. This value is unbounded.
double getDt() const
Get/Set the time step.
std::shared_ptr<T> obj = std::make_shared<T>(); equivalent, convenience class for STL shared allocati...
void resize(const int size) override
Resize data array to hold exactly size number of values.
void setFocalPoint(const Vec3d &p)
Get/Set the light focal point.
void setActiveScene(std::string newSceneName)
Sets the currently updating scene.
Physically based rendering.
Simple dynamic array implementation that also supports event posting and viewing/facade.
static LoggerG3 & startLogger()
Starts logger with default sinks, use getInstance to create a logger with no sinks.
Templated class that can add to the object factory with objects that will be generated via std::make_...