diff options
author | Chuyuan Kelly Fu <fuchuyuan@google.com> | 2022-03-03 18:05:50 -0800 |
---|---|---|
committer | Chuyuan Kelly Fu <fuchuyuan@google.com> | 2022-03-03 18:05:50 -0800 |
commit | c9fe6638f8df0a195d281d9ebeb1ccd2e0a50364 (patch) | |
tree | bad7ae0572f8b85af95abfbfac53992a3e6dab40 | |
parent | a8cf6008b7085f3ccd8b86fdf6c5acd051fc29b9 (diff) | |
download | bullet3-c9fe6638f8df0a195d281d9ebeb1ccd2e0a50364.tar.gz |
limit num contacts reported. Add distance to Deformable Deformable contact
-rw-r--r-- | examples/SharedMemory/PhysicsServerCommandProcessor.cpp | 7 | ||||
-rw-r--r-- | src/BulletSoftBody/btDeformableBodySolver.cpp | 1 | ||||
-rw-r--r-- | src/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.cpp | 4 | ||||
-rw-r--r-- | src/BulletSoftBody/btSoftBody.h | 1 | ||||
-rw-r--r-- | src/BulletSoftBody/btSoftBodyInternals.h | 4 |
5 files changed, 13 insertions, 4 deletions
diff --git a/examples/SharedMemory/PhysicsServerCommandProcessor.cpp b/examples/SharedMemory/PhysicsServerCommandProcessor.cpp index dc2e89b66..aa2db7288 100644 --- a/examples/SharedMemory/PhysicsServerCommandProcessor.cpp +++ b/examples/SharedMemory/PhysicsServerCommandProcessor.cpp @@ -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; diff --git a/src/BulletSoftBody/btDeformableBodySolver.cpp b/src/BulletSoftBody/btDeformableBodySolver.cpp index 699c6bcad..9b92df006 100644 --- a/src/BulletSoftBody/btDeformableBodySolver.cpp +++ b/src/BulletSoftBody/btDeformableBodySolver.cpp @@ -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); } diff --git a/src/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.cpp b/src/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.cpp index 983e622b5..8b208d939 100644 --- a/src/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.cpp +++ b/src/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.cpp @@ -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) diff --git a/src/BulletSoftBody/btSoftBody.h b/src/BulletSoftBody/btSoftBody.h index 742ae0276..45319f96e 100644 --- a/src/BulletSoftBody/btSoftBody.h +++ b/src/BulletSoftBody/btSoftBody.h @@ -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 diff --git a/src/BulletSoftBody/btSoftBodyInternals.h b/src/BulletSoftBody/btSoftBodyInternals.h index 6ce5df7b6..be1a64b98 100644 --- a/src/BulletSoftBody/btSoftBodyInternals.h +++ b/src/BulletSoftBody/btSoftBodyInternals.h @@ -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); } } } |