7 #include "EmbeddingConstraint.h" 8 #include "imstkCollisionUtils.h" 18 const double compliance)
24 const Vec3d& x1 = bodies.getPosition(
m_particles[0]);
25 const Vec3d& x2 = bodies.getPosition(
m_particles[1]);
26 const Vec3d& x3 = bodies.getPosition(
m_particles[2]);
29 CollisionUtils::testSegmentTriangle(*p, *q, x1, x2, x3, m_uvw);
30 m_iPt = x1 * m_uvw[0] + x2 * m_uvw[1] + x3 * m_uvw[2];
34 m_r[3] = bodies.getOrientation(ptA1).inverse()._transformVector(m_iPt - bodies.getPosition(ptA1));
40 const Vec3d pq = (*p - *q).normalized();
41 const Vec3d d = m_iPt - *q;
43 m_uv[0] = t = pq.dot(d) / pq.norm();
44 m_uv[1] = 1.0 - m_uv[0];
47 setCompliance(compliance);
53 const Vec3d& x1 = bodies.getPosition(
m_particles[0]);
54 const Vec3d& x2 = bodies.getPosition(
m_particles[1]);
55 const Vec3d& x3 = bodies.getPosition(
m_particles[2]);
59 const Vec3d pq = (*p - *q);
60 const Vec3d pq_n = pq.normalized();
63 const Vec3d triPos = x1 * m_uvw[0] + x2 * m_uvw[1] + x3 * m_uvw[2];
64 const Vec3d linePos = (*q) * m_uv[0] + (*p) * m_uv[1];
68 return triPos - linePos;
73 std::vector<Vec3d>& dcdx)
76 const Vec3d& x0 = bodies.getPosition(
m_particles[0]);
77 const Vec3d& x1 = bodies.getPosition(
m_particles[1]);
78 const Vec3d& x2 = bodies.getPosition(
m_particles[2]);
80 const Vec3d& x3 = bodies.getPosition(
m_particles[3]);
84 const Vec3d pq = *m_p - *m_q;
85 const Vec3d pq_n = pq.normalized();
92 diff = diff - diff.dot(pq_n) * pq_n * (1.0 - m_normalFriction);
93 const Vec3d ortho = diff.normalized();
96 const Vec3d triPos = m_iPt = x0 * m_uvw[0] + x1 * m_uvw[1] + x2 * m_uvw[2];
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
bool computeValueAndGradient(PbdState &bodies, double &c, std::vector< Vec3d > &dcdx) override
Compute value and gradient of the constraint.
Vec3d computeInterpolantDifference(const PbdState &bodies) const
Given two interpolants on the two elements, compute the difference between them and use for resolutio...
void initConstraint(PbdState &bodies, const PbdParticleId &ptA1, const PbdParticleId &ptB1, const PbdParticleId &ptB2, const PbdParticleId &ptB3, Vec3d *p, Vec3d *q, const double compliance=0.0)
Initializes both PBD and RBD constraint.
Provides interface for accessing particles from a 2d array of PbdBody,Particles.