5 private static int SCENE_ID = 1;
7 public static void Main(
string[] args)
12 double particleRadius = 0.1;
17 particleRadius = 0.08;
20 Scene scene =
new Scene(
"SPH Fluid");
22 SphObject fluidObj = generateFluid(particleRadius);
23 CollidingObject[] solids = generateSolids(scene);
24 scene.addSceneObject(fluidObj);
25 for (
int i = 0; i < solids.Length; i++)
27 scene.addSceneObject(solids[i]);
31 scene.addInteraction(
new SphObjectCollision(fluidObj, solids[0]));
32 scene.addInteraction(
new SphObjectCollision(fluidObj, solids[1]));
33 scene.addInteraction(
new SphObjectCollision(fluidObj, solids[2]));
37 scene.getActiveCamera().setPosition(-0.475, 8.116, -6.728);
40 DirectionalLight whiteLight =
new DirectionalLight();
41 whiteLight.setFocalPoint(
new Vec3d(5.0, -8.0, -5.0));
42 whiteLight.setIntensity(1.5);
43 scene.addLight(
"whiteLight", whiteLight);
48 VTKViewer viewer =
new VTKViewer(
"Viewer");
49 viewer.setActiveScene(scene);
50 viewer.setWindowTitle(
"SPH Fluid");
51 viewer.setSize(1920, 1080);
54 SceneManager sceneManager =
new SceneManager(
"Scene Manager");
55 sceneManager.setActiveScene(scene);
58 SimulationManager driver =
new SimulationManager();
59 driver.addModule(viewer);
60 driver.addModule(sceneManager);
64 MouseSceneControl mouseControl =
new MouseSceneControl();
65 mouseControl.setDevice(viewer.getMouseDevice());
66 mouseControl.setSceneManager(sceneManager);
67 scene.addControl(mouseControl);
69 KeyboardSceneControl keyControl =
new KeyboardSceneControl();
70 keyControl.setDevice(viewer.getKeyboardDevice());
71 keyControl.setSceneManager(
new SceneManagerWeakPtr(sceneManager));
72 keyControl.setModuleDriver(
new ModuleDriverWeakPtr(driver));
73 scene.addControl(keyControl);
80 public static SphObject generateFluid(
double particleRadius)
82 VecDataArray3d particles =
new VecDataArray3d();
101 PointSet geometry =
new PointSet();
102 geometry.initialize(particles);
105 SphObject fluidObj =
new SphObject(
"Sphere");
108 VisualModel visualModel =
new VisualModel();
109 visualModel.setGeometry(geometry);
110 RenderMaterial material =
new RenderMaterial();
111 material.setDisplayMode(RenderMaterial.DisplayMode.Fluid);
113 if (material.getDisplayMode() == RenderMaterial.DisplayMode.Fluid)
115 material.setPointSize(0.1f);
119 material.setPointSize(20.0f);
120 material.setRenderPointsAsSpheres(
true);
121 material.setColor(Color.Orange);
123 visualModel.setRenderMaterial(material);
126 SphModel sphModel =
new SphModel();
127 sphModel.setModelGeometry(geometry);
130 SphModelConfig sphParams =
new SphModelConfig(particleRadius);
131 sphParams.m_bNormalizeDensity =
true;
134 sphParams.m_kernelOverParticleRadiusRatio = 6.0;
135 sphParams.m_surfaceTensionStiffness = 5.0;
140 sphParams.m_frictionBoundary = 0.3;
143 sphModel.configure(sphParams);
147 fluidObj.addVisualModel(visualModel);
148 fluidObj.setCollidingGeometry(geometry);
149 fluidObj.setDynamicalModel(sphModel);
150 fluidObj.setPhysicsGeometry(geometry);
160 double sphereRadius = 2.0;
161 Vec3d sphereCenter =
new Vec3d(0, 1, 0);
162 double sphereRadiusSqr = sphereRadius * sphereRadius;
163 double spacing = 2.0 * particleRadius;
164 int N = (int)(2.0 * sphereRadius / spacing);
166 Vec3d lcorner =
new Vec3d(sphereCenter[0] - sphereRadius, sphereCenter[1] - sphereRadius, sphereCenter[2] - sphereRadius);
168 VecDataArray3d particles =
new VecDataArray3d();
169 particles.reserve(N * N * N);
171 for (
int i = 0; i < N; ++i)
173 for (
int j = 0; j < N; ++j)
175 for (
int k = 0; k < N; ++k)
177 Vec3d ppos = lcorner +
new Vec3d(spacing * (
double)(i), spacing * (
double)(j), spacing * (
double)(k));
178 Vec3d cx = ppos - sphereCenter;
179 double nrm = cx[0] * cx[0] + cx[1] * cx[1] + cx[2] * cx[2];
180 if (nrm < sphereRadiusSqr)
182 particles.push_back(ppos);
196 double boxWidth = 4.0;
197 Vec3d boxLowerCorner =
new Vec3d(-2, -3, -2);
199 double spacing = 2.0 * particleRadius;
200 int N = (int)(boxWidth / spacing);
202 VecDataArray3d particles =
new VecDataArray3d();
203 particles.reserve(N * N * N);
205 for (
int i = 0; i < N; ++i)
207 for (
int j = 0; j < N; ++j)
209 for (
int k = 0; k < N; ++k)
211 Vec3d ppos = boxLowerCorner +
new Vec3d(spacing * i, spacing * j, spacing * k);
212 particles.push_back(ppos);
220 public static CollidingObject[] generateSolids(Scene scene)
245 CollidingObject[] solids =
new CollidingObject[3];
248 Plane geometry =
new Plane();
249 geometry.setWidth(40.0);
250 geometry.setPosition(0.0, -6.0, 0.0);
251 geometry.setNormal(
new Vec3d(0.0, 1.0, -0.5));
253 VisualModel visualModel =
new VisualModel();
254 visualModel.setGeometry(geometry);
255 RenderMaterial material =
new RenderMaterial();
256 material.setColor(Color.DarkGray);
257 visualModel.setRenderMaterial(material);
259 CollidingObject obj =
new CollidingObject(
"Floor");
260 obj.addVisualModel(visualModel);
261 obj.setCollidingGeometry(geometry);
265 Plane geometry =
new Plane();
266 geometry.setWidth(40.0);
267 geometry.setPosition(0.0, -6.0, 0.0);
268 geometry.setNormal(
new Vec3d(0.0, 1.0, 1.0));
270 VisualModel visualModel =
new VisualModel();
271 visualModel.setGeometry(geometry);
272 RenderMaterial material =
new RenderMaterial();
273 material.setColor(Color.LightGray);
274 visualModel.setRenderMaterial(material);
276 CollidingObject obj =
new CollidingObject(
"Back Plane");
277 obj.addVisualModel(visualModel);
278 obj.setCollidingGeometry(geometry);
282 Sphere geometry =
new Sphere();
283 geometry.setRadius(2.0);
284 geometry.setPosition(0.0, -6.0, 0.0);
286 VisualModel visualModel =
new VisualModel();
287 visualModel.setGeometry(geometry);
288 RenderMaterial material =
new RenderMaterial();
289 material.setColor(Color.Red);
290 visualModel.setRenderMaterial(material);
292 CollidingObject obj =
new CollidingObject(
"Sphere on Floor");
293 obj.addVisualModel(visualModel);
294 obj.setCollidingGeometry(geometry);
lazy initialized singleton
static VecDataArray3d generateBoxShapeFluid(double particleRadius)
Generate a box-shape fluid object.
static VecDataArray3d generateSphereShapeFluid(double particleRadius)
Generate a sphere-shape fluid object.
static CollidingObject [] generateSolidsScene1()
Generate two planes and a solid sphere.
TimeSteppingType
Type of the update of the state of the body.