perform position correction only when objects are penetrating

This commit is contained in:
Xuchen Han
2019-08-02 13:21:06 -07:00
parent 3dc8abcf36
commit 54303e02b1
3 changed files with 11 additions and 9 deletions

View File

@@ -109,12 +109,14 @@ void btDeformableRigidDynamicsWorld::positionCorrection(btScalar dt)
if (cti.m_colObj->hasContactResponse()) if (cti.m_colObj->hasContactResponse())
{ {
btScalar dp = cti.m_offset; btScalar dp = cti.m_offset;
if (friction.m_static[j] == true)
{ // only perform position correction when penetrating
c->m_node->m_v = va;
}
if (dp < 0) if (dp < 0)
{ {
if (friction.m_static[j] == true)
{
c->m_node->m_v = va;
}
c->m_node->m_v -= dp * cti.m_normal / dt; c->m_node->m_v -= dp * cti.m_normal / dt;
} }
} }

View File

@@ -2271,9 +2271,9 @@ bool btSoftBody::checkContact(const btCollisionObjectWrapper* colObjWrap,
btVector3 nrm; btVector3 nrm;
const btCollisionShape* shp = colObjWrap->getCollisionShape(); const btCollisionShape* shp = colObjWrap->getCollisionShape();
const btCollisionObject* tmpCollisionObj = colObjWrap->getCollisionObject(); const btCollisionObject* tmpCollisionObj = colObjWrap->getCollisionObject();
// get the position x_{n+1}^* = x_n + dt * v_{n+1}^* where v_{n+1}^* = v_n + dtg // use the position x_{n+1}^* = x_n + dt * v_{n+1}^* where v_{n+1}^* = v_n + dtg for collision detect
// but resolve contact at x_n
const btTransform &wtr = (predict) ? tmpCollisionObj->getInterpolationWorldTransform() : colObjWrap->getWorldTransform(); const btTransform &wtr = (predict) ? tmpCollisionObj->getInterpolationWorldTransform() : colObjWrap->getWorldTransform();
// const btTransform &wtr = colObjWrap->getWorldTransform();
btScalar dst = btScalar dst =
m_worldInfo->m_sparsesdf.Evaluate( m_worldInfo->m_sparsesdf.Evaluate(
@@ -2281,13 +2281,14 @@ bool btSoftBody::checkContact(const btCollisionObjectWrapper* colObjWrap,
shp, shp,
nrm, nrm,
margin); margin);
if (dst < 0 || !predict) if (!predict)
{ {
cti.m_colObj = colObjWrap->getCollisionObject(); cti.m_colObj = colObjWrap->getCollisionObject();
cti.m_normal = wtr.getBasis() * nrm; cti.m_normal = wtr.getBasis() * nrm;
cti.m_offset = dst; cti.m_offset = dst;
return (true);
} }
if (dst < 0)
return true;
return (false); return (false);
} }

View File

@@ -947,7 +947,6 @@ struct btSoftColliders
{ {
// check for collision at x_{n+1}^* // check for collision at x_{n+1}^*
if (psb->checkContact(m_colObj1Wrap, n.m_x, m, c.m_cti, /*predicted = */ true)) if (psb->checkContact(m_colObj1Wrap, n.m_x, m, c.m_cti, /*predicted = */ true))
// if (psb->checkContact(m_colObj1Wrap, n.m_q, m, c.m_cti, /*predicted = */ false));
{ {
const btScalar ima = n.m_im; const btScalar ima = n.m_im;
const btScalar imb = m_rigidBody ? m_rigidBody->getInvMass() : 0.f; const btScalar imb = m_rigidBody ? m_rigidBody->getInvMass() : 0.f;