Program Listing for File PositionBasedDynamics.h
↰ Return to documentation for file (PositionBasedDynamics/PositionBasedDynamics.h)
#ifndef POSITION_BASED_DYNAMICS_H
#define POSITION_BASED_DYNAMICS_H
#include "Common/Common.h"
// ------------------------------------------------------------------------------------
namespace PBD
{
class PositionBasedDynamics
{
public:
// -------------- standard PBD -----------------------------------------------------
static bool solve_DistanceConstraint(
const Vector3r &p0, Real invMass0,
const Vector3r &p1, Real invMass1,
const Real restLength,
const Real stiffness,
Vector3r &corr0, Vector3r &corr1);
static bool solve_DihedralConstraint(
const Vector3r &p0, Real invMass0, // angle on (p2, p3) between triangles (p0, p2, p3) and (p1, p3, p2)
const Vector3r &p1, Real invMass1,
const Vector3r &p2, Real invMass2,
const Vector3r &p3, Real invMass3,
const Real restAngle,
const Real stiffness,
Vector3r &corr0, Vector3r &corr1, Vector3r &corr2, Vector3r &corr3);
static bool solve_VolumeConstraint(
const Vector3r &p0, Real invMass0,
const Vector3r &p1, Real invMass1,
const Vector3r &p2, Real invMass2,
const Vector3r &p3, Real invMass3,
const Real restVolume,
const Real stiffness,
Vector3r &corr0, Vector3r &corr1, Vector3r &corr2, Vector3r &corr3);
static bool solve_EdgePointDistanceConstraint(
const Vector3r &p, Real invMass,
const Vector3r &p0, Real invMass0,
const Vector3r &p1, Real invMass1,
const Real restDist,
const Real compressionStiffness,
const Real stretchStiffness,
Vector3r &corr, Vector3r &corr0, Vector3r &corr1);
static bool solve_TrianglePointDistanceConstraint(
const Vector3r &p, Real invMass,
const Vector3r &p0, Real invMass0,
const Vector3r &p1, Real invMass1,
const Vector3r &p2, Real invMass2,
const Real restDist,
const Real compressionStiffness,
const Real stretchStiffness,
Vector3r &corr, Vector3r &corr0, Vector3r &corr1, Vector3r &corr2);
static bool solve_EdgeEdgeDistanceConstraint(
const Vector3r &p0, Real invMass0,
const Vector3r &p1, Real invMass1,
const Vector3r &p2, Real invMass2,
const Vector3r &p3, Real invMass3,
const Real restDist,
const Real compressionStiffness,
const Real stretchStiffness,
Vector3r &corr0, Vector3r &corr1, Vector3r &corr2, Vector3r &corr3);
// -------------- Isometric bending -----------------------------------------------------
static bool init_IsometricBendingConstraint(
const Vector3r &p0,
const Vector3r &p1,
const Vector3r &p2,
const Vector3r &p3,
Matrix4r &Q
);
static bool solve_IsometricBendingConstraint(
const Vector3r &p0, Real invMass0, // angle on (p2, p3) between triangles (p0, p2, p3) and (p1, p3, p2)
const Vector3r &p1, Real invMass1,
const Vector3r &p2, Real invMass2,
const Vector3r &p3, Real invMass3,
const Matrix4r &Q,
const Real stiffness,
Vector3r &corr0, Vector3r &corr1, Vector3r &corr2, Vector3r &corr3);
// -------------- Shape Matching -----------------------------------------------------
static bool init_ShapeMatchingConstraint(
const Vector3r x0[], const Real invMasses[], const int numPoints,
Vector3r &restCm);
static bool solve_ShapeMatchingConstraint(
const Vector3r x0[], const Vector3r x[], const Real invMasses[], const int numPoints,
const Vector3r &restCm,
const Real stiffness,
const bool allowStretch, // default false
Vector3r corr[], Matrix3r *rot = NULL);
// -------------- Strain Based Dynamics -----------------------------------------------------
static bool init_StrainTriangleConstraint(
const Vector3r &p0,
const Vector3r &p1,
const Vector3r &p2,
Matrix2r &invRestMat
);
static bool solve_StrainTriangleConstraint(
const Vector3r &p0, Real invMass0,
const Vector3r &p1, Real invMass1,
const Vector3r &p2, Real invMass2,
const Matrix2r &invRestMat,
const Real xxStiffness,
const Real yyStiffness,
const Real xyStiffness,
const bool normalizeStretch, // use false as default
const bool normalizeShear, // use false as default
Vector3r &corr0, Vector3r &corr1, Vector3r &corr2);
static bool init_StrainTetraConstraint(
const Vector3r &p0,
const Vector3r &p1,
const Vector3r &p2,
const Vector3r &p3,
Matrix3r &invRestMat
);
// has no inversion handling. Possible simple solution: if the volume is negative,
// scale corrections down and use the volume constraint to fix the volume sign
static bool solve_StrainTetraConstraint(
const Vector3r &p0, Real invMass0,
const Vector3r &p1, Real invMass1,
const Vector3r &p2, Real invMass2,
const Vector3r &p3, Real invMass3,
const Matrix3r &invRestMat,
const Vector3r &stretchStiffness, // xx, yy, zz
const Vector3r &shearStiffness, // xy, xz, yz
const bool normalizeStretch, // use false as default
const bool normalizeShear, // use false as default
Vector3r &corr0, Vector3r &corr1, Vector3r &corr2, Vector3r &corr3);
// -------------- FEM Based PBD -----------------------------------------------------
static void computeGradCGreen(
Real restVolume,
const Matrix3r &invRestMat,
const Matrix3r &sigma,
Vector3r *J);
static void computeGreenStrainAndPiolaStress(
const Vector3r &x1, const Vector3r &x2, const Vector3r &x3, const Vector3r &x4,
const Matrix3r &invRestMat,
const Real restVolume,
const Real mu, const Real lambda,
Matrix3r &epsilon, Matrix3r &sigma, Real &energy);
static void computeGreenStrainAndPiolaStressInversion(
const Vector3r &x1, const Vector3r &x2, const Vector3r &x3, const Vector3r &x4,
const Matrix3r &invRestMat,
const Real restVolume,
const Real mu, const Real lambda,
Matrix3r &epsilon, Matrix3r &sigma, Real &energy);
public:
static bool init_FEMTriangleConstraint(
const Vector3r &p0,
const Vector3r &p1,
const Vector3r &p2,
Real &area,
Matrix2r &invRestMat
);
static bool solve_FEMTriangleConstraint(
const Vector3r &p0, Real invMass0,
const Vector3r &p1, Real invMass1,
const Vector3r &p2, Real invMass2,
const Real &area,
const Matrix2r &invRestMat,
const Real youngsModulusX,
const Real youngsModulusY,
const Real youngsModulusShear,
const Real poissonRatioXY,
const Real poissonRatioYX,
Vector3r &corr0, Vector3r &corr1, Vector3r &corr2);
static bool init_FEMTetraConstraint(
const Vector3r &p0,
const Vector3r &p1,
const Vector3r &p2,
const Vector3r &p3,
Real &volume,
Matrix3r &invRestMat
);
static bool solve_FEMTetraConstraint(
const Vector3r &p0, Real invMass0,
const Vector3r &p1, Real invMass1,
const Vector3r &p2, Real invMass2,
const Vector3r &p3, Real invMass3,
const Real restVolume,
const Matrix3r &invRestMat,
const Real youngsModulus,
const Real poissonRatio,
const bool handleInversion,
Vector3r &corr0, Vector3r &corr1, Vector3r &corr2, Vector3r &corr3);
static bool init_ParticleTetContactConstraint(
const Real invMass0, // inverse mass is zero if particle is static
const Vector3r &x0, // particle which collides with tet
const Vector3r &v0, // velocity of particle
const Real invMass[], // inverse masses of tet particles
const Vector3r x[], // positions of tet particles
const Vector3r v[], // velocities of tet particles
const Vector3r &bary, // barycentric coordinates of contact point in tet
const Vector3r &normal, // contact normal in body 1
Eigen::Matrix<Real, 3, 3, Eigen::DontAlign> &constraintInfo);
static bool solve_ParticleTetContactConstraint(
const Real invMass0, // inverse mass is zero if particle is static
const Vector3r &x0, // particle which collides with tet
const Real invMass[], // inverse masses of tet particles
const Vector3r x[], // positions of tet particles
const Vector3r &bary, // barycentric coordinates of contact point in tet
Eigen::Matrix<Real, 3, 3, Eigen::DontAlign> &constraintInfo, // precomputed contact info
Real &lambda,
Vector3r &corr0,
Vector3r corr[]);
static bool velocitySolve_ParticleTetContactConstraint(
const Real invMass0, // inverse mass is zero if particle is static
const Vector3r &x0, // particle which collides with tet
const Vector3r &v0, // velocity of particle
const Real invMass[], // inverse masses of tet particles
const Vector3r x[], // positions of tet particles
const Vector3r v[], // velocities of tet particles
const Vector3r &bary, // barycentric coordinates of contact point in tet
const Real lambda,
const Real frictionCoeff, // friction coefficient
Eigen::Matrix<Real, 3, 3, Eigen::DontAlign> &constraintInfo, // precomputed contact info
Vector3r &corr_v0,
Vector3r corr_v[]);
};
}
#endif