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->setTotalMass(1);
psb->m_cfg.kKHR = 1; // collision hardness with kinematic objects psb->m_cfg.kKHR = 1; // collision hardness with kinematic objects
psb->m_cfg.kCHR = 1; // collision hardness with rigid body 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; psb->m_cfg.collisions = btSoftBody::fCollision::SDF_RD;
getDeformableDynamicsWorld()->addSoftBody(psb); getDeformableDynamicsWorld()->addSoftBody(psb);

View File

@@ -82,7 +82,7 @@ struct btContactSolverInfo : public btContactSolverInfoData
m_numIterations = 10; m_numIterations = 10;
m_erp = btScalar(0.2); m_erp = btScalar(0.2);
m_erp2 = 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_globalCfm = btScalar(0.);
m_frictionERP = btScalar(0.2); //positional friction 'anchors' are disabled by default m_frictionERP = btScalar(0.2); //positional friction 'anchors' are disabled by default
m_frictionCFM = btScalar(0.); m_frictionCFM = btScalar(0.);

View File

@@ -414,6 +414,11 @@ void btDeformableFaceRigidContactConstraint::applyImpulse(const btVector3& impul
if (im2 > 0) if (im2 > 0)
v2 -= dv * contact->m_weights[2]; 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%. // apply strain limiting to prevent the new velocity to change the current length of the edge by more than 1%.
btScalar p = 0.01; btScalar p = 0.01;
btVector3& x0 = face->m_n[0]->m_x; 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)); 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(); // x_diff_norm_new = (x_diff[i] + s * u[i] * dt).safeNorm();
// strainRate = x_diff_norm_new/x_diff_norm; // strainRate = x_diff_norm_new/x_diff_norm;
dn[i] = s - v_diff[i].safeNorm(); 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 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 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])); 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; v0 += dv0;
v1 += dv1; v1 += dv1;
v2 += dv2; v2 += dv2;

View File

@@ -2459,7 +2459,7 @@ bool btSoftBody::checkDeformableFaceContact(const btCollisionObjectWrapper* colO
: colObjWrap->getWorldTransform(); : colObjWrap->getWorldTransform();
btScalar dst; btScalar dst;
//#define USE_QUADRATURE 1 #define USE_QUADRATURE 1
//#define CACHE_PREV_COLLISION //#define CACHE_PREV_COLLISION
// use the contact position of the previous collision // use the contact position of the previous collision
@@ -3698,8 +3698,8 @@ void btSoftBody::defaultCollisionHandler(const btCollisionObjectWrapper* pcoWrap
docollideFace.psb = this; docollideFace.psb = this;
docollideFace.m_colObj1Wrap = pcoWrap; docollideFace.m_colObj1Wrap = pcoWrap;
docollideFace.m_rigidBody = prb1; docollideFace.m_rigidBody = prb1;
docollideFace.dynmargin = 0.9*(basemargin + timemargin); docollideFace.dynmargin = 0.05*(basemargin + timemargin);
docollideFace.stamargin = 0.9*basemargin; docollideFace.stamargin = 0.05*basemargin;
m_fdbvt.collideTV(m_fdbvt.m_root, volume, docollideFace); 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_weights = btScalar(2)/(btScalar(1) + bary.length2()) * bary;
c.m_face = &f; c.m_face = &f;
// friction is handled by the nodes to prevent sticking // friction is handled by the nodes to prevent sticking
const btScalar fc = 0; // const btScalar fc = 0;
// const btScalar fc = psb->m_cfg.kDF * m_colObj1Wrap->getCollisionObject()->getFriction(); 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 // 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; 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;