bool FEMTriangleConstraint::solvePositionConstraint(SimulationModel &model) { ParticleData &pd = model.getParticles(); const unsigned i1 = m_bodies[0]; const unsigned i2 = m_bodies[1]; const unsigned i3 = m_bodies[2]; Eigen::Vector3f &x1 = pd.getPosition(i1); Eigen::Vector3f &x2 = pd.getPosition(i2); Eigen::Vector3f &x3 = pd.getPosition(i3); const float invMass1 = pd.getInvMass(i1); const float invMass2 = pd.getInvMass(i2); const float invMass3 = pd.getInvMass(i3); Eigen::Vector3f corr1, corr2, corr3; const bool res = PositionBasedDynamics::solve_FEMTriangleConstraint( x1, invMass1, x2, invMass2, x3, invMass3, m_area, m_invRestMat, model.getClothXXStiffness(), model.getClothYYStiffness(), model.getClothXYStiffness(), model.getClothXYPoissonRatio(), model.getClothYXPoissonRatio(), corr1, corr2, corr3); if (res) { if (invMass1 != 0.0f) x1 += corr1; if (invMass2 != 0.0f) x2 += corr2; if (invMass3 != 0.0f) x3 += corr3; } return res; }
bool StrainTriangleConstraint::solvePositionConstraint(SimulationModel &model) { ParticleData &pd = model.getParticles(); const unsigned i1 = m_bodies[0]; const unsigned i2 = m_bodies[1]; const unsigned i3 = m_bodies[2]; Vector3r &x1 = pd.getPosition(i1); Vector3r &x2 = pd.getPosition(i2); Vector3r &x3 = pd.getPosition(i3); const Real invMass1 = pd.getInvMass(i1); const Real invMass2 = pd.getInvMass(i2); const Real invMass3 = pd.getInvMass(i3); Vector3r corr1, corr2, corr3; const bool res = PositionBasedDynamics::solve_StrainTriangleConstraint( x1, invMass1, x2, invMass2, x3, invMass3, m_invRestMat, model.getClothXXStiffness(), model.getClothYYStiffness(), model.getClothXYStiffness(), model.getClothNormalizeStretch(), model.getClothNormalizeShear(), corr1, corr2, corr3); if (res) { if (invMass1 != 0.0) x1 += corr1; if (invMass2 != 0.0) x2 += corr2; if (invMass3 != 0.0) x3 += corr3; } return res; }