iMSTK
Interactive Medical Simulation Toolkit
GeometryTransformsExample.cpp
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 "imstkCamera.h"
8 #include "imstkCylinder.h"
9 #include "imstkDirectionalLight.h"
10 #include "imstkKeyboardDeviceClient.h"
11 #include "imstkKeyboardSceneControl.h"
12 #include "imstkLogger.h"
13 #include "imstkMeshIO.h"
14 #include "imstkMouseDeviceClient.h"
15 #include "imstkMouseSceneControl.h"
16 #include "imstkNew.h"
17 #include "imstkOrientedBox.h"
18 #include "imstkPlane.h"
19 #include "imstkRenderMaterial.h"
20 #include "imstkScene.h"
21 #include "imstkSceneManager.h"
22 #include "imstkSceneObject.h"
23 #include "imstkSimulationManager.h"
24 #include "imstkSimulationUtils.h"
25 #include "imstkSurfaceMesh.h"
26 #include "imstkVisualModel.h"
27 #include "imstkVTKViewer.h"
28 
29 using namespace imstk;
30 
34 int
35 main()
36 {
37  // Setup logger (write to file and stdout)
39 
40  imstkNew<Scene> scene("GeometryTransforms");
41 
42  // Create object and add to scene
43  auto SurfaceMesh = std::dynamic_pointer_cast<imstk::SurfaceMesh>(MeshIO::read(iMSTK_DATA_ROOT "/asianDragon/asianDragon.obj"));
44  auto sceneObj = std::make_shared<SceneObject>("Dragon");
45  sceneObj->setVisualGeometry(SurfaceMesh);
46  scene->addSceneObject(sceneObj);
47 
48  auto surfaceMesh = sceneObj->getVisualGeometry();
49  surfaceMesh->scale(5.0, Geometry::TransformType::ConcatenateToTransform);
50 
51  // Plane
52  imstkNew<Plane> planeGeom;
53  planeGeom->scale(80.0, Geometry::TransformType::ConcatenateToTransform);
54  planeGeom->translate(0.0, -20.0, 0.0, Geometry::TransformType::ConcatenateToTransform);
55  planeGeom->rotate(Vec3d(0.0, 1.0, 0.0), PI_4, Geometry::TransformType::ConcatenateToTransform);
56 
57  imstkNew<RenderMaterial> planeMaterial;
58  planeMaterial->setDisplayMode(RenderMaterial::DisplayMode::WireframeSurface);
59  planeMaterial->setPointSize(6.0);
60  planeMaterial->setLineWidth(4.0);
61  imstkNew<VisualModel> planeVisualModel;
62  planeVisualModel->setGeometry(planeGeom);
63  planeVisualModel->setRenderMaterial(planeMaterial);
64 
65  imstkNew<SceneObject> planeObj("Plane");
66  planeObj->addVisualModel(planeVisualModel);
67  scene->addSceneObject(planeObj);
68 
69  // Cube
70  imstkNew<OrientedBox> cubeGeom;
71  cubeGeom->setExtents(5.0, 5.0, 5.0);
72  cubeGeom->scale(0.5, Geometry::TransformType::ConcatenateToTransform);
73  cubeGeom->rotate(Vec3d(1.0, 1.0, 0.0), PI_4, Geometry::TransformType::ApplyToData);
74  cubeGeom->translate(Vec3d(0.0, 0.0, 10.0));
75 
76  auto materialCube = std::make_shared<RenderMaterial>();
77  imstkNew<RenderMaterial> redMaterial;
78  redMaterial->setColor(Color::Red);
79  redMaterial->setDisplayMode(RenderMaterial::DisplayMode::WireframeSurface);
80  redMaterial->setPointSize(6.0);
81  redMaterial->setLineWidth(4.0);
82  imstkNew<VisualModel> cubeVisualModel;
83  cubeVisualModel->setGeometry(cubeGeom);
84  cubeVisualModel->setRenderMaterial(redMaterial);
85 
86  imstkNew<SceneObject> cubeObj("Cube");
87  cubeObj->addVisualModel(cubeVisualModel);
88  scene->addSceneObject(cubeObj);
89 
90  // Cylinder
91  imstkNew<Cylinder> cylinderGeom;
92  cylinderGeom->setRadius(4.0);
93  cylinderGeom->setLength(12.0);
94  cylinderGeom->scale(0.4, Geometry::TransformType::ConcatenateToTransform);
95  cylinderGeom->rotate(Vec3d(1.0, 1.0, 0), PI_2, Geometry::TransformType::ApplyToData);
96  cylinderGeom->translate(Vec3d(0.0, 0.0, -10.0));
97 
98  imstkNew<VisualModel> cylVisualModel;
99  cylVisualModel->setGeometry(cylinderGeom);
100  cylVisualModel->setRenderMaterial(redMaterial);
101 
102  imstkNew<SceneObject> cylObj("Cylinder");
103  cylObj->addVisualModel(cylVisualModel);
104  scene->addSceneObject(cylObj);
105 
106  // Set Camera configuration
107  scene->getActiveCamera()->setPosition(Vec3d(0.0, 30.0, 30.0));
108 
109  // Light
111  light->setDirection(Vec3d(5.0, -8.0, -5.0));
112  light->setIntensity(1.0);
113  scene->addLight("light", light);
114 
115  // Run the simulation
116  {
117  // Setup a viewer to render in its own thread
118  imstkNew<VTKViewer> viewer;
119  viewer->setActiveScene(scene);
120 
121  // Setup a scene manager to advance the scene in its own thread
122  imstkNew<SceneManager> sceneManager;
123  sceneManager->setActiveScene(scene);
124 
126  driver->addModule(viewer);
127  driver->addModule(sceneManager);
128 
129  // Rotate after every scene update
130  connect<Event>(sceneManager, &SceneManager::postUpdate,
131  [&](Event*)
132  {
133  surfaceMesh->rotate(Vec3d(1.0, 0.0, 0.0), PI * sceneManager->getDt());
134  surfaceMesh->postModified();
135  });
136 
137  // Add default mouse and keyboard controls to the viewer
138  std::shared_ptr<Entity> mouseAndKeyControls =
139  SimulationUtils::createDefaultSceneControl(driver);
140  scene->addSceneObject(mouseAndKeyControls);
141 
142  driver->start();
143  }
144 
145  return 0;
146 }
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 rotate(const Quatd &q, TransformType type=TransformType::ConcatenateToTransform)
Rotate the geometry in Cartesian space.
void setExtents(const Vec3d extents)
Sets the extents of the cube (half dimensions)
Compound Geometry.
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.
Definition: imstkLight.h:71
void scale(const Vec3d &scaling, TransformType type=TransformType::ConcatenateToTransform)
Scale in Cartesian directions.
std::shared_ptr<T> obj = std::make_shared<T>(); equivalent, convenience class for STL shared allocati...
Definition: imstkNew.h:29
Represents a set of triangles & vertices via an array of Vec3d double vertices & Vec3i integer indice...
void setRenderMaterial(std::shared_ptr< RenderMaterial > renderMaterial)
Set/Get render material.
void setDirection(const Vec3d &dir)
Set the direction of the light.
static std::shared_ptr< PointSet > read(const std::string &filePath)
Read external file.
Definition: imstkMeshIO.cpp:46
void translate(const Vec3d &t, TransformType type=TransformType::ConcatenateToTransform)
Translate the geometry in Cartesian space.
void setActiveScene(std::string newSceneName)
Sets the currently updating scene.
static LoggerG3 & startLogger()
Starts logger with default sinks, use getInstance to create a logger with no sinks.