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