summaryrefslogtreecommitdiff
path: root/src/BulletSoftBody/BulletReducedDeformableBody/btReducedDeformableContactConstraint.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/BulletSoftBody/BulletReducedDeformableBody/btReducedDeformableContactConstraint.h')
-rw-r--r--src/BulletSoftBody/BulletReducedDeformableBody/btReducedDeformableContactConstraint.h194
1 files changed, 194 insertions, 0 deletions
diff --git a/src/BulletSoftBody/BulletReducedDeformableBody/btReducedDeformableContactConstraint.h b/src/BulletSoftBody/BulletReducedDeformableBody/btReducedDeformableContactConstraint.h
new file mode 100644
index 000000000..10d0938c5
--- /dev/null
+++ b/src/BulletSoftBody/BulletReducedDeformableBody/btReducedDeformableContactConstraint.h
@@ -0,0 +1,194 @@
+#include "../btDeformableContactConstraint.h"
+#include "btReducedDeformableBody.h"
+
+// ================= static constraints ===================
+class btReducedDeformableStaticConstraint : public btDeformableStaticConstraint
+{
+ public:
+ btReducedDeformableBody* m_rsb;
+ btScalar m_dt;
+ btVector3 m_ri;
+ btVector3 m_targetPos;
+ btVector3 m_impulseDirection;
+ btMatrix3x3 m_impulseFactorMatrix;
+ btScalar m_impulseFactor;
+ btScalar m_rhs;
+ btScalar m_appliedImpulse;
+ btScalar m_erp;
+
+ btReducedDeformableStaticConstraint(btReducedDeformableBody* rsb,
+ btSoftBody::Node* node,
+ const btVector3& ri,
+ const btVector3& x0,
+ const btVector3& dir,
+ const btContactSolverInfo& infoGlobal,
+ btScalar dt);
+ // btReducedDeformableStaticConstraint(const btReducedDeformableStaticConstraint& other);
+ btReducedDeformableStaticConstraint() {}
+ virtual ~btReducedDeformableStaticConstraint() {}
+
+ virtual btScalar solveConstraint(const btContactSolverInfo& infoGlobal);
+
+ // this calls reduced deformable body's applyFullSpaceImpulse
+ virtual void applyImpulse(const btVector3& impulse);
+
+ btVector3 getDeltaVa() const;
+
+ // virtual void applySplitImpulse(const btVector3& impulse) {}
+};
+
+// ================= base contact constraints ===================
+class btReducedDeformableRigidContactConstraint : public btDeformableRigidContactConstraint
+{
+ public:
+ bool m_collideStatic; // flag for collision with static object
+ bool m_collideMultibody; // flag for collision with multibody
+
+ int m_nodeQueryIndex;
+ int m_solverBodyId; // for debugging
+
+ btReducedDeformableBody* m_rsb;
+ btSolverBody* m_solverBody;
+ btScalar m_dt;
+
+ btScalar m_appliedNormalImpulse;
+ btScalar m_appliedTangentImpulse;
+ btScalar m_appliedTangentImpulse2;
+ btScalar m_normalImpulseFactor;
+ btScalar m_tangentImpulseFactor;
+ btScalar m_tangentImpulseFactor2;
+ btScalar m_tangentImpulseFactorInv;
+ btScalar m_tangentImpulseFactorInv2;
+ btScalar m_rhs;
+ btScalar m_rhs_tangent;
+ btScalar m_rhs_tangent2;
+
+ btScalar m_cfm;
+ btScalar m_cfm_friction;
+ btScalar m_erp;
+ btScalar m_erp_friction;
+ btScalar m_friction;
+
+ btVector3 m_contactNormalA; // surface normal for rigid body (opposite direction as impulse)
+ btVector3 m_contactNormalB; // surface normal for reduced deformable body (opposite direction as impulse)
+ btVector3 m_contactTangent; // tangential direction of the relative velocity
+ btVector3 m_contactTangent2; // 2nd tangential direction of the relative velocity
+ btVector3 m_relPosA; // relative position of the contact point for A (rigid)
+ btVector3 m_relPosB; // relative position of the contact point for B
+ btMatrix3x3 m_impulseFactor; // total impulse matrix
+
+ btVector3 m_bufferVelocityA; // velocity at the beginning of the iteration
+ btVector3 m_bufferVelocityB;
+ btVector3 m_linearComponentNormal; // linear components for the solver body
+ btVector3 m_angularComponentNormal; // angular components for the solver body
+ // since 2nd contact direction only applies to multibody, these components will never be used
+ btVector3 m_linearComponentTangent;
+ btVector3 m_angularComponentTangent;
+
+ btReducedDeformableRigidContactConstraint(btReducedDeformableBody* rsb,
+ const btSoftBody::DeformableRigidContact& c,
+ const btContactSolverInfo& infoGlobal,
+ btScalar dt);
+ // btReducedDeformableRigidContactConstraint(const btReducedDeformableRigidContactConstraint& other);
+ btReducedDeformableRigidContactConstraint() {}
+ virtual ~btReducedDeformableRigidContactConstraint() {}
+
+ void setSolverBody(const int bodyId, btSolverBody& solver_body);
+
+ virtual void warmStarting() {}
+
+ virtual btScalar solveConstraint(const btContactSolverInfo& infoGlobal);
+
+ void calculateTangentialImpulse(btScalar& deltaImpulse_tangent,
+ btScalar& appliedImpulse,
+ const btScalar rhs_tangent,
+ const btScalar tangentImpulseFactorInv,
+ const btVector3& tangent,
+ const btScalar lower_limit,
+ const btScalar upper_limit,
+ const btVector3& deltaV_rel);
+
+ virtual void applyImpulse(const btVector3& impulse) {}
+
+ virtual void applySplitImpulse(const btVector3& impulse) {} // TODO: may need later
+
+ virtual btVector3 getVa() const;
+ virtual btVector3 getDeltaVa() const = 0;
+ virtual btVector3 getDeltaVb() const = 0;
+};
+
+// ================= node vs rigid constraints ===================
+class btReducedDeformableNodeRigidContactConstraint : public btReducedDeformableRigidContactConstraint
+{
+ public:
+ btSoftBody::Node* m_node;
+
+ btReducedDeformableNodeRigidContactConstraint(btReducedDeformableBody* rsb,
+ const btSoftBody::DeformableNodeRigidContact& contact,
+ const btContactSolverInfo& infoGlobal,
+ btScalar dt);
+ // btReducedDeformableNodeRigidContactConstraint(const btReducedDeformableNodeRigidContactConstraint& other);
+ btReducedDeformableNodeRigidContactConstraint() {}
+ virtual ~btReducedDeformableNodeRigidContactConstraint() {}
+
+ virtual void warmStarting();
+
+ // get the velocity of the deformable node in contact
+ virtual btVector3 getVb() const;
+
+ // get the velocity change of the rigid body
+ virtual btVector3 getDeltaVa() const;
+
+ // get velocity change of the node in contat
+ virtual btVector3 getDeltaVb() const;
+
+ // get the split impulse velocity of the deformable face at the contact point
+ virtual btVector3 getSplitVb() const;
+
+ // get the velocity change of the input soft body node in the constraint
+ virtual btVector3 getDv(const btSoftBody::Node*) const;
+
+ // cast the contact to the desired type
+ const btSoftBody::DeformableNodeRigidContact* getContact() const
+ {
+ return static_cast<const btSoftBody::DeformableNodeRigidContact*>(m_contact);
+ }
+
+ // this calls reduced deformable body's applyFullSpaceImpulse
+ virtual void applyImpulse(const btVector3& impulse);
+};
+
+// ================= face vs rigid constraints ===================
+class btReducedDeformableFaceRigidContactConstraint : public btReducedDeformableRigidContactConstraint
+{
+ public:
+ btSoftBody::Face* m_face;
+ bool m_useStrainLimiting;
+
+ btReducedDeformableFaceRigidContactConstraint(btReducedDeformableBody* rsb,
+ const btSoftBody::DeformableFaceRigidContact& contact,
+ const btContactSolverInfo& infoGlobal,
+ btScalar dt,
+ bool useStrainLimiting);
+ // btReducedDeformableFaceRigidContactConstraint(const btReducedDeformableFaceRigidContactConstraint& other);
+ btReducedDeformableFaceRigidContactConstraint() {}
+ virtual ~btReducedDeformableFaceRigidContactConstraint() {}
+
+ // get the velocity of the deformable face at the contact point
+ virtual btVector3 getVb() const;
+
+ // get the split impulse velocity of the deformable face at the contact point
+ virtual btVector3 getSplitVb() const;
+
+ // get the velocity change of the input soft body node in the constraint
+ virtual btVector3 getDv(const btSoftBody::Node*) const;
+
+ // cast the contact to the desired type
+ const btSoftBody::DeformableFaceRigidContact* getContact() const
+ {
+ return static_cast<const btSoftBody::DeformableFaceRigidContact*>(m_contact);
+ }
+
+ // this calls reduced deformable body's applyFullSpaceImpulse
+ virtual void applyImpulse(const btVector3& impulse);
+}; \ No newline at end of file