5 private static string dataPath =
"../data/";
7 public static void Main(
string[] args)
12 Scene scene =
new Scene(
"PBDVolume");
13 scene.getActiveCamera().setPosition(0, 2.0, 15.0);
15 string tetMeshFileName = dataPath +
"textured_organs/heart_volume.vtk";
17 scene.addSceneObject(createAndAddPbdObject(tetMeshFileName));
20 DirectionalLight light =
new DirectionalLight();
21 light.setFocalPoint(
new Vec3d(5, -8, -5));
22 light.setIntensity(1.1);
23 scene.addLight(
"light", light);
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);
33 SceneManager sceneManager =
new SceneManager(
"Scene Manager");
34 sceneManager.setActiveScene(scene);
37 SimulationManager driver =
new SimulationManager();
38 driver.addModule(viewer);
39 driver.addModule(sceneManager);
43 MouseSceneControl mouseControl =
new MouseSceneControl();
44 mouseControl.setDevice(viewer.getMouseDevice());
45 mouseControl.setSceneManager(sceneManager);
46 scene.addControl(mouseControl);
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);
59 private static PbdObject createAndAddPbdObject(
string tetMeshName)
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();
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);
78 PbdObject deformableObj =
new PbdObject(
"DeformableObject");
79 PbdModel pbdModel =
new PbdModel();
80 pbdModel.setModelGeometry(tetMesh);
83 PbdModelConfig pbdParams =
new PbdModelConfig();
86 pbdParams.m_femParams.m_YoungModulus = 500.0;
87 pbdParams.m_femParams.m_PoissonRatio = 0.3;
89 pbdParams.enableFemConstraint(PbdFemConstraint.MaterialType.StVK);
92 pbdParams.m_gravity =
new Vec3d(0, -9.8, 0);
93 pbdParams.m_iterations = 6;
94 pbdParams.m_dt = 0.02;
97 pbdModel.configure(pbdParams);
98 pbdModel.setTimeStepSizeType(TimeSteppingType.Fixed);
100 deformableObj.setDynamicalModel(pbdModel);
101 deformableObj.addVisualModel(visualModel);
102 deformableObj.setPhysicsGeometry(tetMesh);
103 deformableObj.setPhysicsToVisualMap(
new PointwiseMap(tetMesh, surfMesh));
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;
122 return deformableObj;
lazy initialized singleton