Skip to content

Commit d666cba

Browse files
committed
- added XPBD distance constraint
- added XPBD isometric bending constraint - added XPBD volume constraint
1 parent 2cee983 commit d666cba

File tree

17 files changed

+863
-21
lines changed

17 files changed

+863
-21
lines changed

Changelog.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
- added XPBD distance constraint
2+
- added XPBD isometric bending constraint
3+
- added XPBD volume constraint
14
- added glfw
25
- removed freeglut and glew
36
- added flat shading

Demos/BarDemo/main.cpp

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ int main( int argc, char **argv )
7272

7373
TwType enumType2 = TwDefineEnum("SimulationMethodType", NULL, 0);
7474
TwAddVarCB(MiniGL::getTweakBar(), "SimulationMethod", enumType2, setSimulationMethod, getSimulationMethod, &simulationMethod,
75-
" label='Simulation method' enum='0 {None}, 1 {Volume constraints}, 2 {FEM based PBD}, 3 {Strain based dynamics (no inversion handling)}, 4 {Shape matching (no inversion handling)}' group=Simulation");
75+
" label='Simulation method' enum='0 {None}, 1 {Volume constraints}, 2 {FEM based PBD}, 3 {Strain based dynamics (no inversion handling)}, 4 {Shape matching (no inversion handling)}, 5 {XPBD volume constraints}' group=Simulation");
7676
TwAddVarCB(MiniGL::getTweakBar(), "Stiffness", TW_TYPE_REAL, setStiffness, getStiffness, model, " label='Stiffness' min=0.0 step=0.1 precision=4 group='Simulation' ");
7777
TwAddVarCB(MiniGL::getTweakBar(), "PoissonRatio", TW_TYPE_REAL, setPoissonRatio, getPoissonRatio, model, " label='Poisson ratio XY' min=0.0 step=0.1 precision=4 group='Simulation' ");
7878
TwAddVarCB(MiniGL::getTweakBar(), "NormalizeStretch", TW_TYPE_BOOL32, setNormalizeStretch, getNormalizeStretch, model, " label='Normalize stretch' group='Strain based dynamics' ");
@@ -232,6 +232,8 @@ void createMesh()
232232
}
233233

234234
// init constraints
235+
model->setValue<Real>(SimulationModel::CLOTH_STIFFNESS, 1.0);
236+
model->setValue<Real>(SimulationModel::SOLID_STIFFNESS, 1.0);
235237
for (unsigned int cm = 0; cm < model->getTetModels().size(); cm++)
236238
{
237239
const unsigned int nTets = model->getTetModels()[cm]->getParticleMesh().numTets();
@@ -298,6 +300,31 @@ void createMesh()
298300
model->addShapeMatchingConstraint(4, v, nc);
299301
}
300302
}
303+
else if (simulationMethod == 5)
304+
{
305+
model->setValue<Real>(SimulationModel::CLOTH_STIFFNESS, 100000);
306+
model->setValue<Real>(SimulationModel::SOLID_STIFFNESS, 100000);
307+
const unsigned int offset = model->getTetModels()[cm]->getIndexOffset();
308+
const unsigned int nEdges = model->getTetModels()[cm]->getParticleMesh().numEdges();
309+
const IndexedTetMesh::Edge* edges = model->getTetModels()[cm]->getParticleMesh().getEdges().data();
310+
for (unsigned int i = 0; i < nEdges; i++)
311+
{
312+
const unsigned int v1 = edges[i].m_vert[0] + offset;
313+
const unsigned int v2 = edges[i].m_vert[1] + offset;
314+
315+
model->addDistanceConstraint_XPBD(v1, v2);
316+
}
317+
318+
for (unsigned int i = 0; i < nTets; i++)
319+
{
320+
const unsigned int v1 = tets[4 * i];
321+
const unsigned int v2 = tets[4 * i + 1];
322+
const unsigned int v3 = tets[4 * i + 2];
323+
const unsigned int v4 = tets[4 * i + 3];
324+
325+
model->addVolumeConstraint_XPBD(v1, v2, v3, v4);
326+
}
327+
}
301328
model->getTetModels()[cm]->updateMeshNormals(pd);
302329
}
303330

Demos/ClothDemo/main.cpp

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,11 @@ int main( int argc, char **argv )
6666
MiniGL::setViewport (40.0f, 0.1f, 500.0f, Vector3r (5.0, 10.0, 30.0), Vector3r (5.0, 0.0, 0.0));
6767

6868
TwType enumType2 = TwDefineEnum("SimulationMethodType", NULL, 0);
69-
TwAddVarCB(MiniGL::getTweakBar(), "SimulationMethod", enumType2, setSimulationMethod, getSimulationMethod, &simulationMethod, " label='Simulation method' enum='0 {None}, 1 {Distance constraints}, 2 {FEM based PBD}, 3 {Strain based dynamics}' group=Simulation");
69+
TwAddVarCB(MiniGL::getTweakBar(), "SimulationMethod", enumType2, setSimulationMethod, getSimulationMethod, &simulationMethod,
70+
" label='Simulation method' enum='0 {None}, 1 {Distance constraints}, 2 {FEM based PBD}, 3 {Strain based dynamics}, 4 {XPBD distance constraints}' group=Simulation");
7071
TwType enumType3 = TwDefineEnum("BendingMethodType", NULL, 0);
71-
TwAddVarCB(MiniGL::getTweakBar(), "BendingMethod", enumType3, setBendingMethod, getBendingMethod, &bendingMethod, " label='Bending method' enum='0 {None}, 1 {Dihedral angle}, 2 {Isometric bending}' group=Bending");
72+
TwAddVarCB(MiniGL::getTweakBar(), "BendingMethod", enumType3, setBendingMethod, getBendingMethod, &bendingMethod,
73+
" label='Bending method' enum='0 {None}, 1 {Dihedral angle}, 2 {Isometric bending}, 3 {XPBD isometric bending}' group=Bending");
7274

7375
MiniGL::mainLoop();
7476

@@ -223,6 +225,8 @@ void createMesh()
223225
// init constraints
224226
for (unsigned int cm = 0; cm < model->getTriangleModels().size(); cm++)
225227
{
228+
model->setValue<Real>(SimulationModel::CLOTH_STIFFNESS, 1.0);
229+
model->setValue<Real>(SimulationModel::CLOTH_BENDING_STIFFNESS, 0.01);
226230
if (simulationMethod == 1)
227231
{
228232
const unsigned int offset = model->getTriangleModels()[cm]->getIndexOffset();
@@ -264,6 +268,20 @@ void createMesh()
264268
model->addStrainTriangleConstraint(v1, v2, v3);
265269
}
266270
}
271+
else if (simulationMethod == 4)
272+
{
273+
model->setValue<Real>(SimulationModel::CLOTH_STIFFNESS, 100000);
274+
const unsigned int offset = model->getTriangleModels()[cm]->getIndexOffset();
275+
const unsigned int nEdges = model->getTriangleModels()[cm]->getParticleMesh().numEdges();
276+
const IndexedFaceMesh::Edge* edges = model->getTriangleModels()[cm]->getParticleMesh().getEdges().data();
277+
for (unsigned int i = 0; i < nEdges; i++)
278+
{
279+
const unsigned int v1 = edges[i].m_vert[0] + offset;
280+
const unsigned int v2 = edges[i].m_vert[1] + offset;
281+
282+
model->addDistanceConstraint_XPBD(v1, v2);
283+
}
284+
}
267285
if (bendingMethod != 0)
268286
{
269287
const unsigned int offset = model->getTriangleModels()[cm]->getIndexOffset();
@@ -308,6 +326,11 @@ void createMesh()
308326
model->addDihedralConstraint(vertex1, vertex2, vertex3, vertex4);
309327
else if (bendingMethod == 2)
310328
model->addIsometricBendingConstraint(vertex1, vertex2, vertex3, vertex4);
329+
else if (bendingMethod == 3)
330+
{
331+
model->setValue<Real>(SimulationModel::CLOTH_BENDING_STIFFNESS, 100.0);
332+
model->addIsometricBendingConstraint_XPBD(vertex1, vertex2, vertex3, vertex4);
333+
}
311334
}
312335
}
313336
}

Demos/CouplingDemos/RigidBodyClothCouplingDemo.cpp

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,10 @@ int main( int argc, char **argv )
7676
MiniGL::setViewport (40.0, 0.1f, 500.0, Vector3r (0.0, 10.0, 30.0), Vector3r (0.0, 0.0, 0.0));
7777

7878
TwType enumType2 = TwDefineEnum("SimulationMethodType", NULL, 0);
79-
TwAddVarCB(MiniGL::getTweakBar(), "SimulationMethod", enumType2, setSimulationMethod, getSimulationMethod, &simulationMethod, " label='Simulation method' enum='0 {None}, 1 {Distance constraints}, 2 {FEM based PBD}, 3 {Strain based dynamics}' group=Simulation");
79+
TwAddVarCB(MiniGL::getTweakBar(), "SimulationMethod", enumType2, setSimulationMethod, getSimulationMethod, &simulationMethod,
80+
" label='Simulation method' enum='0 {None}, 1 {Distance constraints}, 2 {FEM based PBD}, 3 {Strain based dynamics}, 4 {XPBD distance constraints}' group=Simulation");
8081
TwType enumType3 = TwDefineEnum("BendingMethodType", NULL, 0);
81-
TwAddVarCB(MiniGL::getTweakBar(), "BendingMethod", enumType3, setBendingMethod, getBendingMethod, &bendingMethod, " label='Bending method' enum='0 {None}, 1 {Dihedral angle}, 2 {Isometric bending}' group=Bending");
82+
TwAddVarCB(MiniGL::getTweakBar(), "BendingMethod", enumType3, setBendingMethod, getBendingMethod, &bendingMethod, " label='Bending method' enum='0 {None}, 1 {Dihedral angle}, 2 {Isometric bending}, 3 {XPBD isometric bending}' group=Bending");
8283

8384
MiniGL::mainLoop ();
8485

@@ -431,6 +432,8 @@ void createClothMesh()
431432
// init constraints
432433
for (unsigned int cm = 0; cm < model->getTriangleModels().size(); cm++)
433434
{
435+
model->setValue<Real>(SimulationModel::CLOTH_STIFFNESS, 1.0);
436+
model->setValue<Real>(SimulationModel::CLOTH_BENDING_STIFFNESS, 0.01);
434437
if (simulationMethod == 1)
435438
{
436439
const unsigned int offset = model->getTriangleModels()[cm]->getIndexOffset();
@@ -472,6 +475,20 @@ void createClothMesh()
472475
model->addStrainTriangleConstraint(v1, v2, v3);
473476
}
474477
}
478+
else if (simulationMethod == 4)
479+
{
480+
model->setValue<Real>(SimulationModel::CLOTH_STIFFNESS, 100000);
481+
const unsigned int offset = model->getTriangleModels()[cm]->getIndexOffset();
482+
const unsigned int nEdges = model->getTriangleModels()[cm]->getParticleMesh().numEdges();
483+
const IndexedFaceMesh::Edge* edges = model->getTriangleModels()[cm]->getParticleMesh().getEdges().data();
484+
for (unsigned int i = 0; i < nEdges; i++)
485+
{
486+
const unsigned int v1 = edges[i].m_vert[0] + offset;
487+
const unsigned int v2 = edges[i].m_vert[1] + offset;
488+
489+
model->addDistanceConstraint_XPBD(v1, v2);
490+
}
491+
}
475492
if (bendingMethod != 0)
476493
{
477494
const unsigned int offset = model->getTriangleModels()[cm]->getIndexOffset();
@@ -516,6 +533,11 @@ void createClothMesh()
516533
model->addDihedralConstraint(vertex1, vertex2, vertex3, vertex4);
517534
else if (bendingMethod == 2)
518535
model->addIsometricBendingConstraint(vertex1, vertex2, vertex3, vertex4);
536+
else if (bendingMethod == 3)
537+
{
538+
model->setValue<Real>(SimulationModel::CLOTH_BENDING_STIFFNESS, 100.0);
539+
model->addIsometricBendingConstraint_XPBD(vertex1, vertex2, vertex3, vertex4);
540+
}
519541
}
520542
}
521543
}

Demos/DistanceFieldDemos/ClothCollisionDemo.cpp

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,10 @@ int main( int argc, char **argv )
7272
MiniGL::setViewport (40.0f, 0.1f, 500.0f, Vector3r (0.0, 10.0, 25.0), Vector3r (0.0, 0.0, 0.0));
7373

7474
TwType enumType2 = TwDefineEnum("SimulationMethodType", NULL, 0);
75-
TwAddVarCB(MiniGL::getTweakBar(), "SimulationMethod", enumType2, setSimulationMethod, getSimulationMethod, &simulationMethod, " label='Simulation method' enum='0 {None}, 1 {Distance constraints}, 2 {FEM based PBD}, 3 {Strain based dynamics}' group=Simulation");
75+
TwAddVarCB(MiniGL::getTweakBar(), "SimulationMethod", enumType2, setSimulationMethod, getSimulationMethod, &simulationMethod,
76+
" label='Simulation method' enum='0 {None}, 1 {Distance constraints}, 2 {FEM based PBD}, 3 {Strain based dynamics}, 4 {XPBD distance constraints}' group=Simulation");
7677
TwType enumType3 = TwDefineEnum("BendingMethodType", NULL, 0);
77-
TwAddVarCB(MiniGL::getTweakBar(), "BendingMethod", enumType3, setBendingMethod, getBendingMethod, &bendingMethod, " label='Bending method' enum='0 {None}, 1 {Dihedral angle}, 2 {Isometric bending}' group=Bending");
78+
TwAddVarCB(MiniGL::getTweakBar(), "BendingMethod", enumType3, setBendingMethod, getBendingMethod, &bendingMethod, " label='Bending method' enum='0 {None}, 1 {Dihedral angle}, 2 {Isometric bending}, 3 {XPBD isometric bending}' group=Bending");
7879

7980
MiniGL::mainLoop ();
8081

@@ -330,6 +331,8 @@ void createMesh()
330331
// init constraints
331332
for (unsigned int cm = 0; cm < model->getTriangleModels().size(); cm++)
332333
{
334+
model->setValue<Real>(SimulationModel::CLOTH_STIFFNESS, 1.0);
335+
model->setValue<Real>(SimulationModel::CLOTH_BENDING_STIFFNESS, 0.01);
333336
if (simulationMethod == 1)
334337
{
335338
const unsigned int offset = model->getTriangleModels()[cm]->getIndexOffset();
@@ -371,6 +374,20 @@ void createMesh()
371374
model->addStrainTriangleConstraint(v1, v2, v3);
372375
}
373376
}
377+
else if (simulationMethod == 4)
378+
{
379+
model->setValue<Real>(SimulationModel::CLOTH_STIFFNESS, 100000);
380+
const unsigned int offset = model->getTriangleModels()[cm]->getIndexOffset();
381+
const unsigned int nEdges = model->getTriangleModels()[cm]->getParticleMesh().numEdges();
382+
const IndexedFaceMesh::Edge* edges = model->getTriangleModels()[cm]->getParticleMesh().getEdges().data();
383+
for (unsigned int i = 0; i < nEdges; i++)
384+
{
385+
const unsigned int v1 = edges[i].m_vert[0] + offset;
386+
const unsigned int v2 = edges[i].m_vert[1] + offset;
387+
388+
model->addDistanceConstraint_XPBD(v1, v2);
389+
}
390+
}
374391
if (bendingMethod != 0)
375392
{
376393
const unsigned int offset = model->getTriangleModels()[cm]->getIndexOffset();
@@ -415,6 +432,11 @@ void createMesh()
415432
model->addDihedralConstraint(vertex1, vertex2, vertex3, vertex4);
416433
else if (bendingMethod == 2)
417434
model->addIsometricBendingConstraint(vertex1, vertex2, vertex3, vertex4);
435+
else if (bendingMethod == 3)
436+
{
437+
model->setValue<Real>(SimulationModel::CLOTH_BENDING_STIFFNESS, 100.0);
438+
model->addIsometricBendingConstraint_XPBD(vertex1, vertex2, vertex3, vertex4);
439+
}
418440
}
419441
}
420442
}

Demos/DistanceFieldDemos/DeformableCollisionDemo.cpp

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ int main( int argc, char **argv )
8282

8383
TwType enumType2 = TwDefineEnum("SimulationMethodType", NULL, 0);
8484
TwAddVarCB(MiniGL::getTweakBar(), "SimulationMethod", enumType2, setSimulationMethod, getSimulationMethod, &simulationMethod,
85-
" label='Simulation method' enum='0 {None}, 1 {Volume constraints}, 2 {FEM based PBD}, 3 {Strain based dynamics (no inversion handling)}, 4 {Shape matching (no inversion handling)}' group=Simulation");
85+
" label='Simulation method' enum='0 {None}, 1 {Volume constraints}, 2 {FEM based PBD}, 3 {Strain based dynamics (no inversion handling)}, 4 {Shape matching (no inversion handling)}, 5 {XPBD volume constraints}' group=Simulation");
8686
TwAddVarCB(MiniGL::getTweakBar(), "Stiffness", TW_TYPE_REAL, setStiffness, getStiffness, model, " label='Stiffness' min=0.0 step=0.1 precision=4 group='Simulation' ");
8787
TwAddVarCB(MiniGL::getTweakBar(), "PoissonRatio", TW_TYPE_REAL, setPoissonRatio, getPoissonRatio, model, " label='Poisson ratio XY' min=0.0 step=0.1 precision=4 group='Simulation' ");
8888
TwAddVarCB(MiniGL::getTweakBar(), "NormalizeStretch", TW_TYPE_BOOL32, setNormalizeStretch, getNormalizeStretch, model, " label='Normalize stretch' group='Strain based dynamics' ");
@@ -345,6 +345,8 @@ void createMesh()
345345
}
346346

347347
// init constraints
348+
model->setValue<Real>(SimulationModel::CLOTH_STIFFNESS, 1.0);
349+
model->setValue<Real>(SimulationModel::SOLID_STIFFNESS, 1.0);
348350
for (unsigned int cm = 0; cm < model->getTetModels().size(); cm++)
349351
{
350352
const unsigned int nTets = model->getTetModels()[cm]->getParticleMesh().numTets();
@@ -411,6 +413,31 @@ void createMesh()
411413
model->addShapeMatchingConstraint(4, v, nc);
412414
}
413415
}
416+
else if (simulationMethod == 5)
417+
{
418+
model->setValue<Real>(SimulationModel::CLOTH_STIFFNESS, 100000);
419+
model->setValue<Real>(SimulationModel::SOLID_STIFFNESS, 100000);
420+
const unsigned int offset = model->getTetModels()[cm]->getIndexOffset();
421+
const unsigned int nEdges = model->getTetModels()[cm]->getParticleMesh().numEdges();
422+
const IndexedTetMesh::Edge* edges = model->getTetModels()[cm]->getParticleMesh().getEdges().data();
423+
for (unsigned int i = 0; i < nEdges; i++)
424+
{
425+
const unsigned int v1 = edges[i].m_vert[0] + offset;
426+
const unsigned int v2 = edges[i].m_vert[1] + offset;
427+
428+
model->addDistanceConstraint_XPBD(v1, v2);
429+
}
430+
431+
for (unsigned int i = 0; i < nTets; i++)
432+
{
433+
const unsigned int v1 = tets[4 * i];
434+
const unsigned int v2 = tets[4 * i + 1];
435+
const unsigned int v3 = tets[4 * i + 2];
436+
const unsigned int v4 = tets[4 * i + 3];
437+
438+
model->addVolumeConstraint_XPBD(v1, v2, v3, v4);
439+
}
440+
}
414441
model->getTetModels()[cm]->updateMeshNormals(pd);
415442
}
416443

0 commit comments

Comments
 (0)