iMSTK
Interactive Medical Simulation Toolkit
pbdCollisionOneObject.cs
1 using Imstk;
2 
4 {
5  private static string dataPath = "../data/";
6  // parameters to play with
7  private const double youngModulus = 1000.0;
8  private const double poissonRatio = 0.3;
9  private const double timeStep = 0.01;
10  private const int maxIter = 5;
11 
12  public static void Main(string[] args)
13  {
14  // Write log to stdout and file
15  Logger.startLogger();
16 
17  // Setup the scene
18  Scene scene = new Scene("PbdCollisionOneDragon");
19  {
20  // Set the camera
21  scene.getActiveCamera().setPosition(0.248534, 9.71495, 17.3109);
22  scene.getActiveCamera().setFocalPoint(0.927986, 2.73914, 2.15692);
23  scene.getActiveCamera().setViewUp(0.0092602, 0.911091, -0.412101);
24 
25  // Setup a tetrahedral pbd dragon object
26  PbdObject deformableObj = new PbdObject("DeformableObj");
27  {
28  // set up the meshes
29  string tetMeshFileName = dataPath + "asianDragon/asianDragon.veg";
30  TetrahedralMesh coarseTetMesh = MeshIO.readTetrahedralMesh(tetMeshFileName);
31 
32  string surfMeshFileName = dataPath + "asianDragon/asianDragon.obj";
33  SurfaceMesh highResSurfMesh = MeshIO.readSurfaceMesh(surfMeshFileName);
34  highResSurfMesh.translate(new Vec3d(0.0, 10.0, 0.0), Geometry.TransformType.ApplyToData);
35  coarseTetMesh.translate(new Vec3d(0.0, 10.0, 0.0), Geometry.TransformType.ApplyToData);
36 
37  // set up visual model based on high res mesh
38  RenderMaterial material = new RenderMaterial();
39  material.setDisplayMode(RenderMaterial.DisplayMode.Surface);
40  material.setLineWidth(0.5);
41  material.setEdgeColor(Color.Blue);
42  material.setShadingModel(RenderMaterial.ShadingModel.Phong);
43  VisualModel surfMeshModel = new VisualModel();
44  surfMeshModel.setGeometry(highResSurfMesh);
45  surfMeshModel.setRenderMaterial(material);
46 
47  // Create model and object
48  PbdModel pbdModel = new PbdModel();
49  pbdModel.setModelGeometry(coarseTetMesh);
50 
51  // Configure model
52  PbdModelConfig pbdParams = new PbdModelConfig();
53  pbdParams.m_femParams.m_YoungModulus = youngModulus;
54  pbdParams.m_femParams.m_PoissonRatio = poissonRatio;
55  pbdParams.enableFemConstraint(PbdFemConstraint.MaterialType.Corotation);
56  pbdParams.m_gravity = new Vec3d(0, -10.0, 0);
57  pbdParams.m_dt = timeStep;
58  pbdParams.m_iterations = maxIter;
59  pbdModel.configure(pbdParams);
60 
61  deformableObj.addVisualModel(surfMeshModel);
62  deformableObj.setCollidingGeometry(coarseTetMesh);
63  deformableObj.setPhysicsGeometry(coarseTetMesh);
64  deformableObj.setPhysicsToVisualMap(new PointToTetMap(coarseTetMesh, highResSurfMesh));
65  deformableObj.setDynamicalModel(pbdModel);
66  deformableObj.getPbdBody().uniformMassValue = 1.0;
67  }
68  scene.addSceneObject(deformableObj);
69 
70  // Setup the floor for it to fall on
71  CollidingObject floorObj = new CollidingObject("Floor");
72  {
73  Plane floorGeom = new Plane(new Vec3d(0.0, 0.0, 0.0), new Vec3d(0.0, 1.0, 0.0));
74  floorGeom.setWidth(100.0);
75 
76  floorObj.setCollidingGeometry(floorGeom);
77  floorObj.setVisualGeometry(floorGeom);
78  }
79  scene.addSceneObject(floorObj);
80 
81  // Collision
82  scene.addInteraction(new PbdObjectCollision(deformableObj, floorObj, "PointSetToPlaneCD"));
83 
84  // Light
85  DirectionalLight light = new DirectionalLight();
86  light.setFocalPoint(new Vec3d(5.0, -8.0, -5.0));
87  light.setIntensity(1.0);
88  scene.addLight("light", light);
89  }
90 
91  // Run the simulation
92  {
93  // Setup a viewer to render
94  VTKViewer viewer = new VTKViewer("Viewer");
95  viewer.setActiveScene(scene);
96 
97  // Setup a scene manager to advance the scene
98  SceneManager sceneManager = new SceneManager("Scene Manager");
99  sceneManager.setActiveScene(scene);
100  sceneManager.pause(); // Start simulation paused
101 
102  SimulationManager driver = new SimulationManager();
103  driver.addModule(viewer);
104  driver.addModule(sceneManager);
105 
106  // Add mouse and keyboard controls to the viewer
107  {
108  MouseSceneControl mouseControl = new MouseSceneControl();
109  mouseControl.setDevice(viewer.getMouseDevice());
110  mouseControl.setSceneManager(sceneManager);
111  scene.addControl(mouseControl);
112 
113  KeyboardSceneControl keyControl = new KeyboardSceneControl();
114  keyControl.setDevice(viewer.getKeyboardDevice());
115  keyControl.setSceneManager(new SceneManagerWeakPtr(sceneManager));
116  keyControl.setModuleDriver(new ModuleDriverWeakPtr(driver));
117  scene.addControl(keyControl);
118  }
119 
120  driver.start();
121  }
122  }
123 }
lazy initialized singleton