7 #include "imstkPbdBaryPointToPointConstraint.h" 14 Vec3d p1 = Vec3d::Zero();
15 Vec3d p2 = Vec3d::Zero();
20 p2 += bodies.getPosition(
m_particles[i]) * m_weights[i];
24 p1 += bodies.getPosition(
m_particles[i]) * m_weights[i];
33 const std::vector<PbdParticleId>& ptIdsA,
34 const std::vector<double>& weightsA,
35 const std::vector<PbdParticleId>& ptIdsB,
36 const std::vector<double>& weightsB,
37 const double stiffnessA,
const double stiffnessB)
39 initConstraint(ptIdsA, weightsA, ptIdsB, weightsB, stiffnessA, stiffnessB, 0.0);
45 const std::vector<PbdParticleId>& ptIdsA,
46 const std::vector<double>& weightsA,
47 const std::vector<PbdParticleId>& ptIdsB,
48 const std::vector<double>& weightsB,
49 const double stiffnessA,
const double stiffnessB,
50 const double restLength)
54 m_weights.resize(
m_dcdx.size());
57 for (
size_t i = 0; i < ptIdsA.size(); i++)
60 m_weights[i] = weightsA[i];
63 for (
size_t i = 0, j = ptIdsA.size(); i < ptIdsB.size(); i++, j++)
66 m_weights[j] = weightsB[i];
70 m_restLength = restLength;
71 m_stiffness[0] = stiffnessA;
72 m_stiffness[1] = stiffnessB;
77 double& c, std::vector<Vec3d>& dcdx)
82 const double length = diff.norm();
83 c = length - m_restLength;
95 for (
size_t i = 0; i < dcdx.size(); i++)
99 dcdx[i] = -diff * m_weights[i];
103 dcdx[i] = diff * m_weights[i];
std::vector< Vec3d > m_dcdx
Normalized constraint gradients (per particle)
std::vector< PbdParticleId > m_particles
body, particle index
void initConstraint(const std::vector< PbdParticleId > &ptIdsA, const std::vector< double > &weightsA, const std::vector< PbdParticleId > &ptIdsB, const std::vector< double > &weightsB, const double stiffnessA, const double stiffnessB, const double restLength=0.0)
Initialize the constraint.
std::vector< bool > m_bodiesSides
Stores 0 or 1 to indicate side of particle.
bool computeValueAndGradient(PbdState &bodies, double &c, std::vector< Vec3d > &dcdx) override
Compute value and gradient of constraint function.
Vec3d computeInterpolantDifference(PbdState &bodies) const
double m_C
Constraint Value.
Provides interface for accessing particles from a 2d array of PbdBody,Particles.
void initConstraintToRest(PbdState &bodies, const std::vector< PbdParticleId > &ptIdsA, const std::vector< double > &weightsA, const std::vector< PbdParticleId > &ptIdsB, const std::vector< double > &weightsB, const double stiffnessA, const double stiffnessB)
initialize constraint with current distance between the points as the resting length ...