From f8c60e9e3c8e60d00543bd458a9fefd404edc95b Mon Sep 17 00:00:00 2001 From: Xuchen Han Date: Thu, 15 Aug 2019 17:15:36 -0700 Subject: [PATCH] add option for angular momentum conserving damping for mass spring --- .../btDeformableMassSpringForce.h | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/BulletSoftBody/btDeformableMassSpringForce.h b/src/BulletSoftBody/btDeformableMassSpringForce.h index f97ef0a03..4eeae14df 100644 --- a/src/BulletSoftBody/btDeformableMassSpringForce.h +++ b/src/BulletSoftBody/btDeformableMassSpringForce.h @@ -18,10 +18,10 @@ class btDeformableMassSpringForce : public btDeformableLagrangianForce { + bool m_momentum_conserving; public: -// using TVStack = btDeformableLagrangianForce::TVStack; typedef btAlignedObjectArray TVStack; - btDeformableMassSpringForce() + btDeformableMassSpringForce() : m_momentum_conserving(false) { } @@ -53,7 +53,15 @@ public: // damping force btVector3 v_diff = (node2->m_v - node1->m_v); btScalar k_damp = psb->m_dampingCoefficient; - btVector3 scaled_force = scale * v_diff * k_damp; + btVector3 scaled_force = scale * k_damp * v_diff; + if (m_momentum_conserving) + { + if ((node2->m_q - node1->m_q).norm() > SIMD_EPSILON) + { + btVector3 dir = (node2->m_q - node1->m_q).normalized(); + scaled_force = scale * k_damp * v_diff.dot(dir) * dir; + } + } force[id1] += scaled_force; force[id2] -= scaled_force; } @@ -102,7 +110,16 @@ public: btSoftBody::Node* node2 = link.m_n[1]; size_t id1 = node1->index; size_t id2 = node2->index; + btVector3 local_scaled_df = scaled_k_damp * (dv[id2] - dv[id1]); + if (m_momentum_conserving) + { + if ((node2->m_q - node1->m_q).norm() > SIMD_EPSILON) + { + btVector3 dir = (node2->m_q - node1->m_q).normalized(); + local_scaled_df= scaled_k_damp * (dv[id2] - dv[id1]).dot(dir) * dir; + } + } df[id1] += local_scaled_df; df[id2] -= local_scaled_df; }