This repository was archived by the owner on Sep 29, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 15
Expand file tree
/
Copy pathGeometryProcessingExample.cpp
More file actions
118 lines (103 loc) · 3.66 KB
/
GeometryProcessingExample.cpp
File metadata and controls
118 lines (103 loc) · 3.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*
** This file is part of the Interactive Medical Simulation Toolkit (iMSTK)
** iMSTK is distributed under the Apache License, Version 2.0.
** See accompanying NOTICE for details.
*/
#include "imstkCamera.h"
#include "imstkDataArray.h"
#include "imstkDirectionalLight.h"
#include "imstkImageData.h"
#include "imstkMeshIO.h"
#include "imstkNew.h"
#include "imstkQuadricDecimate.h"
#include "imstkRenderMaterial.h"
#include "imstkScene.h"
#include "imstkSceneManager.h"
#include "imstkSceneObject.h"
#include "imstkSimulationManager.h"
#include "imstkSurfaceMesh.h"
#include "imstkSurfaceMeshDistanceTransform.h"
#include "imstkSurfaceMeshFlyingEdges.h"
#include "imstkTetrahedralMesh.h"
#include "imstkVisualModel.h"
#include "imstkVTKViewer.h"
using namespace imstk;
///
/// \brief This example demonstrates erosion of a mesh
///
int
main()
{
Logger::startLogger();
// simManager and Scene
imstkNew<Scene> scene("GeometryProcessing");
scene->getActiveCamera()->setPosition(Vec3d(0.0, 12.0, 12.0));
auto coarseTetMesh = MeshIO::read<TetrahedralMesh>(iMSTK_DATA_ROOT "/asianDragon/asianDragon.veg");
std::shared_ptr<SurfaceMesh> coarseSurfMesh = coarseTetMesh->extractSurfaceMesh();
// Compute DT
imstkNew<SurfaceMeshDistanceTransform> createSdf;
createSdf->setInputMesh(coarseSurfMesh);
createSdf->setDimensions(50, 50, 50);
createSdf->update();
// Erode
const double erosionDist = 0.2;
DataArray<double>& scalars = *std::dynamic_pointer_cast<DataArray<double>>(createSdf->getOutputImage()->getScalars());
for (int i = 0; i < scalars.size(); i++)
{
scalars[i] += erosionDist;
}
// Extract surface
imstkNew<SurfaceMeshFlyingEdges> isoExtract;
isoExtract->setInputImage(createSdf->getOutputImage());
isoExtract->update();
// Reduce surface
imstkNew<QuadricDecimate> reduce;
reduce->setInputMesh(isoExtract->getOutputMesh());
reduce->setTargetReduction(0.5);
reduce->update();
// Create the scene object
imstkNew<SceneObject> sceneObj("Mesh");
// Create the eroded visual model
{
imstkNew<VisualModel> surfMeshModel;
surfMeshModel->setGeometry(reduce->getOutput());
imstkNew<RenderMaterial> material;
material->setDisplayMode(RenderMaterial::DisplayMode::Surface);
material->setLineWidth(4.0);
material->setEdgeColor(Color::Color::Orange);
surfMeshModel->setRenderMaterial(material);
sceneObj->addVisualModel(surfMeshModel);
}
// Create the original mesh visual model
{
imstkNew<VisualModel> surfMeshModel;
surfMeshModel->setGeometry(coarseSurfMesh);
imstkNew<RenderMaterial> material;
material->setColor(Color::Red);
material->setDisplayMode(RenderMaterial::DisplayMode::Surface);
material->setLineWidth(1.0);
material->setOpacity(0.2f);
surfMeshModel->setRenderMaterial(material);
sceneObj->addVisualModel(surfMeshModel);
}
scene->addSceneObject(sceneObj);
// Light
imstkNew<DirectionalLight> light;
light->setFocalPoint(Vec3d(5.0, -8.0, -5.0));
light->setIntensity(1);
scene->addLight("light", light);
// Run the simulation
{
// Setup a viewer to render in its own thread
imstkNew<VTKViewer> viewer;
viewer->setActiveScene(scene);
// Setup a scene manager to advance the scene in its own thread
imstkNew<SceneManager> sceneManager;
sceneManager->setActiveScene(scene);
imstkNew<SimulationManager> driver;
driver->addModule(viewer);
driver->addModule(sceneManager);
driver->start();
}
return 0;
}