6 public static void Main(
string[] args)
11 Capsule capsule =
new Capsule(
new Vec3d(0.0, -4.0, 0.0), 2.0, 5.0,
new Quatd(
new Rotd(1.5708,
new Vec3d(0.0, 0.0, 1.0))));
12 Sphere sphere =
new Sphere(
new Vec3d(0.0, -2.0, 0.0), 2.0);
13 OrientedBox cube =
new OrientedBox(
new Vec3d(0.0, -4.0, 0.0),
new Vec3d(2.5, 2.5, 2.5));
14 Plane plane =
new Plane(
new Vec3d(0.0, -2.0, 0.0),
new Vec3d(0.0, 1.0, 0.0));
17 Geometry[] geometries =
new Geometry[] { capsule, sphere, cube, plane };
20 Scene scene =
new Scene(
"PBDClothCollision");
21 PbdObject clothObj = makeClothObj(
"Cloth", 10.0, 10.0, 16, 16);
22 scene.addSceneObject(clothObj);
23 CollidingObject collisionObj =
new CollidingObject(
"CollidingObject");
24 collisionObj.setCollidingGeometry(capsule);
26 for (
int i = 0; i < 4; ++i)
28 VisualModel visualModel =
new VisualModel();
29 visualModel.setGeometry(geometries[i]);
30 visualModel.getRenderMaterial().setBackFaceCulling(
false);
31 visualModel.getRenderMaterial().setOpacity(0.5);
33 collisionObj.addVisualModel(visualModel);
35 collisionObj.getVisualModel(0).show();
36 scene.addSceneObject(collisionObj);
38 PbdObjectCollision pbdInteraction =
new PbdObjectCollision(clothObj, collisionObj,
"PointSetToCapsuleCD");
39 pbdInteraction.setFriction(0.4);
40 pbdInteraction.setRestitution(0.0);
41 scene.addInteraction(pbdInteraction);
45 scene.getActiveCamera().setFocalPoint(0.0, -2.0, 0.0);
46 scene.getActiveCamera().setPosition(5.0, 4.0, 18.0);
51 VTKViewer viewer =
new VTKViewer(
"Viewer");
52 viewer.setActiveScene(scene);
55 SceneManager sceneManager =
new SceneManager(
"Scene Manager");
56 sceneManager.setExecutionType(Module.ExecutionType.ADAPTIVE);
57 sceneManager.setActiveScene(scene);
60 SimulationManager driver =
new SimulationManager();
61 driver.addModule(viewer);
62 driver.addModule(sceneManager);
63 driver.setDesiredDt(0.001);
67 MouseSceneControl mouseControl =
new MouseSceneControl();
68 mouseControl.setDevice(viewer.getMouseDevice());
69 mouseControl.setSceneManager(sceneManager);
70 scene.addControl(mouseControl);
72 KeyboardSceneControl keyControl =
new KeyboardSceneControl();
73 keyControl.setDevice(viewer.getKeyboardDevice());
74 keyControl.setSceneManager(
new SceneManagerWeakPtr(sceneManager));
75 keyControl.setModuleDriver(
new ModuleDriverWeakPtr(driver));
76 scene.addControl(keyControl);
79 Utils.connectKeyEvent(viewer.getKeyboardDevice(), Utils.KeyboardDeviceClient_getKeyPress_cb,
84 CollisionDetectionAlgorithm newCDMethod = null;
88 newCDMethod =
new PointSetToCapsuleCD();
91 else if (e.m_key ==
'2')
94 newCDMethod =
new PointSetToSphereCD();
97 else if (e.m_key ==
'3')
100 newCDMethod =
new PointSetToOrientedBoxCD();
103 else if (e.m_key ==
'4')
106 newCDMethod =
new PointSetToPlaneCD();
109 else if (e.m_key ==
'5')
112 newCDMethod =
new SurfaceMeshToSphereCD();
115 else if (e.m_key ==
'6')
118 newCDMethod =
new SurfaceMeshToCapsuleCD();
121 if (indexToShow != -1)
124 for (
int i = 0; i < 4; i++)
126 collisionObj.getVisualModel(i).hide();
129 VisualModel visualModel = collisionObj.getVisualModel((
int)indexToShow);
131 collisionObj.setCollidingGeometry(visualModel.getGeometry());
133 newCDMethod.setInputGeometryA(clothObj.getCollidingGeometry());
134 newCDMethod.setInputGeometryB(visualModel.getGeometry());
135 pbdInteraction.setCollisionDetection(newCDMethod);
136 pbdInteraction.getCollisionHandlingA().setInputCollisionData(newCDMethod.getCollisionData());
138 scene.buildTaskGraph();
139 scene.initTaskGraph();
149 public static PbdObject makeClothObj(
string name,
double width,
double height,
int rowCount,
int colCount)
151 PbdObject clothObj =
new PbdObject(name);
154 SurfaceMesh clothMesh = Utils.toTriangleGrid(
new Vec3d(0.0, 0.0, 0.0),
155 new Vec2d(width, height),
new Vec2i(rowCount, colCount),
new Quatd(0.0, 0.0, 0.0, 1.0), 2.0);
158 PbdModelConfig pbdParams =
new PbdModelConfig();
159 pbdParams.enableConstraint(PbdModelConfig.ConstraintGenType.Distance, 1.0e2);
160 pbdParams.enableConstraint(PbdModelConfig.ConstraintGenType.Dihedral, 1.0e1);
161 pbdParams.m_gravity =
new Vec3d(0.0, -9.8, 0.0);
162 pbdParams.m_dt = 0.005;
163 pbdParams.m_iterations = 5;
166 PbdModel pbdModel =
new PbdModel();
167 pbdModel.setModelGeometry(clothMesh);
168 pbdModel.configure(pbdParams);
171 RenderMaterial material =
new RenderMaterial();
172 material.setBackFaceCulling(
false);
173 material.setDisplayMode(RenderMaterial.DisplayMode.WireframeSurface);
174 material.setColor(Color.Blue);
177 VisualModel visualModel =
new VisualModel();
178 visualModel.setGeometry(clothMesh);
179 visualModel.setRenderMaterial(material);
182 clothObj.addVisualModel(visualModel);
183 clothObj.setPhysicsGeometry(clothMesh);
184 clothObj.setCollidingGeometry(clothMesh);
185 clothObj.setDynamicalModel(pbdModel);
186 clothObj.getPbdBody().uniformMassValue = width * height / (rowCount * colCount);
lazy initialized singleton