iMSTK
Interactive Medical Simulation Toolkit
|
The PbdCollisionConstraint implements two sided collision. This allows the usage of differing stiffness for each side which can be useful during solve. Due to differences in definition, collisions do not use XPBD. Only PBD. They are assumed perfectly rigid even though stiffness is modifiable. Given enough iterations in the solve, it will converge to perfectly rigid. More...
#include <imstkPbdCollisionConstraint.h>
Public Member Functions | |
void | projectConstraint (PbdState &bodies, const double dt, const SolverType &type) override |
Performs the actual positional solve. | |
double | getStiffnessA () const |
Get/Set stiffness A or B. | |
void | setStiffnessA (const double stiffnessA) |
double | getStiffnessB () const |
void | setStiffnessB (const double stiffnessB) |
void | setEnableBoundaryCollisions (const double enableBoundaryCollisions) |
Get enableBoundaryCollision. | |
const double | getEnableBoundaryCollisions () const |
![]() | |
virtual const std::string | getTypeName () const =0 |
virtual bool | computeValueAndGradient (PbdState &bodies, double &c, std::vector< Vec3d > &dcdx)=0 |
Compute value and gradient of the constraint. More... | |
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. | |
virtual void | correctVelocity (PbdState &bodies, const double dt) |
Correct velocities according to friction and restitution Corrects according to the gradient direction. | |
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 Member Functions | |
PbdCollisionConstraint (const int numParticlesA, const int numParticlesB) | |
![]() | |
PbdConstraint (const size_t numParticles) | |
Protected Attributes | |
std::vector< bool > | m_bodiesSides |
Stores 0 or 1 to indicate side of particle. | |
std::array< double, 2 > | m_stiffness = { 1.0, 1.0 } |
bool | m_enableBoundaryCollisions = false |
![]() | |
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. | |
The PbdCollisionConstraint implements two sided collision. This allows the usage of differing stiffness for each side which can be useful during solve. Due to differences in definition, collisions do not use XPBD. Only PBD. They are assumed perfectly rigid even though stiffness is modifiable. Given enough iterations in the solve, it will converge to perfectly rigid.
Collision constraint also provides a correctVelocity function. This may be overriden but by default it will correct velocity along the gradient tangents and normal according to frictional and restitution coefficients.
Definition at line 28 of file imstkPbdCollisionConstraint.h.
|
protected |
Enables boundary collisions, turned off by default due to the edge cases present when a point is fixed/infinite mass that can cause instabilities
Definition at line 65 of file imstkPbdCollisionConstraint.h.