Fix Issue #1623, SphereTriangleDetector for cases with positive contactBreakingThreshold and where sphere was intersecting with multiple edges

(need to take the closest edge)

Thanks to Andrea Catania for the report and reproduction case!
This commit is contained in:
Erwin Coumans
2018-05-22 08:36:00 +10:00
parent 2ac8c7009d
commit 62d58259bc

View File

@@ -132,6 +132,7 @@ bool SphereTriangleDetector::collide(const btVector3& sphereCenter,btVector3 &po
else { else {
// Could be inside one of the contact capsules // Could be inside one of the contact capsules
btScalar contactCapsuleRadiusSqr = radiusWithThreshold*radiusWithThreshold; btScalar contactCapsuleRadiusSqr = radiusWithThreshold*radiusWithThreshold;
btScalar minDistSqr = contactCapsuleRadiusSqr;
btVector3 nearestOnEdge; btVector3 nearestOnEdge;
for (int i = 0; i < m_triangle->getNumEdges(); i++) { for (int i = 0; i < m_triangle->getNumEdges(); i++) {
@@ -141,8 +142,9 @@ bool SphereTriangleDetector::collide(const btVector3& sphereCenter,btVector3 &po
m_triangle->getEdge(i, pa, pb); m_triangle->getEdge(i, pa, pb);
btScalar distanceSqr = SegmentSqrDistance(pa, pb, sphereCenter, nearestOnEdge); btScalar distanceSqr = SegmentSqrDistance(pa, pb, sphereCenter, nearestOnEdge);
if (distanceSqr < contactCapsuleRadiusSqr) { if (distanceSqr < minDistSqr) {
// Yep, we're inside a capsule // Yep, we're inside a capsule, and record the capsule with smallest distance
minDistSqr = distanceSqr;
hasContact = true; hasContact = true;
contactPoint = nearestOnEdge; contactPoint = nearestOnEdge;
} }