iMSTK
Interactive Medical Simulation Toolkit
|
Constrains a rigid body line segment defined via p and q to a "puncture" point defined via barycentric coordinates on a triangle. More...
#include <EmbeddingConstraint.h>
Public Member Functions | |
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. More... | |
Vec3d | computeInterpolantDifference (const PbdState &bodies) const |
Given two interpolants on the two elements, compute the difference between them and use for resolution. | |
bool | computeValueAndGradient (PbdState &bodies, double &c, std::vector< Vec3d > &dcdx) override |
Compute value and gradient of the constraint. More... | |
const Vec3d & | getIntersectionPoint () const |
Vec3d * | getP () const |
Vec3d * | getQ () const |
![]() | |
void | projectConstraint (PbdState &bodies, const double dt, const SolverType &type) override |
Update positions by projecting constraints. | |
virtual Vec3d | computeRelativeVelocity (PbdState &imstkNotUsed(bodies)) |
const Vec3d & | getR (const int i) const |
Get the support point r/the difference to the contact point. | |
void | correctVelocity (PbdState &bodies, const double dt) override |
Solve the velocities given to the constraint. More... | |
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. | |
double | getTorque (const double dt, const int i) |
Get torque magnitude after solve. | |
![]() | |
virtual const std::string | getTypeName () const =0 |
std::vector< PbdParticleId > & | getParticles () |
Get the vertex indices of the constraint. | |
bool | getCorrectVelocity () const |
Get/Set whether velocity should be corrected for this constraint. | |
void | setCorrectVelocity (const bool correctVelocity) |
const Vec3d & | getGradient (const int i) const |
Get gradient given the particle index in constraint. | |
double | getForce (const double dt) const |
Get the force magnitude, valid after solving lambda Only valid with xpbd. | |
double | getConstraintC () const |
Get constraint value C (how much the constraint is violated) | |
double | getLambda () const |
Get constraint value C (how much the constraint is violated) | |
virtual double | getRestValue () const |
Get reference constraint value. This value will have different context depending on the constraint being used. | |
void | zeroOutLambda () |
Zero's out the lagrange multplier before integration only used for xpbd, must be called before solving. | |
double | computeGeneralizedInvMass (const PbdState &bodies, const size_t particleIndex) const |
Compute generalized inverse mass of the particle. Note perf sensitive function. It has been intentionally inlined. More... | |
double | computeGeneralizedInvMass (const PbdState &bodies, const size_t particleIndex, const Vec3d &r) const |
Compute generalized inverse mass of the particle. More... | |
double | getRestitution () const |
Get/Set restitution. | |
void | setRestitution (const double restitution) |
double | getFriction () const |
Get/Set friction. | |
void | setFriction (const double friction) |
double | getStiffness () const |
Get/Set the stiffness. | |
void | setStiffness (const double stiffness) |
double | getCompliance () const |
Get/Set the compliance This function is also provided in case users need 0 compliance. | |
void | setCompliance (const double compliance) |
Protected Attributes | |
Vec3d | m_uvw = Vec3d::Zero() |
Vec2d | m_uv = Vec2d::Zero() |
double | t = 0.0 |
Vec3d * | m_p = nullptr |
Vec3d * | m_q = nullptr |
Vec3d | m_iPt |
double | m_normalFriction = 0.0 |
![]() | |
std::vector< Vec3d > | m_r |
std::vector< double > | m_weights |
![]() | |
std::vector< PbdParticleId > | m_particles |
body, particle index | |
std::vector< Vec3d > | m_dcdx |
Normalized constraint gradients (per particle) | |
double | m_stiffness = 1.0 |
used in PBD, [0, 1] | |
double | m_compliance = 1e-7 |
used in xPBD, inverse of Stiffness | |
double | m_lambda = 0.0 |
Lagrange multiplier. | |
double | m_C = 0.0 |
Constraint Value. | |
double | m_friction = 0.0 |
double | m_restitution = 0.0 |
bool | m_correctVelocity = false |
Additional Inherited Members | |
![]() | |
enum | SolverType { xPBD = 0, PBD } |
Type of solvers. | |
![]() | |
PbdContactConstraint (const int numParticles) | |
![]() | |
PbdConstraint (const size_t numParticles) | |
Constrains a rigid body line segment defined via p and q to a "puncture" point defined via barycentric coordinates on a triangle.
Definition at line 17 of file EmbeddingConstraint.h.
|
overridevirtual |
Compute value and gradient of the constraint.
bodies | PbdState provides all the bodies |
c | Constraint value |
dcdx | Normalized constraint gradients (per vertex) |
Implements imstk::PbdConstraint.
Definition at line 72 of file EmbeddingConstraint.cpp.
void imstk::EmbeddingConstraint::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.
bodies | |
rigid | body particle |
triangle | particle b1 |
triangle | particle b2 |
triangle | particle b3 |
p/start | of line |
q/end | of line |
Definition at line 13 of file EmbeddingConstraint.cpp.