parameter tweaks after testing on robot

This commit is contained in:
Xuchen Han
2020-01-04 17:13:43 -08:00
parent a274bcbfa3
commit ee2a811c09
5 changed files with 20 additions and 20 deletions

View File

@@ -219,7 +219,7 @@ void DeformableRigid::initPhysics()
psb->setTotalMass(1);
psb->m_cfg.kKHR = 1; // collision hardness with kinematic objects
psb->m_cfg.kCHR = 1; // collision hardness with rigid body
psb->m_cfg.kDF = 2;
psb->m_cfg.kDF = .4;
psb->m_cfg.collisions = btSoftBody::fCollision::SDF_RD;
getDeformableDynamicsWorld()->addSoftBody(psb);

View File

@@ -82,7 +82,7 @@ struct btContactSolverInfo : public btContactSolverInfoData
m_numIterations = 10;
m_erp = btScalar(0.2);
m_erp2 = btScalar(0.2);
m_deformable_erp = btScalar(0.1);
m_deformable_erp = btScalar(0.3);
m_globalCfm = btScalar(0.);
m_frictionERP = btScalar(0.2); //positional friction 'anchors' are disabled by default
m_frictionCFM = btScalar(0.);

View File

@@ -414,6 +414,11 @@ void btDeformableFaceRigidContactConstraint::applyImpulse(const btVector3& impul
if (im2 > 0)
v2 -= dv * contact->m_weights[2];
btScalar relaxation = 1./btScalar(m_infoGlobal->m_numIterations);
btScalar m01 = (relaxation/(im0 + im1));
btScalar m02 = (relaxation/(im0 + im2));
btScalar m12 = (relaxation/(im1 + im2));
#ifdef USE_STRAIN_RATE_LIMITING
// apply strain limiting to prevent the new velocity to change the current length of the edge by more than 1%.
btScalar p = 0.01;
btVector3& x0 = face->m_n[0]->m_x;
@@ -446,24 +451,19 @@ void btDeformableFaceRigidContactConstraint::applyImpulse(const btVector3& impul
{
s = 1/dt * (-x_diff_dot_u + btSqrt(x_diff_dot_u*x_diff_dot_u + (p*p+2*p) * x_diff_norm * x_diff_norm));
}
// x_diff_norm_new = (x_diff[i] + s * u[i] * dt).safeNorm();
// strainRate = x_diff_norm_new/x_diff_norm;
// x_diff_norm_new = (x_diff[i] + s * u[i] * dt).safeNorm();
// strainRate = x_diff_norm_new/x_diff_norm;
dn[i] = s - v_diff[i].safeNorm();
}
btScalar relaxation = 0.5;
// apply strain limiting to prevent undamped modes
btScalar m01 = (relaxation/(im0 + im1));
btScalar m02 = (relaxation/(im0 + im2));
btScalar m12 = (relaxation/(im1 + im2));
// btVector3 dv0 = im0 * (m01 * (v1-v0) + m02 * (v2-v0));
// btVector3 dv1 = im1 * (m01 * (v0-v1) + m12 * (v2-v1));
// btVector3 dv2 = im2 * (m12 * (v1-v2) + m02 * (v0-v2));
btVector3 dv0 = im0 * (m01 * u[0]*(-dn[0]) + m02 * u[1]*-(dn[1]));
btVector3 dv1 = im1 * (m01 * u[0]*(dn[0]) + m12 * u[2]*(-dn[2]));
btVector3 dv2 = im2 * (m12 * u[2]*(dn[2]) + m02 * u[1]*(dn[1]));
#else
// apply strain limiting to prevent undamped modes
btVector3 dv0 = im0 * (m01 * (v1-v0) + m02 * (v2-v0));
btVector3 dv1 = im1 * (m01 * (v0-v1) + m12 * (v2-v1));
btVector3 dv2 = im2 * (m12 * (v1-v2) + m02 * (v0-v2));
#endif
v0 += dv0;
v1 += dv1;
v2 += dv2;

View File

@@ -2459,7 +2459,7 @@ bool btSoftBody::checkDeformableFaceContact(const btCollisionObjectWrapper* colO
: colObjWrap->getWorldTransform();
btScalar dst;
//#define USE_QUADRATURE 1
#define USE_QUADRATURE 1
//#define CACHE_PREV_COLLISION
// use the contact position of the previous collision
@@ -3698,8 +3698,8 @@ void btSoftBody::defaultCollisionHandler(const btCollisionObjectWrapper* pcoWrap
docollideFace.psb = this;
docollideFace.m_colObj1Wrap = pcoWrap;
docollideFace.m_rigidBody = prb1;
docollideFace.dynmargin = 0.9*(basemargin + timemargin);
docollideFace.stamargin = 0.9*basemargin;
docollideFace.dynmargin = 0.05*(basemargin + timemargin);
docollideFace.stamargin = 0.05*basemargin;
m_fdbvt.collideTV(m_fdbvt.m_root, volume, docollideFace);
}
}

View File

@@ -1181,8 +1181,8 @@ struct btSoftColliders
c.m_weights = btScalar(2)/(btScalar(1) + bary.length2()) * bary;
c.m_face = &f;
// friction is handled by the nodes to prevent sticking
const btScalar fc = 0;
// const btScalar fc = psb->m_cfg.kDF * m_colObj1Wrap->getCollisionObject()->getFriction();
// const btScalar fc = 0;
const btScalar fc = psb->m_cfg.kDF * m_colObj1Wrap->getCollisionObject()->getFriction();
// the effective inverse mass of the face as in https://graphics.stanford.edu/papers/cloth-sig02/cloth.pdf
ima = bary.getX()*c.m_weights.getX() * n0->m_im + bary.getY()*c.m_weights.getY() * n1->m_im + bary.getZ()*c.m_weights.getZ() * n2->m_im;