limit num contacts reported. Add distance to Deformable Deformable contact

This commit is contained in:
Chuyuan Kelly Fu
2022-03-03 18:05:50 -08:00
parent a8cf6008b7
commit c9fe6638f8
5 changed files with 13 additions and 4 deletions

View File

@@ -8134,8 +8134,10 @@ bool PhysicsServerCommandProcessor::processRequestDeformableDeformableContactpoi
{
return false;
}
const int max_contacts_per_object = 4;
for (int i = deformWorld->getSoftBodyArray().size() - 1; i >= 0; i--)
{
int num_contacts_reported = 0;
btSoftBody* psb = deformWorld->getSoftBodyArray()[i];
for (int c = 0; c < psb->m_faceNodeContacts.size(); c++)
{
@@ -8154,8 +8156,13 @@ bool PhysicsServerCommandProcessor::processRequestDeformableDeformableContactpoi
if(RequestFiltered(clientCmd, linkIndexA, linkIndexB, objectIndexA, objectIndexB, swap)==true){
continue;
}
if(++num_contacts_reported>max_contacts_per_object){
break;
}
//Convert contact info
b3ContactPointData pt;
btVector3 l = contact->m_node->m_x - BaryEval(contact->m_face->m_n[0]->m_x, contact->m_face->m_n[1]->m_x, contact->m_face->m_n[2]->m_x, contact->m_normal);
pt.m_contactDistance = -contact->m_margin + contact->m_normal.dot(l);
pt.m_bodyUniqueIdA = objectIndexA;
pt.m_bodyUniqueIdB = objectIndexB;
pt.m_contactDistance = 0;

View File

@@ -411,6 +411,7 @@ void btDeformableBodySolver::predictMotion(btScalar solverdt)
psb->m_nodeRigidContacts.resize(0);
psb->m_faceRigidContacts.resize(0);
psb->m_faceNodeContacts.resize(0);
psb->m_faceNodeContactsCCD.resize(0);
// predict motion for collision detection
predictDeformableMotion(psb, solverdt);
}

View File

@@ -201,7 +201,7 @@ void btDeformableMultiBodyDynamicsWorld::performGeometricCollisions(btScalar tim
if (psb->isActive())
{
// clear contact points in the previous iteration
psb->m_faceNodeContacts.clear();
psb->m_faceNodeContactsCCD.clear();
// update m_q and normals for CCD calculation
for (int j = 0; j < psb->m_nodes.size(); ++j)
@@ -237,7 +237,7 @@ void btDeformableMultiBodyDynamicsWorld::performGeometricCollisions(btScalar tim
btSoftBody* psb = m_softBodies[i];
if (psb->isActive())
{
penetration_count += psb->m_faceNodeContacts.size();
penetration_count += psb->m_faceNodeContactsCCD.size();;
}
}
if (penetration_count == 0)

View File

@@ -824,6 +824,7 @@ public:
btAlignedObjectArray<DeformableNodeRigidContact> m_nodeRigidContacts;
btAlignedObjectArray<DeformableFaceNodeContact> m_faceNodeContacts;
btAlignedObjectArray<DeformableFaceRigidContact> m_faceRigidContacts;
btAlignedObjectArray<DeformableFaceNodeContact> m_faceNodeContactsCCD;
tSContactArray m_scontacts; // Soft contacts
tJointArray m_joints; // Joints
tMaterialArray m_materials; // Materials

View File

@@ -2053,7 +2053,7 @@ struct btSoftColliders
c.m_imf = 0;
c.m_c0 = 0;
c.m_colObj = psb[1];
psb[0]->m_faceNodeContacts.push_back(c);
psb[0]->m_faceNodeContactsCCD.push_back(c);
}
}
void Process(const btDbvntNode* lface1,
@@ -2118,7 +2118,7 @@ struct btSoftColliders
c.m_imf = 0;
c.m_c0 = 0;
c.m_colObj = psb[1];
psb[0]->m_faceNodeContacts.push_back(c);
psb[0]->m_faceNodeContactsCCD.push_back(c);
}
}
}