move deformation update to before explicit force calculation to prevent repetition of F calculation
This commit is contained in:
@@ -119,6 +119,11 @@ btScalar btDeformableBackwardEulerObjective::computeNorm(const TVStack& residual
|
|||||||
|
|
||||||
void btDeformableBackwardEulerObjective::applyExplicitForce(TVStack& force)
|
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)
|
for (int i = 0; i < m_lf.size(); ++i)
|
||||||
{
|
{
|
||||||
m_lf[i]->addScaledExplicitForce(m_dt, force);
|
m_lf[i]->addScaledExplicitForce(m_dt, force);
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
Written by Xuchen Han <xuchenhan2015@u.northwestern.edu>
|
Written by Xuchen Han <xuchenhan2015@u.northwestern.edu>
|
||||||
|
|
||||||
Bullet Continuous Collision Detection and Physics Library
|
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.
|
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.
|
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,
|
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)
|
for (int j = 0; j < psb->m_tetras.size(); ++j)
|
||||||
{
|
{
|
||||||
btSoftBody::Tetra& tetra = psb->m_tetras[j];
|
btSoftBody::Tetra& tetra = psb->m_tetras[j];
|
||||||
updateDs(tetra);
|
|
||||||
btMatrix3x3 F = tetra.m_ds * tetra.m_Dm_inverse;
|
|
||||||
btMatrix3x3 P;
|
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);
|
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();
|
btMatrix3x3 force_on_node123 = P * tetra.m_Dm_inverse.transpose();
|
||||||
|
|
||||||
@@ -106,16 +104,6 @@ public:
|
|||||||
P += (F-R) * 2 * m_mu;
|
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)
|
virtual void addScaledForceDifferential(btScalar scale, const TVStack& dv, TVStack& df)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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)
|
void btSoftBody::Joint::Prepare(btScalar dt, int)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -293,7 +293,7 @@ public:
|
|||||||
btScalar m_c1; // (4*kVST)/(im0+im1+im2+im3)
|
btScalar m_c1; // (4*kVST)/(im0+im1+im2+im3)
|
||||||
btScalar m_c2; // m_c1/sum(|g0..3|^2)
|
btScalar m_c2; // m_c1/sum(|g0..3|^2)
|
||||||
btMatrix3x3 m_Dm_inverse; // rest Dm^-1
|
btMatrix3x3 m_Dm_inverse; // rest Dm^-1
|
||||||
btMatrix3x3 m_ds;
|
btMatrix3x3 m_F;
|
||||||
btScalar m_element_measure;
|
btScalar m_element_measure;
|
||||||
};
|
};
|
||||||
/* RContact */
|
/* RContact */
|
||||||
@@ -1027,6 +1027,7 @@ public:
|
|||||||
void dampClusters();
|
void dampClusters();
|
||||||
void setSpringStiffness(btScalar k);
|
void setSpringStiffness(btScalar k);
|
||||||
void initializeDmInverse();
|
void initializeDmInverse();
|
||||||
|
void updateDeformation();
|
||||||
void applyForces();
|
void applyForces();
|
||||||
static void PSolve_Anchors(btSoftBody* psb, btScalar kst, btScalar ti);
|
static void PSolve_Anchors(btSoftBody* psb, btScalar kst, btScalar ti);
|
||||||
static void PSolve_RContacts(btSoftBody* psb, btScalar kst, btScalar ti);
|
static void PSolve_RContacts(btSoftBody* psb, btScalar kst, btScalar ti);
|
||||||
|
|||||||
Reference in New Issue
Block a user