iMSTK
Interactive Medical Simulation Toolkit
Solid.hpp
1 /*
2 ** This file is part of the Interactive Medical Simulation Toolkit (iMSTK)
3 ** iMSTK is distributed under the Apache License, Version 2.0.
4 ** See accompanying NOTICE for details.
5 */
6 
7 //#include "imstkCylinder.h"
8 #include "imstkSurfaceMesh.h"
9 #include "imstkTetrahedralMesh.h"
10 #include "imstkMeshIO.h"
11 //#include "imstkVTKMeshIO.h"
12 //#include "imstkGeometryUtilities.h"
13 
14 #include "imstkPlane.h"
15 #include "imstkRenderMaterial.h"
16 #include "imstkSphere.h"
17 
18 using namespace imstk;
19 
23 std::vector<std::shared_ptr<CollidingObject>> generateSolidsScene1()
24 {
25  std::vector<std::shared_ptr<CollidingObject>> solids;
26 
27  {
28  imstkNew<Plane> geometry;
29  geometry->setWidth(40.0);
30  geometry->setPosition(0.0, -6.0, 0.0);
31  geometry->setNormal(Vec3d(0.0, 1.0, -0.5));
32 
33  imstkNew<CollidingObject> obj("Floor");
34  obj->setVisualGeometry(geometry);
35  obj->getVisualModel(0)->getRenderMaterial()->setColor(Color::DarkGray);
36  obj->setCollidingGeometry(geometry);
37  solids.push_back(obj);
38  }
39  {
40  imstkNew<Plane> geometry;
41  geometry->setWidth(40.0);
42  geometry->setPosition(0.0, -6.0, 0.0);
43  geometry->setNormal(Vec3d(0.0, 1.0, 1.0));
44 
45  imstkNew<CollidingObject> obj("Back Plane");
46  obj->setVisualGeometry(geometry);
47  obj->getVisualModel(0)->getRenderMaterial()->setColor(Color::LightGray);
48  obj->setCollidingGeometry(geometry);
49  solids.push_back(obj);
50  }
51  {
52  imstkNew<Sphere> geometry;
53  geometry->setRadius(2.0);
54  geometry->setPosition(0.0, -6.0, 0.0);
55 
56  imstkNew<CollidingObject> obj("Sphere on Floor");
57  obj->setVisualGeometry(geometry);
58  obj->getVisualModel(0)->getRenderMaterial()->setColor(Color::Red);
59  obj->setCollidingGeometry(geometry);
60  solids.push_back(obj);
61  }
62 
63  return solids;
64 }
65 
69 std::vector<std::shared_ptr<CollidingObject>> generateSolidsScene2()
70 {
71  std::vector<std::shared_ptr<CollidingObject>> solids;
72 
73  {
74  imstkNew<Plane> geometry;
75  geometry->setWidth(40.0);
76  geometry->setPosition(0.0, -6.0, 0.0);
77  geometry->setNormal(Vec3d(0.0, 1.0, -0.5));
78 
79  imstkNew<CollidingObject> obj("Floor");
80  obj->setVisualGeometry(geometry);
81  obj->getVisualModel(0)->getRenderMaterial()->setColor(Color::DarkGray);
82  obj->setCollidingGeometry(geometry);
83  solids.push_back(obj);
84  }
85  {
86  imstkNew<Plane> geometry;
87  geometry->setWidth(40.0);
88  geometry->setPosition(0.0, -6.0, 0.0);
89  geometry->setNormal(Vec3d(0.0, 1.0, 1.0));
90 
91  imstkNew<CollidingObject> obj("Back Plane");
92  obj->setVisualGeometry(geometry);
93  obj->getVisualModel(0)->getRenderMaterial()->setColor(Color::LightGray);
94  obj->setCollidingGeometry(geometry);
95  solids.push_back(obj);
96  }
97 
98  return solids;
99 }
100 
104 std::vector<std::shared_ptr<CollidingObject>> generateSolidsScene3()
105 {
106  std::vector<std::shared_ptr<CollidingObject>> solids;
107 
108  {
109  imstkNew<Plane> geometry;
110  geometry->setWidth(14.0);
111  geometry->setPosition(0.0, -6.0, 0.0);
112  geometry->setNormal(Vec3d(0.0, 1.0, 0.0));
113 
114  imstkNew<CollidingObject> obj("Floor");
115  obj->setVisualGeometry(geometry);
116  obj->getVisualModel(0)->getRenderMaterial()->setColor(Color(0.2, 0.2, 0.2, 1.0));
117  obj->setCollidingGeometry(geometry);
118  solids.push_back(obj);
119  }
120  {
121  imstkNew<Plane> geometry;
122  geometry->setWidth(14.0);
123  geometry->setPosition(0.0, 0.0, -7.0);
124  geometry->setNormal(Vec3d(0.0, 0.0, 1.0));
125 
126  imstkNew<CollidingObject> obj("Back Wall");
127  obj->setVisualGeometry(geometry);
128  obj->getVisualModel(0)->getRenderMaterial()->setColor(Color::LightGray);
129  obj->setCollidingGeometry(geometry);
130  solids.push_back(obj);
131  }
132  {
133  imstkNew<Plane> geometry;
134  geometry->setWidth(14.0);
135  geometry->setPosition(0.0, 0.0, 7.0);
136  geometry->setNormal(Vec3d(0.0, 0.0, -1.0));
137 
138  imstkNew<CollidingObject> obj("Front Wall");
139  obj->setVisualGeometry(geometry);
140  obj->getVisualModel(0)->getRenderMaterial()->setColor(Color::LightGray);
141  obj->setCollidingGeometry(geometry);
142  solids.push_back(obj);
143  }
144  {
145  imstkNew<Plane> geometry;
146  geometry->setWidth(14.0);
147  geometry->setPosition(7.0, 0.0, 0.0);
148  geometry->setNormal(Vec3d(-1.0, 0.0, 0.0));
149 
150  imstkNew<CollidingObject> obj("Left Wall");
151  obj->setVisualGeometry(geometry);
152  obj->getVisualModel(0)->getRenderMaterial()->setColor(Color::LightGray);
153  obj->setCollidingGeometry(geometry);
154  solids.push_back(obj);
155  }
156  {
157  imstkNew<Plane> geometry;
158  geometry->setWidth(14.0);
159  geometry->setPosition(-7.0, 0.0, 0.0);
160  geometry->setNormal(Vec3d(1.0, 0.0, 0.0));
161 
162  imstkNew<CollidingObject> obj("Right Wall");
163  obj->setVisualGeometry(geometry);
164  obj->getVisualModel(0)->getRenderMaterial()->setColor(Color::LightGray);
165  obj->setCollidingGeometry(geometry);
166  solids.push_back(obj);
167  }
168 
169  return solids;
170 }
171 
175 std::vector<std::shared_ptr<CollidingObject>> generateSolidsScene4(const std::shared_ptr<Scene>& scene)
176 {
177  std::vector<std::shared_ptr<CollidingObject>> solids;
178 
179  {
180  auto surfaceObject = std::make_shared<SceneObject>("SurfaceObj");
181  auto surfMesh = std::dynamic_pointer_cast<SurfaceMesh>(MeshIO::read(iMSTK_DATA_ROOT "/cylinder/cylinder.stl"));
182 
183  //auto visualModel = std::make_shared<VisualModel>(surfMesh);
184  auto material = std::make_shared<RenderMaterial>();
185  material->setDisplayMode(RenderMaterial::DisplayMode::Wireframe);
186  material->setColor(Color(Color::Red, 0.1));
187  auto surfMeshModel = surfaceObject->addComponent<VisualModel>();
188  surfMeshModel->setGeometry(surfMesh);
189  surfMeshModel->setRenderMaterial(material);
190 
191  // add the scene object to the scene
192  scene->addSceneObject(surfaceObject);
193 
194  //const size_t nx = 200 / 2, ny = 100 / 2, nz = 100 / 2;
195  //auto tetMesh = GeometryUtils::createTetrahedralMeshCover(surfMesh, nx, ny, nz);
196 
197 
198  // add scene object for surface object
199  //auto volObject = std::make_shared<VisualObject>("VolObj");
200  //volObject->addVisualModel(visualModel);
201  //volObject->setVisualGeometry(tetMesh);
202  //volObject->addVisualModel(visualModel);
203 
204  // add the scene object to the scene
205  //scene->addSceneObject(volObject);
206  //solids.push_back(volObject);
207 
208  auto obj = std::make_shared<CollidingObject>("cylinder");
209  //obj->addVisualModel(visualModel);
210  obj->setCollidingGeometry(surfMesh);
211  scene->addSceneObject(obj);
212  solids.push_back(obj);
213  }
214  return solids;
215 }
216 
217 std::vector<std::shared_ptr<CollidingObject>> generateSolids(const std::shared_ptr<Scene>& scene)
218 {
219  switch (SCENE_ID)
220  {
221  case 1:
222  return generateSolidsScene1();
223  case 2:
224  return generateSolidsScene2();
225  case 3:
226  return generateSolidsScene3();
227  case 4:
228  return generateSolidsScene4(scene);
229  default:
230  LOG(FATAL) << "Invalid scene index";
231  return {}; // To avoid warning
232  }
233 }
Compound Geometry.
std::shared_ptr<T> obj = std::make_shared<T>(); equivalent, convenience class for STL shared allocati...
Definition: imstkNew.h:29
void setPosition(const Vec3d p)
Set the local position.
Represents a set of triangles & vertices via an array of Vec3d double vertices & Vec3i integer indice...
Color in RGB space.
Definition: imstkColor.h:24
static std::shared_ptr< PointSet > read(const std::string &filePath)
Read external file.
Definition: imstkMeshIO.cpp:46
Contains geometric, material, and render information.