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.