Class PositionBasedGenericConstraints

Class Documentation

class PositionBasedGenericConstraints

Generic constraints provide the possibility to experiment with new constraint functions very easily. Only a callback for the constraint function and optionally for the gradient of the constraint must be provided.

Examples and more details can be found here: pageGenericConstraints

Public Static Functions

template<unsigned int numberOfParticles, unsigned int dim>
static bool solve_GenericConstraint(const Real invMass[numberOfParticles], const Vector3r x[numberOfParticles], void *userData, void (*constraintFct)(const unsigned int numParticles, const Real invMass[], const Vector3r x[], void *userData, Eigen::Matrix<Real, dim, 1> &constraintValue), void (*gradientFct)(const unsigned int i, const unsigned int numParticles, const Real invMass[], const Vector3r x[], void *userData, Eigen::Matrix<Real, dim, 3> &jacobian), Vector3r corr_x[numberOfParticles])

Determine the position corrections for a constraint function with a known gradient function.

More information can be found here: secGenericConstraintsCGFct

Parameters
  • invMass – inverse mass of constrained particles

  • x – positions of constrained particles

  • userData – user data which is required in the callback functions

  • constraintFct – constraint callback

  • gradientFct – gradient callback

  • corr_x – position corrections of constrained particles

template<unsigned int numberOfParticles, unsigned int dim>
static bool solve_GenericConstraint(const Real invMass[numberOfParticles], const Vector3r x[numberOfParticles], void *userData, void (*constraintFct)(const unsigned int numParticles, const Real invMass[], const Vector3r x[], void *userData, Eigen::Matrix<Real, dim, 1> &constraintValue), Vector3r corr_x[numberOfParticles])

Determine the position corrections for a constraint function. This method approximates the gradient using finite differences. Note that it is faster to define the gradient function explicitly.

More information can be found here: secGenericConstraintsCFct

Parameters
  • invMass – inverse mass of constrained particles

  • x – positions of constrained particles

  • userData – user data which is required in the callback functions

  • constraintFct – constraint callback

  • corr_x – position corrections of constrained particles

template<unsigned int numberOfParticles, unsigned int dim>
static void approximateGradient(const unsigned int i, const Real invMass[], const Vector3r x[], void *userData, void (*constraintFct)(const unsigned int numParticles, const Real invMass[], const Vector3r x[], void *userData, Eigen::Matrix<Real, dim, 1> &constraintValue), Eigen::Matrix<Real, dim, 3> &jacobian)

Determines the Jacobian of the i-th particle with finite differences.

Parameters
  • i – index of particle for which the gradient should be computed

  • invMass – inverse mass of constrained particles

  • x – positions of constrained particles

  • userData – user data which is required in the callback functions

  • constraintFct – constraint callback

  • jacobian – Jacobian of the i-th particle

template<unsigned int numberOfRigidBodies, unsigned int dim>
static bool solve_GenericConstraint(const Real invMass[numberOfRigidBodies], const Vector3r x[numberOfRigidBodies], const Matrix3r inertiaInverseW[numberOfRigidBodies], const Quaternionr q[numberOfRigidBodies], void *userData, void (*constraintFct)(const unsigned int numRigidBodies, const Real invMass[numberOfRigidBodies], const Vector3r x[numberOfRigidBodies], const Matrix3r inertiaInverseW[numberOfRigidBodies], const Quaternionr q[numberOfRigidBodies], void *userData, Eigen::Matrix<Real, dim, 1> &constraintValue), void (*gradientFct)(const unsigned int i, const unsigned int numRigidBodies, const Real invMass[numberOfRigidBodies], const Vector3r x[numberOfRigidBodies], const Matrix3r inertiaInverseW[numberOfRigidBodies], const Quaternionr q[numberOfRigidBodies], void *userData, Eigen::Matrix<Real, dim, 6> &jacobian), Vector3r corr_x[numberOfRigidBodies], Quaternionr corr_q[numberOfRigidBodies])

Determine the position corrections for a constraint function with a known gradient function.

More information can be found here: secGenericConstraintsCGFct

Parameters
  • invMass – inverse mass of constrained rigid bodies

  • x – positions of constrained rigid bodies

  • inertiaInverseW – inverse inertia tensor in world coordinates of the rigid bodies

  • q – rotation of the rigid bodies

  • userData – user data which is required in the callback functions

  • constraintFct – constraint callback

  • gradientFct – gradient callback

  • corr_x – position corrections of the constrained rigid bodies

  • corr_q – rotation corrections of the constrained rigid bodies

template<unsigned int numberOfRigidBodies, unsigned int dim>
static bool solve_GenericConstraint(const Real invMass[numberOfRigidBodies], const Vector3r x[numberOfRigidBodies], const Matrix3r inertiaInverseW[numberOfRigidBodies], const Quaternionr q[numberOfRigidBodies], void *userData, void (*constraintFct)(const unsigned int numParticles, const Real invMass[numberOfRigidBodies], const Vector3r x[numberOfRigidBodies], const Matrix3r inertiaInverseW[numberOfRigidBodies], const Quaternionr q[numberOfRigidBodies], void *userData, Eigen::Matrix<Real, dim, 1> &constraintValue), Vector3r corr_x[numberOfRigidBodies], Quaternionr corr_q[numberOfRigidBodies])

Determine the position corrections for a constraint function. This method approximates the gradient using finite differences. Note that it is faster to define the gradient function explicitly.

More information can be found here: secGenericConstraintsCFct

Parameters
  • invMass – inverse mass of constrained rigid bodies

  • x – positions of constrained rigid bodies

  • inertiaInverseW – inverse inertia tensor in world coordinates of the rigid bodies

  • q – rotation of the rigid bodies

  • userData – user data which is required in the callback functions

  • constraintFct – constraint callback

  • corr_x – position corrections of the constrained rigid bodies

  • corr_q – rotation corrections of the constrained rigid bodies

template<unsigned int numberOfRigidBodies, unsigned int dim>
static void approximateGradient(const unsigned int i, const Real invMass[numberOfRigidBodies], const Vector3r x[numberOfRigidBodies], const Matrix3r inertiaInverseW[numberOfRigidBodies], const Quaternionr q[numberOfRigidBodies], void *userData, void (*constraintFct)(const unsigned int numParticles, const Real invMass[numberOfRigidBodies], const Vector3r x[numberOfRigidBodies], const Matrix3r inertiaInverseW[numberOfRigidBodies], const Quaternionr q[numberOfRigidBodies], void *userData, Eigen::Matrix<Real, dim, 1> &constraintValue), Eigen::Matrix<Real, dim, 6> &jacobian)

Determines the Jacobian of the i-th rigid body with finite differences.

Parameters
  • i – index of rigid body for which the gradient should be computed

  • invMass – inverse mass of constrained rigid bodies

  • x – positions of constrained rigid bodies

  • inertiaInverseW – inverse inertia tensor in world coordinates of the rigid bodies

  • q – rotation of the rigid bodies

  • userData – user data which is required in the callback functions

  • constraintFct – constraint callback

  • jacobian – Jacobian of the i-th rigid body

static void computeMatrixG(const Quaternionr &q, Eigen::Matrix<Real, 4, 3> &G)

Compute matrix that is required to transform quaternion in a 3D representation.