diff --git a/src/BulletSoftBody/btDeformableBackwardEulerObjective.cpp b/src/BulletSoftBody/btDeformableBackwardEulerObjective.cpp index f722532e2..244fbb6ce 100644 --- a/src/BulletSoftBody/btDeformableBackwardEulerObjective.cpp +++ b/src/BulletSoftBody/btDeformableBackwardEulerObjective.cpp @@ -119,6 +119,11 @@ btScalar btDeformableBackwardEulerObjective::computeNorm(const TVStack& residual void btDeformableBackwardEulerObjective::applyExplicitForce(TVStack& force) { + for (int i = 0; i < m_softBodies.size(); ++i) + { + m_softBodies[i]->updateDeformation(); + } + for (int i = 0; i < m_lf.size(); ++i) { m_lf[i]->addScaledExplicitForce(m_dt, force); diff --git a/src/BulletSoftBody/btDeformableCorotatedForce.h b/src/BulletSoftBody/btDeformableCorotatedForce.h index 156794a50..14896514e 100644 --- a/src/BulletSoftBody/btDeformableCorotatedForce.h +++ b/src/BulletSoftBody/btDeformableCorotatedForce.h @@ -2,7 +2,7 @@ Written by Xuchen Han Bullet Continuous Collision Detection and Physics Library - Copyright (c) 2016 Google Inc. http://bulletphysics.org + Copyright (c) 2019 Google Inc. http://bulletphysics.org This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, @@ -63,10 +63,8 @@ public: for (int j = 0; j < psb->m_tetras.size(); ++j) { btSoftBody::Tetra& tetra = psb->m_tetras[j]; - updateDs(tetra); - btMatrix3x3 F = tetra.m_ds * tetra.m_Dm_inverse; btMatrix3x3 P; - firstPiola(F,P); + firstPiola(tetra.m_F,P); btVector3 force_on_node0 = P * (tetra.m_Dm_inverse.transpose()*grad_N_hat_1st_col); btMatrix3x3 force_on_node123 = P * tetra.m_Dm_inverse.transpose(); @@ -106,16 +104,6 @@ public: P += (F-R) * 2 * m_mu; } } - void updateDs(btSoftBody::Tetra& t) - { - btVector3 c1 = t.m_n[1]->m_q - t.m_n[0]->m_q; - btVector3 c2 = t.m_n[2]->m_q - t.m_n[0]->m_q; - btVector3 c3 = t.m_n[3]->m_q - t.m_n[0]->m_q; - btMatrix3x3 Ds(c1.getX(), c2.getX(), c3.getX(), - c1.getY(), c2.getY(), c3.getY(), - c1.getZ(), c2.getZ(), c3.getZ()); - t.m_ds = Ds; - } virtual void addScaledForceDifferential(btScalar scale, const TVStack& dv, TVStack& df) { diff --git a/src/BulletSoftBody/btSoftBody.cpp b/src/BulletSoftBody/btSoftBody.cpp index 2da04d491..ac7b8ae7e 100644 --- a/src/BulletSoftBody/btSoftBody.cpp +++ b/src/BulletSoftBody/btSoftBody.cpp @@ -2831,6 +2831,20 @@ void btSoftBody::initializeDmInverse() } } +void btSoftBody::updateDeformation() +{ + for (int i = 0; i < m_tetras.size(); ++i) + { + btSoftBody::Tetra& t = m_tetras[i]; + btVector3 c1 = t.m_n[1]->m_q - t.m_n[0]->m_q; + btVector3 c2 = t.m_n[2]->m_q - t.m_n[0]->m_q; + btVector3 c3 = t.m_n[3]->m_q - t.m_n[0]->m_q; + btMatrix3x3 Ds(c1.getX(), c2.getX(), c3.getX(), + c1.getY(), c2.getY(), c3.getY(), + c1.getZ(), c2.getZ(), c3.getZ()); + t.m_F = Ds * t.m_Dm_inverse; + } +} // void btSoftBody::Joint::Prepare(btScalar dt, int) { diff --git a/src/BulletSoftBody/btSoftBody.h b/src/BulletSoftBody/btSoftBody.h index 0ee9e827d..cd235c29d 100644 --- a/src/BulletSoftBody/btSoftBody.h +++ b/src/BulletSoftBody/btSoftBody.h @@ -293,7 +293,7 @@ public: btScalar m_c1; // (4*kVST)/(im0+im1+im2+im3) btScalar m_c2; // m_c1/sum(|g0..3|^2) btMatrix3x3 m_Dm_inverse; // rest Dm^-1 - btMatrix3x3 m_ds; + btMatrix3x3 m_F; btScalar m_element_measure; }; /* RContact */ @@ -1027,6 +1027,7 @@ public: void dampClusters(); void setSpringStiffness(btScalar k); void initializeDmInverse(); + void updateDeformation(); void applyForces(); static void PSolve_Anchors(btSoftBody* psb, btScalar kst, btScalar ti); static void PSolve_RContacts(btSoftBody* psb, btScalar kst, btScalar ti);