From 25a566c378a31f1d97530ffc9c45976e20e08f96 Mon Sep 17 00:00:00 2001 From: Xuchen Han Date: Thu, 10 Oct 2019 13:12:40 -0700 Subject: [PATCH] finish deformable sleeping and add option for drag --- .../btDeformableBackwardEulerObjective.cpp | 4 ++++ src/BulletSoftBody/btDeformableBodySolver.cpp | 1 + src/BulletSoftBody/btDeformableGravityForce.h | 4 ++++ .../btDeformableMassSpringForce.h | 24 +++++++++++++++++++ .../btDeformableNeoHookeanForce.h | 8 +++++++ src/BulletSoftBody/btSoftBody.cpp | 1 + src/BulletSoftBody/btSoftBody.h | 1 + 7 files changed, 43 insertions(+) diff --git a/src/BulletSoftBody/btDeformableBackwardEulerObjective.cpp b/src/BulletSoftBody/btDeformableBackwardEulerObjective.cpp index 49232725a..fee353a60 100644 --- a/src/BulletSoftBody/btDeformableBackwardEulerObjective.cpp +++ b/src/BulletSoftBody/btDeformableBackwardEulerObjective.cpp @@ -101,6 +101,10 @@ void btDeformableBackwardEulerObjective::applyForce(TVStack& force, bool setZero for (int i = 0; i < m_softBodies.size(); ++i) { btSoftBody* psb = m_softBodies[i]; + if (!psb->isActive()) + { + continue; + } for (int j = 0; j < psb->m_nodes.size(); ++j) { btScalar one_over_mass = (psb->m_nodes[j].m_im == 0) ? 0 : psb->m_nodes[j].m_im; diff --git a/src/BulletSoftBody/btDeformableBodySolver.cpp b/src/BulletSoftBody/btDeformableBodySolver.cpp index 1dba88698..dc0b024f3 100644 --- a/src/BulletSoftBody/btDeformableBodySolver.cpp +++ b/src/BulletSoftBody/btDeformableBodySolver.cpp @@ -376,6 +376,7 @@ void btDeformableBodySolver::predictDeformableMotion(btSoftBody* psb, btScalar d for (i = 0, ni = psb->m_nodes.size(); i < ni; ++i) { btSoftBody::Node& n = psb->m_nodes[i]; + n.m_v *= (1 - psb->m_cfg.drag); n.m_q = n.m_x + n.m_v * dt; } /* Bounds */ diff --git a/src/BulletSoftBody/btDeformableGravityForce.h b/src/BulletSoftBody/btDeformableGravityForce.h index d9bef8b07..abc120252 100644 --- a/src/BulletSoftBody/btDeformableGravityForce.h +++ b/src/BulletSoftBody/btDeformableGravityForce.h @@ -80,6 +80,10 @@ public: for (int i = 0; iisActive()) + { + continue; + } for (int j = 0; j < psb->m_nodes.size(); ++j) { const btSoftBody::Node& node = psb->m_nodes[j]; diff --git a/src/BulletSoftBody/btDeformableMassSpringForce.h b/src/BulletSoftBody/btDeformableMassSpringForce.h index 9e7b3594c..44ac91c62 100644 --- a/src/BulletSoftBody/btDeformableMassSpringForce.h +++ b/src/BulletSoftBody/btDeformableMassSpringForce.h @@ -51,6 +51,10 @@ public: for (int i = 0; i < m_softBodies.size(); ++i) { const btSoftBody* psb = m_softBodies[i]; + if (!psb->isActive()) + { + continue; + } for (int j = 0; j < psb->m_links.size(); ++j) { const btSoftBody::Link& link = psb->m_links[j]; @@ -83,6 +87,10 @@ public: for (int i = 0; i < m_softBodies.size(); ++i) { const btSoftBody* psb = m_softBodies[i]; + if (!psb->isActive()) + { + continue; + } for (int j = 0; j < psb->m_links.size(); ++j) { const btSoftBody::Link& link = psb->m_links[j]; @@ -108,6 +116,10 @@ public: for (int i = 0; i < m_softBodies.size(); ++i) { btSoftBody* psb = m_softBodies[i]; + if (!psb->isActive()) + { + continue; + } btScalar scaled_k_damp = m_dampingStiffness * scale; for (int j = 0; j < psb->m_links.size(); ++j) { @@ -138,6 +150,10 @@ public: for (int i = 0; i < m_softBodies.size(); ++i) { const btSoftBody* psb = m_softBodies[i]; + if (!psb->isActive()) + { + continue; + } for (int j = 0; j < psb->m_links.size(); ++j) { const btSoftBody::Link& link = psb->m_links[j]; @@ -160,6 +176,10 @@ public: for (int i = 0; i < m_softBodies.size(); ++i) { btSoftBody* psb = m_softBodies[i]; + if (!psb->isActive()) + { + continue; + } for (int j = 0; j < psb->m_nodes.size(); ++j) { sz = btMax(sz, psb->m_nodes[j].index); @@ -188,6 +208,10 @@ public: for (int i = 0; i < m_softBodies.size(); ++i) { const btSoftBody* psb = m_softBodies[i]; + if (!psb->isActive()) + { + continue; + } btScalar scaled_k = m_elasticStiffness * scale; for (int j = 0; j < psb->m_links.size(); ++j) { diff --git a/src/BulletSoftBody/btDeformableNeoHookeanForce.h b/src/BulletSoftBody/btDeformableNeoHookeanForce.h index c40aaf4a7..797addf8b 100644 --- a/src/BulletSoftBody/btDeformableNeoHookeanForce.h +++ b/src/BulletSoftBody/btDeformableNeoHookeanForce.h @@ -93,6 +93,10 @@ public: for (int i = 0; i < m_softBodies.size(); ++i) { btSoftBody* psb = m_softBodies[i]; + if (!psb->isActive()) + { + continue; + } for (int j = 0; j < psb->m_tetraScratches.size(); ++j) { btSoftBody::Tetra& tetra = psb->m_tetras[j]; @@ -111,6 +115,10 @@ public: for (int i = 0; i < m_softBodies.size(); ++i) { btSoftBody* psb = m_softBodies[i]; + if (!psb->isActive()) + { + continue; + } for (int j = 0; j < psb->m_nodes.size(); ++j) { sz = btMax(sz, psb->m_nodes[j].index); diff --git a/src/BulletSoftBody/btSoftBody.cpp b/src/BulletSoftBody/btSoftBody.cpp index debe95d61..f63955470 100644 --- a/src/BulletSoftBody/btSoftBody.cpp +++ b/src/BulletSoftBody/btSoftBody.cpp @@ -89,6 +89,7 @@ void btSoftBody::initDefaults() m_cfg.piterations = 1; m_cfg.diterations = 0; m_cfg.citerations = 4; + m_cfg.drag = 0.01; m_cfg.collisions = fCollision::Default; m_cfg.collisions |= fCollision::VF_DD; m_pose.m_bvolume = false; diff --git a/src/BulletSoftBody/btSoftBody.h b/src/BulletSoftBody/btSoftBody.h index 8acf22a21..31ddfabb9 100644 --- a/src/BulletSoftBody/btSoftBody.h +++ b/src/BulletSoftBody/btSoftBody.h @@ -702,6 +702,7 @@ public: tVSolverArray m_vsequence; // Velocity solvers sequence tPSolverArray m_psequence; // Position solvers sequence tPSolverArray m_dsequence; // Drift solvers sequence + btScalar drag; // deformable air drag }; /* SolverState */ struct SolverState