iMSTK
Interactive Medical Simulation Toolkit
pbdVolume.cs
1 using Imstk;
2 
3 public class PbdVolume
4 {
5  private static string dataPath = "../data/";
6 
7  public static void Main(string[] args)
8  {
9  // Write log to stdout and file
10  Logger.startLogger();
11 
12  Scene scene = new Scene("PBDVolume");
13  scene.getActiveCamera().setPosition(0, 2.0, 15.0);
14 
15  string tetMeshFileName = dataPath + "textured_organs/heart_volume.vtk";
16  // create and add a PBD object
17  scene.addSceneObject(createAndAddPbdObject(tetMeshFileName));
18 
19  // Light
20  DirectionalLight light = new DirectionalLight();
21  light.setFocalPoint(new Vec3d(5, -8, -5));
22  light.setIntensity(1.1);
23  scene.addLight("light", light);
24 
25  // Run the simulation
26  {
27  // Setup a viewer to render
28  VTKViewer viewer = new VTKViewer("Viewer");
29  viewer.setActiveScene(scene);
30  viewer.setBackgroundColors(new Color(0.3285, 0.3285, 0.6525), new Color(0.13836, 0.13836, 0.2748), true);
31 
32  // Setup a scene manager to advance the scene
33  SceneManager sceneManager = new SceneManager("Scene Manager");
34  sceneManager.setActiveScene(scene);
35  sceneManager.pause(); // Start simulation paused
36 
37  SimulationManager driver = new SimulationManager();
38  driver.addModule(viewer);
39  driver.addModule(sceneManager);
40 
41  // Add mouse and keyboard controls to the viewer
42  {
43  MouseSceneControl mouseControl = new MouseSceneControl();
44  mouseControl.setDevice(viewer.getMouseDevice());
45  mouseControl.setSceneManager(sceneManager);
46  scene.addControl(mouseControl);
47 
48  KeyboardSceneControl keyControl = new KeyboardSceneControl();
49  keyControl.setDevice(viewer.getKeyboardDevice());
50  keyControl.setSceneManager(new SceneManagerWeakPtr(sceneManager));
51  keyControl.setModuleDriver(new ModuleDriverWeakPtr(driver));
52  scene.addControl(keyControl);
53  }
54 
55  driver.start();
56  }
57  }
58 
59  private static PbdObject createAndAddPbdObject(string tetMeshName)
60  {
61  TetrahedralMesh tetMesh = MeshIO.readTetrahedralMesh(tetMeshName);
62  tetMesh.rotate(new Vec3d(1.0, 0.0, 0.0), -1.3, Geometry.TransformType.ApplyToData);
63  SurfaceMesh surfMesh = tetMesh.extractSurfaceMesh();
64  // surfMesh.flipNormals();
65 
66  RenderMaterial material = new RenderMaterial();
67  material.setDisplayMode(RenderMaterial.DisplayMode.Surface);
68  material.setColor(new Color(220.0 / 255.0, 100.0 / 255.0, 70.0 / 255.0));
69  material.setMetalness(100.9f);
70  material.setRoughness(0.5f);
71  material.setEdgeColor(Color.Teal);
72  material.setShadingModel(RenderMaterial.ShadingModel.Phong);
73  material.setDisplayMode(RenderMaterial.DisplayMode.WireframeSurface);
74  VisualModel visualModel = new VisualModel();
75  visualModel.setGeometry(surfMesh);
76  visualModel.setRenderMaterial(material);
77 
78  PbdObject deformableObj = new PbdObject("DeformableObject");
79  PbdModel pbdModel = new PbdModel();
80  pbdModel.setModelGeometry(tetMesh);
81 
82  // Configure model
83  PbdModelConfig pbdParams = new PbdModelConfig();
84 
85  // FEM constraint
86  pbdParams.m_femParams.m_YoungModulus = 500.0;
87  pbdParams.m_femParams.m_PoissonRatio = 0.3;
88 
89  pbdParams.enableFemConstraint(PbdFemConstraint.MaterialType.StVK);
90 
91  // Other parameters
92  pbdParams.m_gravity = new Vec3d(0, -9.8, 0);
93  pbdParams.m_iterations = 6;
94  pbdParams.m_dt = 0.02;
95 
96  // Set the parameters
97  pbdModel.configure(pbdParams);
98  pbdModel.setTimeStepSizeType(TimeSteppingType.Fixed);
99 
100  deformableObj.setDynamicalModel(pbdModel);
101  deformableObj.addVisualModel(visualModel);
102  deformableObj.setPhysicsGeometry(tetMesh);
103  deformableObj.setPhysicsToVisualMap(new PointwiseMap(tetMesh, surfMesh));
104 
105  VectorInt fixedNodeIds = new VectorInt(13);
106  fixedNodeIds.Add(75);
107  fixedNodeIds.Add(82);
108  fixedNodeIds.Add(84);
109  fixedNodeIds.Add(94);
110  fixedNodeIds.Add(95);
111  fixedNodeIds.Add(105);
112  fixedNodeIds.Add(110);
113  fixedNodeIds.Add(124);
114  fixedNodeIds.Add(139);
115  fixedNodeIds.Add(150);
116  fixedNodeIds.Add(161);
117  fixedNodeIds.Add(171);
118  fixedNodeIds.Add(350);
119  deformableObj.getPbdBody().fixedNodeIds = fixedNodeIds;
120  deformableObj.getPbdBody().uniformMassValue = 1.0;
121 
122  return deformableObj;
123  }
124 }
lazy initialized singleton