Add bias to prefer some axis when penetration depths are the same in SAT algorithm

This commit is contained in:
Daniel Chappuis 2017-05-16 07:42:04 +02:00
parent 678c88d3bd
commit 2af87d4804
2 changed files with 12 additions and 3 deletions

View File

@ -39,6 +39,9 @@
// We want to use the ReactPhysics3D namespace // We want to use the ReactPhysics3D namespace
using namespace reactphysics3d; using namespace reactphysics3d;
// Static variables initialization
const decimal SATAlgorithm::SAME_SEPARATING_AXIS_BIAS = decimal(0.001);
// Test collision between a sphere and a convex mesh // Test collision between a sphere and a convex mesh
bool SATAlgorithm::testCollisionSphereVsConvexPolyhedron(const NarrowPhaseInfo* narrowPhaseInfo, ContactManifoldInfo& contactManifoldInfo) const { bool SATAlgorithm::testCollisionSphereVsConvexPolyhedron(const NarrowPhaseInfo* narrowPhaseInfo, ContactManifoldInfo& contactManifoldInfo) const {
@ -353,7 +356,7 @@ bool SATAlgorithm::testCollisionConvexPolyhedronVsConvexPolyhedron(const NarrowP
// We have found a separating axis // We have found a separating axis
return false; return false;
} }
if (penetrationDepth < minPenetrationDepth) { if (penetrationDepth < minPenetrationDepth - SAME_SEPARATING_AXIS_BIAS) {
isMinPenetrationFaceNormal = true; isMinPenetrationFaceNormal = true;
minPenetrationDepth = penetrationDepth; minPenetrationDepth = penetrationDepth;
minFaceIndex = faceIndex; minFaceIndex = faceIndex;
@ -367,7 +370,7 @@ bool SATAlgorithm::testCollisionConvexPolyhedronVsConvexPolyhedron(const NarrowP
// We have found a separating axis // We have found a separating axis
return false; return false;
} }
if (penetrationDepth < minPenetrationDepth) { if (penetrationDepth < minPenetrationDepth - SAME_SEPARATING_AXIS_BIAS) {
isMinPenetrationFaceNormal = true; isMinPenetrationFaceNormal = true;
minPenetrationDepth = penetrationDepth; minPenetrationDepth = penetrationDepth;
minFaceIndex = faceIndex; minFaceIndex = faceIndex;
@ -409,7 +412,8 @@ bool SATAlgorithm::testCollisionConvexPolyhedronVsConvexPolyhedron(const NarrowP
return false; return false;
} }
if (penetrationDepth < minPenetrationDepth) { if (penetrationDepth < minPenetrationDepth - SAME_SEPARATING_AXIS_BIAS) {
minPenetrationDepth = penetrationDepth; minPenetrationDepth = penetrationDepth;
isMinPenetrationFaceNormalPolyhedron1 = false; isMinPenetrationFaceNormalPolyhedron1 = false;
isMinPenetrationFaceNormal = false; isMinPenetrationFaceNormal = false;

View File

@ -41,6 +41,11 @@ class SATAlgorithm {
// -------------------- Attributes -------------------- // // -------------------- Attributes -------------------- //
/// Bias used to make sure the SAT algorithm returns the same penetration axis between frames
/// when there are multiple separating axis with the same penetration depth. The goal is to
/// make sure the contact manifold does not change too much between frames.
static const decimal SAME_SEPARATING_AXIS_BIAS;
// -------------------- Methods -------------------- // // -------------------- Methods -------------------- //
/// Return true if two edges of two polyhedrons build a minkowski face (and can therefore be a separating axis) /// Return true if two edges of two polyhedrons build a minkowski face (and can therefore be a separating axis)