9 #include "imstkPbdConstraint.h" 26 PbdConstraint(numParticles), m_r(numParticles, Vec3d::Zero()), m_weights(numParticles)
39 const double dt,
const SolverType& type)
override;
41 virtual Vec3d computeRelativeVelocity(
PbdState& imstkNotUsed(bodies)) {
return Vec3d::Zero(); }
46 const Vec3d&
getR(
const int i)
const {
return m_r[i]; }
60 const Vec3d& bodyPos = bodies.getPosition(pid);
61 const Vec3d r = pt - bodyPos;
63 const Vec3d& v = bodies.getVelocity(pid);
64 const Vec3d& w = bodies.getAngularVelocity(pid);
65 return v + w.cross(r);
74 return force.cross(m_r[i]).norm();
78 std::vector<Vec3d> m_r;
79 std::vector<double> m_weights;
104 const Vec3d contactPtOnBody,
106 const double compliance = 0.0);
108 bool computeInterpolantsAndContact(
const PbdState& bodies,
109 std::vector<double>& weights, Vec3d& contactNormal,
double& depth)
const;
113 std::vector<Vec3d>& n)
override;
115 Vec3d computeRelativeVelocity(
PbdState& bodies)
override;
138 const Vec3d contactPtOnBody,
140 const double compliance = 0.0);
144 std::vector<Vec3d>& n)
override;
146 Vec3d computeRelativeVelocity(
PbdState& bodies)
override;
170 const Vec3d contactPtOnBody,
172 const double compliance = 0.0);
174 bool computeInterpolantsAndContact(
const PbdState& bodies,
175 std::vector<double>& weights, Vec3d& contactNormal,
double& depth)
const;
179 std::vector<Vec3d>& n)
override;
181 Vec3d computeRelativeVelocity(
PbdState& bodies)
override;
201 const Vec3d ptOnBody0,
203 const Vec3d ptOnBody1,
204 const double restLength,
205 const double compliance)
209 m_r[0] = ptOnBody0 - state.getPosition(bodyId0);
210 m_rest_r[0] = state.getOrientation(bodyId0).inverse()._transformVector(m_r[0]);
214 m_r[1] = ptOnBody1 - state.getPosition(bodyId1);
215 m_rest_r[1] = state.getOrientation(bodyId1).inverse()._transformVector(m_r[1]);
217 m_restLength = restLength;
219 setCompliance(compliance);
234 const Vec3d ptOnBody0,
236 const double restLength,
237 const double compliance)
241 m_r[0] = ptOnBody0 - state.getPosition(bodyId0);
242 m_rest_r[0] = state.getOrientation(bodyId0).inverse()._transformVector(m_r[0]);
246 m_restLength = restLength;
248 setCompliance(compliance);
259 const Vec3d ptOnBody0,
261 const Vec3d ptOnBody1,
262 const double compliance)
264 initConstraint(state, bodyId0, ptOnBody0, bodyId1, ptOnBody1,
265 (ptOnBody1 - ptOnBody0).norm(), compliance);
270 std::vector<Vec3d>& n)
override;
273 std::array<Vec3d, 2> m_rest_r = { Vec3d::Zero(), Vec3d::Zero() };
274 double m_restLength = 0.0;
298 const Vec3d contactPt0,
300 const Vec3d contactPt1,
301 const Vec3d contactNormal0To1,
302 const double compliance)
306 m_r[0] = contactPt0 - state.getPosition(bodyId0);
307 m_rest_r[0] = state.getOrientation(bodyId0).inverse()._transformVector(m_r[0]);
311 m_r[1] = contactPt1 - state.getPosition(bodyId1);
312 m_rest_r[1] = state.getOrientation(bodyId1).inverse()._transformVector(m_r[1]);
314 m_contactNormal = contactNormal0To1;
316 setCompliance(compliance);
321 std::vector<Vec3d>& n)
override;
324 std::array<Vec3d, 2> m_rest_r = { Vec3d::Zero(), Vec3d::Zero() };
325 Vec3d m_contactNormal = Vec3d::Zero();
344 const double compliance)
348 const Vec3d local_p = lineP - state.getPosition(lineBodyId);
349 m_p_rest = state.getOrientation(lineBodyId).inverse()._transformVector(local_p);
350 const Vec3d local_q = lineQ - state.getPosition(lineBodyId);
351 m_q_rest = state.getOrientation(lineBodyId).inverse()._transformVector(local_q);
355 setCompliance(compliance);
359 double& c, std::vector<Vec3d>& n)
override;
362 Vec3d m_p_rest = Vec3d::Zero();
363 Vec3d m_q_rest = Vec3d::Zero();
std::vector< Vec3d > m_dcdx
Normalized constraint gradients (per particle)
void initConstraint(const PbdState &state, const PbdParticleId &bodyId0, const Vec3d ptOnBody0, const PbdParticleId &bodyId1, const Vec3d ptOnBody1, const double restLength, const double compliance)
Initialize the constraint ptOnBody is global position.
std::pair< int, int > PbdParticleId
Index pair that refers to a particle in a PbdState. Index 0 is the body id, Index 1 is the particle i...
std::vector< PbdParticleId > m_particles
body, particle index
Resolves a point on body to a triangle with linear and angular movement.
void projectConstraint(PbdState &bodies, const double dt, const SolverType &type) override
Update positions by projecting constraints.
void initConstraint(const PbdState &state, const PbdParticleId &bodyId0, const Vec3d contactPt0, const PbdParticleId &bodyId1, const Vec3d contactPt1, const Vec3d contactNormal0To1, const double compliance)
Initialize the constraint ptOnBody is global position.
void correctVelocity(PbdState &bodies, const double dt) override
Solve the velocities given to the constraint.
Resolves a point on body to an edge with linear and angular movement.
virtual bool computeValueAndGradient(PbdState &bodies, double &c, std::vector< Vec3d > &dcdx)=0
Compute value and gradient of the constraint.
void initConstraint(const PbdState &state, const PbdParticleId &bodyId0, const Vec3d ptOnBody0, const PbdParticleId &bodyId1, const Vec3d ptOnBody1, const double compliance)
Initialize the constraint ptOnBody is global position restLength is set to the initial distance betwe...
double getForce(const double dt) const
Get the force magnitude, valid after solving lambda Only valid with xpbd.
void initConstraint(const PbdState &state, const PbdParticleId &bodyId0, const Vec3d ptOnBody0, const PbdParticleId &bodyId1, const double restLength, const double compliance)
Initialize the constraint.
const Vec3d & getR(const int i) const
Get the support point r/the difference to the contact point.
Base Constraint class for Position based dynamics constraints.
Constrain two locally defined points on each body by a given distance.
SolverType
Type of solvers.
Vec3d getVelocityOnRigidBody(PbdState &bodies, const int bodyId, const Vec3d &pt)
Returns the velocity at the given point on body Either body in collision could be rigid body...
This class constrains a rigid line to a fixed point.
Provides interface for accessing particles from a 2d array of PbdBody,Particles.
double getTorque(const double dt, const int i)
Get torque magnitude after solve.
A constraint on a rigid body that defines rotationl correction through dx applied at a local position...