finish deformable sleeping and add option for drag

This commit is contained in:
Xuchen Han
2019-10-10 13:12:40 -07:00
parent 0d7ff567e6
commit 25a566c378
7 changed files with 43 additions and 0 deletions

View File

@@ -101,6 +101,10 @@ void btDeformableBackwardEulerObjective::applyForce(TVStack& force, bool setZero
for (int i = 0; i < m_softBodies.size(); ++i) for (int i = 0; i < m_softBodies.size(); ++i)
{ {
btSoftBody* psb = m_softBodies[i]; btSoftBody* psb = m_softBodies[i];
if (!psb->isActive())
{
continue;
}
for (int j = 0; j < psb->m_nodes.size(); ++j) 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; btScalar one_over_mass = (psb->m_nodes[j].m_im == 0) ? 0 : psb->m_nodes[j].m_im;

View File

@@ -376,6 +376,7 @@ void btDeformableBodySolver::predictDeformableMotion(btSoftBody* psb, btScalar d
for (i = 0, ni = psb->m_nodes.size(); i < ni; ++i) for (i = 0, ni = psb->m_nodes.size(); i < ni; ++i)
{ {
btSoftBody::Node& n = psb->m_nodes[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; n.m_q = n.m_x + n.m_v * dt;
} }
/* Bounds */ /* Bounds */

View File

@@ -80,6 +80,10 @@ public:
for (int i = 0; i<m_softBodies.size();++i) for (int i = 0; i<m_softBodies.size();++i)
{ {
btSoftBody* psb = m_softBodies[i]; btSoftBody* psb = m_softBodies[i];
if (!psb->isActive())
{
continue;
}
for (int j = 0; j < psb->m_nodes.size(); ++j) for (int j = 0; j < psb->m_nodes.size(); ++j)
{ {
const btSoftBody::Node& node = psb->m_nodes[j]; const btSoftBody::Node& node = psb->m_nodes[j];

View File

@@ -51,6 +51,10 @@ public:
for (int i = 0; i < m_softBodies.size(); ++i) for (int i = 0; i < m_softBodies.size(); ++i)
{ {
const btSoftBody* psb = m_softBodies[i]; const btSoftBody* psb = m_softBodies[i];
if (!psb->isActive())
{
continue;
}
for (int j = 0; j < psb->m_links.size(); ++j) for (int j = 0; j < psb->m_links.size(); ++j)
{ {
const btSoftBody::Link& link = psb->m_links[j]; const btSoftBody::Link& link = psb->m_links[j];
@@ -83,6 +87,10 @@ public:
for (int i = 0; i < m_softBodies.size(); ++i) for (int i = 0; i < m_softBodies.size(); ++i)
{ {
const btSoftBody* psb = m_softBodies[i]; const btSoftBody* psb = m_softBodies[i];
if (!psb->isActive())
{
continue;
}
for (int j = 0; j < psb->m_links.size(); ++j) for (int j = 0; j < psb->m_links.size(); ++j)
{ {
const btSoftBody::Link& link = psb->m_links[j]; const btSoftBody::Link& link = psb->m_links[j];
@@ -108,6 +116,10 @@ public:
for (int i = 0; i < m_softBodies.size(); ++i) for (int i = 0; i < m_softBodies.size(); ++i)
{ {
btSoftBody* psb = m_softBodies[i]; btSoftBody* psb = m_softBodies[i];
if (!psb->isActive())
{
continue;
}
btScalar scaled_k_damp = m_dampingStiffness * scale; btScalar scaled_k_damp = m_dampingStiffness * scale;
for (int j = 0; j < psb->m_links.size(); ++j) for (int j = 0; j < psb->m_links.size(); ++j)
{ {
@@ -138,6 +150,10 @@ public:
for (int i = 0; i < m_softBodies.size(); ++i) for (int i = 0; i < m_softBodies.size(); ++i)
{ {
const btSoftBody* psb = m_softBodies[i]; const btSoftBody* psb = m_softBodies[i];
if (!psb->isActive())
{
continue;
}
for (int j = 0; j < psb->m_links.size(); ++j) for (int j = 0; j < psb->m_links.size(); ++j)
{ {
const btSoftBody::Link& link = psb->m_links[j]; const btSoftBody::Link& link = psb->m_links[j];
@@ -160,6 +176,10 @@ public:
for (int i = 0; i < m_softBodies.size(); ++i) for (int i = 0; i < m_softBodies.size(); ++i)
{ {
btSoftBody* psb = m_softBodies[i]; btSoftBody* psb = m_softBodies[i];
if (!psb->isActive())
{
continue;
}
for (int j = 0; j < psb->m_nodes.size(); ++j) for (int j = 0; j < psb->m_nodes.size(); ++j)
{ {
sz = btMax(sz, psb->m_nodes[j].index); sz = btMax(sz, psb->m_nodes[j].index);
@@ -188,6 +208,10 @@ public:
for (int i = 0; i < m_softBodies.size(); ++i) for (int i = 0; i < m_softBodies.size(); ++i)
{ {
const btSoftBody* psb = m_softBodies[i]; const btSoftBody* psb = m_softBodies[i];
if (!psb->isActive())
{
continue;
}
btScalar scaled_k = m_elasticStiffness * scale; btScalar scaled_k = m_elasticStiffness * scale;
for (int j = 0; j < psb->m_links.size(); ++j) for (int j = 0; j < psb->m_links.size(); ++j)
{ {

View File

@@ -93,6 +93,10 @@ public:
for (int i = 0; i < m_softBodies.size(); ++i) for (int i = 0; i < m_softBodies.size(); ++i)
{ {
btSoftBody* psb = m_softBodies[i]; btSoftBody* psb = m_softBodies[i];
if (!psb->isActive())
{
continue;
}
for (int j = 0; j < psb->m_tetraScratches.size(); ++j) for (int j = 0; j < psb->m_tetraScratches.size(); ++j)
{ {
btSoftBody::Tetra& tetra = psb->m_tetras[j]; btSoftBody::Tetra& tetra = psb->m_tetras[j];
@@ -111,6 +115,10 @@ public:
for (int i = 0; i < m_softBodies.size(); ++i) for (int i = 0; i < m_softBodies.size(); ++i)
{ {
btSoftBody* psb = m_softBodies[i]; btSoftBody* psb = m_softBodies[i];
if (!psb->isActive())
{
continue;
}
for (int j = 0; j < psb->m_nodes.size(); ++j) for (int j = 0; j < psb->m_nodes.size(); ++j)
{ {
sz = btMax(sz, psb->m_nodes[j].index); sz = btMax(sz, psb->m_nodes[j].index);

View File

@@ -89,6 +89,7 @@ void btSoftBody::initDefaults()
m_cfg.piterations = 1; m_cfg.piterations = 1;
m_cfg.diterations = 0; m_cfg.diterations = 0;
m_cfg.citerations = 4; m_cfg.citerations = 4;
m_cfg.drag = 0.01;
m_cfg.collisions = fCollision::Default; m_cfg.collisions = fCollision::Default;
m_cfg.collisions |= fCollision::VF_DD; m_cfg.collisions |= fCollision::VF_DD;
m_pose.m_bvolume = false; m_pose.m_bvolume = false;

View File

@@ -702,6 +702,7 @@ public:
tVSolverArray m_vsequence; // Velocity solvers sequence tVSolverArray m_vsequence; // Velocity solvers sequence
tPSolverArray m_psequence; // Position solvers sequence tPSolverArray m_psequence; // Position solvers sequence
tPSolverArray m_dsequence; // Drift solvers sequence tPSolverArray m_dsequence; // Drift solvers sequence
btScalar drag; // deformable air drag
}; };
/* SolverState */ /* SolverState */
struct SolverState struct SolverState