parameter tweaks after testing on robot
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
@@ -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.);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user