Class PositionBasedGenericConstraints
Defined in File PositionBasedGenericConstraints.h
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.
-
template<unsigned int numberOfParticles, unsigned int dim>