Skip to content

Commit d2d1d7b

Browse files
committed
- added XPBD FEM constraint for deformable solids
- updated to Eigen 3.4.0
1 parent 544cc0c commit d2d1d7b

File tree

296 files changed

+46340
-13662
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

296 files changed

+46340
-13662
lines changed

Changelog.txt

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
2.1.0
2+
- added XPBD FEM constraint for deformable solids
3+
- updated to Eigen 3.4.0
4+
15
2.0.1
26
- extended and modified Python interface
37
- more Python examples

Demos/BarDemo/main.cpp

+8-3
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ int main( int argc, char **argv )
7979

8080
TwType enumType2 = TwDefineEnum("SimulationMethodType", NULL, 0);
8181
TwAddVarCB(MiniGL::getTweakBar(), "SimulationMethod", enumType2, setSimulationMethod, getSimulationMethod, &simulationMethod,
82-
" 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");
82+
" label='Simulation method' enum='0 {None}, 1 {Volume constraints}, 2 {FEM based PBD}, 3 {FEM based XPBD}, \
83+
4 {Strain based dynamics (no inversion handling)}, 5 {Shape matching (no inversion handling)}, 6 {XPBD volume constraints}' group=Simulation");
8384
TwAddVarCB(MiniGL::getTweakBar(), "stiffness", TW_TYPE_REAL, setStiffness, getStiffness, model, " label='Stiffness' min=0.0 step=0.1 precision=4 group='Solid' ");
8485
TwAddVarCB(MiniGL::getTweakBar(), "poissonRatio", TW_TYPE_REAL, setPoissonRatio, getPoissonRatio, model, " label='Poisson ratio' min=0.0 step=0.1 precision=4 group='Solid' ");
8586
TwAddVarCB(MiniGL::getTweakBar(), "normalizeStretch", TW_TYPE_BOOL32, setNormalizeStretch, getNormalizeStretch, model, " label='Normalize stretch' group='Solid' ");
@@ -167,11 +168,13 @@ void createMesh()
167168

168169
// init constraints
169170
stiffness = 1.0;
170-
if (simulationMethod == 5)
171+
if (simulationMethod == 3)
172+
stiffness = 1000000;
173+
if (simulationMethod == 6)
171174
stiffness = 100000;
172175

173176
volumeStiffness = 1.0;
174-
if (simulationMethod == 5)
177+
if (simulationMethod == 6)
175178
volumeStiffness = 100000;
176179
for (unsigned int cm = 0; cm < model->getTetModels().size(); cm++)
177180
{
@@ -201,6 +204,7 @@ void TW_CALL setStiffness(const void* value, void* clientData)
201204
{
202205
stiffness = *(const Real*)(value);
203206
((SimulationModel*)clientData)->setConstraintValue<FEMTetConstraint, Real, &FEMTetConstraint::m_stiffness>(stiffness);
207+
((SimulationModel*)clientData)->setConstraintValue<XPBD_FEMTetConstraint, Real, &XPBD_FEMTetConstraint::m_stiffness>(stiffness);
204208
((SimulationModel*)clientData)->setConstraintValue<StrainTetConstraint, Real, &StrainTetConstraint::m_stretchStiffness>(stiffness);
205209
((SimulationModel*)clientData)->setConstraintValue<StrainTetConstraint, Real, &StrainTetConstraint::m_shearStiffness>(stiffness);
206210
((SimulationModel*)clientData)->setConstraintValue<DistanceConstraint, Real, &DistanceConstraint::m_stiffness>(stiffness);
@@ -234,6 +238,7 @@ void TW_CALL setPoissonRatio(const void* value, void* clientData)
234238
{
235239
poissonRatio = *(const Real*)(value);
236240
((SimulationModel*)clientData)->setConstraintValue<FEMTetConstraint, Real, &FEMTetConstraint::m_poissonRatio>(poissonRatio);
241+
((SimulationModel*)clientData)->setConstraintValue<XPBD_FEMTetConstraint, Real, &XPBD_FEMTetConstraint::m_poissonRatio>(poissonRatio);
237242
}
238243

239244
void TW_CALL getNormalizeStretch(void* value, void* clientData)

Demos/DistanceFieldDemos/DeformableCollisionDemo.cpp

+8-4
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,8 @@ int main( int argc, char **argv )
8888

8989
TwType enumType2 = TwDefineEnum("SimulationMethodType", NULL, 0);
9090
TwAddVarCB(MiniGL::getTweakBar(), "SimulationMethod", enumType2, setSimulationMethod, getSimulationMethod, &simulationMethod,
91-
" 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");
92-
TwAddVarCB(MiniGL::getTweakBar(), "stiffness", TW_TYPE_REAL, setStiffness, getStiffness, model, " label='Stiffness' min=0.0 step=0.1 precision=4 group='Solid' ");
91+
" label='Simulation method' enum='0 {None}, 1 {Volume constraints}, 2 {FEM based PBD}, 3 {FEM based XPBD}, \
92+
4 {Strain based dynamics (no inversion handling)}, 5 {Shape matching (no inversion handling)}, 6 {XPBD volume constraints}' group=Simulation"); TwAddVarCB(MiniGL::getTweakBar(), "stiffness", TW_TYPE_REAL, setStiffness, getStiffness, model, " label='Stiffness' min=0.0 step=0.1 precision=4 group='Solid' ");
9393
TwAddVarCB(MiniGL::getTweakBar(), "poissonRatio", TW_TYPE_REAL, setPoissonRatio, getPoissonRatio, model, " label='Poisson ratio' min=0.0 step=0.1 precision=4 group='Solid' ");
9494
TwAddVarCB(MiniGL::getTweakBar(), "normalizeStretch", TW_TYPE_BOOL32, setNormalizeStretch, getNormalizeStretch, model, " label='Normalize stretch' group='Solid' ");
9595
TwAddVarCB(MiniGL::getTweakBar(), "normalizeShear", TW_TYPE_BOOL32, setNormalizeShear, getNormalizeShear, model, " label='Normalize shear' group='Solid' ");
@@ -276,11 +276,13 @@ void createMesh()
276276

277277
// init constraints
278278
stiffness = 1.0;
279-
if (simulationMethod == 5)
279+
if (simulationMethod == 3)
280+
stiffness = 1000000;
281+
if (simulationMethod == 6)
280282
stiffness = 100000;
281283

282284
volumeStiffness = 1.0;
283-
if (simulationMethod == 5)
285+
if (simulationMethod == 6)
284286
volumeStiffness = 100000;
285287

286288
ParticleData& pd = model->getParticles();
@@ -301,6 +303,7 @@ void TW_CALL setStiffness(const void* value, void* clientData)
301303
{
302304
stiffness = *(const Real*)(value);
303305
((SimulationModel*)clientData)->setConstraintValue<FEMTetConstraint, Real, &FEMTetConstraint::m_stiffness>(stiffness);
306+
((SimulationModel*)clientData)->setConstraintValue<XPBD_FEMTetConstraint, Real, &XPBD_FEMTetConstraint::m_stiffness>(stiffness);
304307
((SimulationModel*)clientData)->setConstraintValue<StrainTetConstraint, Real, &StrainTetConstraint::m_stretchStiffness>(stiffness);
305308
((SimulationModel*)clientData)->setConstraintValue<StrainTetConstraint, Real, &StrainTetConstraint::m_shearStiffness>(stiffness);
306309
((SimulationModel*)clientData)->setConstraintValue<DistanceConstraint, Real, &DistanceConstraint::m_stiffness>(stiffness);
@@ -334,6 +337,7 @@ void TW_CALL setPoissonRatio(const void* value, void* clientData)
334337
{
335338
poissonRatio = *(const Real*)(value);
336339
((SimulationModel*)clientData)->setConstraintValue<FEMTetConstraint, Real, &FEMTetConstraint::m_poissonRatio>(poissonRatio);
340+
((SimulationModel*)clientData)->setConstraintValue<XPBD_FEMTetConstraint, Real, &XPBD_FEMTetConstraint::m_poissonRatio>(poissonRatio);
337341
}
338342

339343
void TW_CALL getNormalizeStretch(void* value, void* clientData)

Demos/SceneLoaderDemo/SceneLoaderDemo.cpp

+8-3
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,8 @@ int main( int argc, char **argv )
155155
{
156156
TwType enumType3 = TwDefineEnum("SolidSimulationMethodType", NULL, 0);
157157
TwAddVarCB(MiniGL::getTweakBar(), "SolidSimulationMethod", enumType3, setSolidSimulationMethod, getSolidSimulationMethod, &solidSimulationMethod,
158-
" label='Solid sim. 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");
158+
" label='Solid sim. method' enum='0 {None}, 1 {Volume constraints}, 2 {FEM based PBD}, 3 {FEM based XPBD}, \
159+
4 {Strain based dynamics (no inversion handling)}, 5 {Shape matching (no inversion handling)}, 6 {XPBD volume constraints}' group=Simulation");
159160
TwAddVarCB(MiniGL::getTweakBar(), "stiffness", TW_TYPE_REAL, setSolidStiffness, getSolidStiffness, model, " label='Stiffness' min=0.0 step=0.1 precision=4 group='Solid' ");
160161
TwAddVarCB(MiniGL::getTweakBar(), "poissonRatio", TW_TYPE_REAL, setSolidPoissonRatio, getSolidPoissonRatio, model, " label='Poisson ratio' min=0.0 step=0.1 precision=4 group='Solid' ");
161162
TwAddVarCB(MiniGL::getTweakBar(), "normalizeStretch", TW_TYPE_BOOL32, setSolidNormalizeStretch, getSolidNormalizeStretch, model, " label='Normalize stretch' group='Solid' ");
@@ -286,11 +287,13 @@ void initTetModelConstraints()
286287
// init constraints
287288
SimulationModel *model = Simulation::getCurrent()->getModel();
288289
solidStiffness = 1.0;
289-
if (solidSimulationMethod == 5)
290+
if (solidSimulationMethod == 3)
291+
solidStiffness = 1000000;
292+
if (solidSimulationMethod == 6)
290293
solidStiffness = 100000;
291294

292295
volumeStiffness = 1.0;
293-
if (solidSimulationMethod == 5)
296+
if (solidSimulationMethod == 6)
294297
volumeStiffness = 100000;
295298
for (unsigned int cm = 0; cm < model->getTetModels().size(); cm++)
296299
{
@@ -1293,6 +1296,7 @@ void TW_CALL setSolidStiffness(const void* value, void* clientData)
12931296
{
12941297
solidStiffness = *(const Real*)(value);
12951298
((SimulationModel*)clientData)->setConstraintValue<FEMTetConstraint, Real, &FEMTetConstraint::m_stiffness>(solidStiffness);
1299+
((SimulationModel*)clientData)->setConstraintValue<XPBD_FEMTetConstraint, Real, &XPBD_FEMTetConstraint::m_stiffness>(solidStiffness);
12961300
((SimulationModel*)clientData)->setConstraintValue<StrainTetConstraint, Real, &StrainTetConstraint::m_stretchStiffness>(solidStiffness);
12971301
((SimulationModel*)clientData)->setConstraintValue<StrainTetConstraint, Real, &StrainTetConstraint::m_shearStiffness>(solidStiffness);
12981302
((SimulationModel*)clientData)->setConstraintValue<DistanceConstraint, Real, &DistanceConstraint::m_stiffness>(solidStiffness);
@@ -1326,6 +1330,7 @@ void TW_CALL setSolidPoissonRatio(const void* value, void* clientData)
13261330
{
13271331
solidPoissonRatio = *(const Real*)(value);
13281332
((SimulationModel*)clientData)->setConstraintValue<FEMTetConstraint, Real, &FEMTetConstraint::m_poissonRatio>(solidPoissonRatio);
1333+
((SimulationModel*)clientData)->setConstraintValue<XPBD_FEMTetConstraint, Real, &XPBD_FEMTetConstraint::m_poissonRatio>(solidPoissonRatio);
13291334
}
13301335

13311336
void TW_CALL getSolidNormalizeStretch(void* value, void* clientData)

Demos/StiffRodsDemos/DirectPositionBasedSolverForStiffRodsDemo.cpp

+8-3
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,8 @@ int main(int argc, char **argv)
166166
{
167167
TwType enumType3 = TwDefineEnum("SolidSimulationMethodType", NULL, 0);
168168
TwAddVarCB(MiniGL::getTweakBar(), "SolidSimulationMethod", enumType3, setSolidSimulationMethod, getSolidSimulationMethod, &solidSimulationMethod,
169-
" label='Solid sim. 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");
169+
" label='Solid sim. method' enum='0 {None}, 1 {Volume constraints}, 2 {FEM based PBD}, 3 {FEM based XPBD}, \
170+
4 {Strain based dynamics (no inversion handling)}, 5 {Shape matching (no inversion handling)}, 6 {XPBD volume constraints}' group=Simulation");
170171
TwAddVarCB(MiniGL::getTweakBar(), "stiffness", TW_TYPE_REAL, setSolidStiffness, getSolidStiffness, model, " label='Stiffness' min=0.0 step=0.1 precision=4 group='Solid' ");
171172
TwAddVarCB(MiniGL::getTweakBar(), "poissonRatio", TW_TYPE_REAL, setSolidPoissonRatio, getSolidPoissonRatio, model, " label='Poisson ratio' min=0.0 step=0.1 precision=4 group='Solid' ");
172173
TwAddVarCB(MiniGL::getTweakBar(), "normalizeStretch", TW_TYPE_BOOL32, setSolidNormalizeStretch, getSolidNormalizeStretch, model, " label='Normalize stretch' group='Solid' ");
@@ -298,11 +299,13 @@ void initTetModelConstraints()
298299
// init constraints
299300
SimulationModel* model = Simulation::getCurrent()->getModel();
300301
solidStiffness = 1.0;
301-
if (solidSimulationMethod == 5)
302+
if (solidSimulationMethod == 3)
303+
solidStiffness = 1000000;
304+
if (solidSimulationMethod == 6)
302305
solidStiffness = 100000;
303306

304307
volumeStiffness = 1.0;
305-
if (solidSimulationMethod == 5)
308+
if (solidSimulationMethod == 6)
306309
volumeStiffness = 100000;
307310
for (unsigned int cm = 0; cm < model->getTetModels().size(); cm++)
308311
{
@@ -1375,6 +1378,7 @@ void TW_CALL setSolidStiffness(const void* value, void* clientData)
13751378
{
13761379
solidStiffness = *(const Real*)(value);
13771380
((SimulationModel*)clientData)->setConstraintValue<FEMTetConstraint, Real, &FEMTetConstraint::m_stiffness>(solidStiffness);
1381+
((SimulationModel*)clientData)->setConstraintValue<XPBD_FEMTetConstraint, Real, &XPBD_FEMTetConstraint::m_stiffness>(solidStiffness);
13781382
((SimulationModel*)clientData)->setConstraintValue<StrainTetConstraint, Real, &StrainTetConstraint::m_stretchStiffness>(solidStiffness);
13791383
((SimulationModel*)clientData)->setConstraintValue<StrainTetConstraint, Real, &StrainTetConstraint::m_shearStiffness>(solidStiffness);
13801384
((SimulationModel*)clientData)->setConstraintValue<DistanceConstraint, Real, &DistanceConstraint::m_stiffness>(solidStiffness);
@@ -1408,6 +1412,7 @@ void TW_CALL setSolidPoissonRatio(const void* value, void* clientData)
14081412
{
14091413
solidPoissonRatio = *(const Real*)(value);
14101414
((SimulationModel*)clientData)->setConstraintValue<FEMTetConstraint, Real, &FEMTetConstraint::m_poissonRatio>(solidPoissonRatio);
1415+
((SimulationModel*)clientData)->setConstraintValue<XPBD_FEMTetConstraint, Real, &XPBD_FEMTetConstraint::m_poissonRatio>(solidPoissonRatio);
14111416
}
14121417

14131418
void TW_CALL getSolidNormalizeStretch(void* value, void* clientData)

PositionBasedDynamics/PositionBasedDynamics.h

+23-3
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,6 @@ namespace PBD
367367

368368

369369
// -------------- FEM Based PBD -----------------------------------------------------
370-
private:
371370
static void computeGradCGreen(
372371
Real restVolume,
373372
const Matrix3r &invRestMat,
@@ -390,7 +389,11 @@ namespace PBD
390389

391390

392391
public:
393-
/** Initialize rest configuration infos which are required by the solver step.
392+
/** Implementation of the finite element method described in \n\n
393+
* Jan Bender, Dan Koschier, Patrick Charrier and Daniel Weber, \n
394+
* "Position-Based Simulation of Continuous Materials", \n
395+
* Computers & Graphics 44, 2014\n\n
396+
* Initialize rest configuration infos which are required by the solver step.
394397
* Recomputation is only necessary when rest shape changes.
395398
*/
396399
static bool init_FEMTriangleConstraint(
@@ -401,6 +404,12 @@ namespace PBD
401404
Matrix2r &invRestMat
402405
);
403406

407+
/** Implementation of the finite element method described in \n\n
408+
* Jan Bender, Dan Koschier, Patrick Charrier and Daniel Weber, \n
409+
* "Position-Based Simulation of Continuous Materials", \n
410+
* Computers & Graphics 44, 2014\n\n
411+
* Solve the continuum mechanical constraint defined for a triangle.
412+
*/
404413
static bool solve_FEMTriangleConstraint(
405414
const Vector3r &p0, Real invMass0,
406415
const Vector3r &p1, Real invMass1,
@@ -414,7 +423,11 @@ namespace PBD
414423
const Real poissonRatioYX,
415424
Vector3r &corr0, Vector3r &corr1, Vector3r &corr2);
416425

417-
/** Initialize rest configuration infos which are required by the solver step.
426+
/** Implementation of the finite element method described in \n\n
427+
* Jan Bender, Dan Koschier, Patrick Charrier and Daniel Weber, \n
428+
* "Position-Based Simulation of Continuous Materials", \n
429+
* Computers & Graphics 44, 2014\n\n
430+
* Initialize rest configuration infos which are required by the solver step.
418431
* Recomputation is only necessary when rest shape changes.
419432
*/
420433
static bool init_FEMTetraConstraint(
@@ -426,6 +439,12 @@ namespace PBD
426439
Matrix3r &invRestMat
427440
);
428441

442+
/** Implementation of the finite element method described in \n\n
443+
* Jan Bender, Dan Koschier, Patrick Charrier and Daniel Weber, \n
444+
* "Position-Based Simulation of Continuous Materials", \n
445+
* Computers & Graphics 44, 2014\n\n
446+
* Solve the continuum mechanical constraint defined for a tetrahedron.
447+
*/
429448
static bool solve_FEMTetraConstraint(
430449
const Vector3r &p0, Real invMass0,
431450
const Vector3r &p1, Real invMass1,
@@ -438,6 +457,7 @@ namespace PBD
438457
const bool handleInversion,
439458
Vector3r &corr0, Vector3r &corr1, Vector3r &corr2, Vector3r &corr3);
440459

460+
441461
/** Initialize contact between a particle and a tetrahedron and return
442462
* info which is required by the solver step.
443463
*

PositionBasedDynamics/XPBD.cpp

+73
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "XPBD.h"
2+
#include "PositionBasedDynamics.h"
23
#include "MathFunctions.h"
34
#include <cfloat>
45

@@ -211,3 +212,75 @@ bool XPBD::solve_IsometricBendingConstraint(
211212
return false;
212213
}
213214

215+
216+
// ----------------------------------------------------------------------------------------------
217+
bool XPBD::solve_FEMTetraConstraint(
218+
const Vector3r& p0, Real invMass0,
219+
const Vector3r& p1, Real invMass1,
220+
const Vector3r& p2, Real invMass2,
221+
const Vector3r& p3, Real invMass3,
222+
const Real restVolume,
223+
const Matrix3r& invRestMat,
224+
const Real youngsModulus,
225+
const Real poissonRatio,
226+
const bool handleInversion,
227+
const Real dt,
228+
Real& multiplier,
229+
Vector3r& corr0, Vector3r& corr1, Vector3r& corr2, Vector3r& corr3)
230+
{
231+
corr0.setZero();
232+
corr1.setZero();
233+
corr2.setZero();
234+
corr3.setZero();
235+
236+
if (youngsModulus <= 0.0)
237+
return true;
238+
239+
if (poissonRatio < 0.0 || poissonRatio > 0.49)
240+
return false;
241+
242+
243+
Real C = 0.0;
244+
Vector3r gradC[4];
245+
Matrix3r epsilon, sigma;
246+
Real volume = (p1 - p0).cross(p2 - p0).dot(p3 - p0) / static_cast<Real>(6.0);
247+
248+
Real mu = 1.0 / static_cast<Real>(2.0) / (static_cast<Real>(1.0) + poissonRatio);
249+
Real lambda = 1.0 * poissonRatio / (static_cast<Real>(1.0) + poissonRatio) / (static_cast<Real>(1.0) - static_cast<Real>(2.0) * poissonRatio);
250+
251+
if (!handleInversion || volume > 0.0)
252+
{
253+
PositionBasedDynamics::computeGreenStrainAndPiolaStress(p0, p1, p2, p3, invRestMat, restVolume, mu, lambda, epsilon, sigma, C);
254+
PositionBasedDynamics::computeGradCGreen(restVolume, invRestMat, sigma, gradC);
255+
}
256+
else
257+
{
258+
PositionBasedDynamics::computeGreenStrainAndPiolaStressInversion(p0, p1, p2, p3, invRestMat, restVolume, mu, lambda, epsilon, sigma, C);
259+
PositionBasedDynamics::computeGradCGreen(restVolume, invRestMat, sigma, gradC);
260+
}
261+
262+
C = sqrt(2.0 * C);
263+
264+
Real sum_normGradC =
265+
invMass0 * gradC[0].squaredNorm() +
266+
invMass1 * gradC[1].squaredNorm() +
267+
invMass2 * gradC[2].squaredNorm() +
268+
invMass3 * gradC[3].squaredNorm();
269+
270+
Real alpha = static_cast<Real>(1.0) / (youngsModulus * dt * dt);
271+
sum_normGradC += C * C * alpha;
272+
273+
if (sum_normGradC < eps)
274+
return false;
275+
276+
// compute scaling factor
277+
//const Real s = C / sum_normGradC;
278+
const Real s = (C * C + C * alpha * multiplier) / sum_normGradC;
279+
280+
corr0 = -s * invMass0 * gradC[0];
281+
corr1 = -s * invMass1 * gradC[1];
282+
corr2 = -s * invMass2 * gradC[2];
283+
corr3 = -s * invMass3 * gradC[3];
284+
285+
return true;
286+
}

PositionBasedDynamics/XPBD.h

+21
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,27 @@ namespace PBD
126126
const Real dt,
127127
Real& lambda,
128128
Vector3r& corr0, Vector3r& corr1, Vector3r& corr2, Vector3r& corr3);
129+
130+
131+
/** XPBD implementation of the finite element method described in \n\n
132+
* Jan Bender, Dan Koschier, Patrick Charrier and Daniel Weber, \n
133+
* "Position-Based Simulation of Continuous Materials", \n
134+
* Computers & Graphics 44, 2014\n\n
135+
* Solve the continuum mechanical constraint defined for a tetrahedron.
136+
*/
137+
static bool solve_FEMTetraConstraint(
138+
const Vector3r& p0, Real invMass0,
139+
const Vector3r& p1, Real invMass1,
140+
const Vector3r& p2, Real invMass2,
141+
const Vector3r& p3, Real invMass3,
142+
const Real restVolume,
143+
const Matrix3r& invRestMat,
144+
const Real youngsModulus,
145+
const Real poissonRatio,
146+
const bool handleInversion,
147+
const Real dt,
148+
Real& lambda,
149+
Vector3r& corr0, Vector3r& corr1, Vector3r& corr2, Vector3r& corr3);
129150
};
130151
}
131152

0 commit comments

Comments
 (0)