Skip to content

Commit 6b90c9c

Browse files
[#34] GJK handles points with ~0 distance in simplex
1 parent 6232210 commit 6b90c9c

File tree

1 file changed

+15
-3
lines changed

1 file changed

+15
-3
lines changed

Arion/include/Arion/GilbertJohnsonKeerthi.hpp

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,18 +113,30 @@ bool CalculateSimplex(
113113
simplex.vertices[simplex.size - 1] = simplex.supportVertices[simplex.size - 1].aSupportVertex
114114
- simplex.supportVertices[simplex.size - 1].bSupportVertex;
115115

116-
//Debug call
117-
debug::Debug::GjkCall(simplex, false);
116+
//If next best choice within zero distance threshold - end GJK
117+
for (uint8_t i = 0; i < simplex.size - 1; ++i)
118+
{
119+
if (epona::fp::IsZero(glm::distance(simplex.vertices[i], simplex.vertices[simplex.size - 1])))
120+
{
121+
simplex.size--;
122+
debug::Debug::GjkCall(simplex, true);
123+
return false;
124+
}
125+
}
118126

119127
//Calculate if the new vertex is past the origin
120128
if (epona::fp::IsLess(glm::dot(simplex.vertices[simplex.size - 1], direction), 0.0f))
121129
{
130+
debug::Debug::GjkCall(simplex, true);
122131
return false;
123132
}
133+
134+
//Debug call
135+
debug::Debug::GjkCall(simplex, false);
124136
} while (!DoSimplex(simplex, direction) && --maxIterations);
125137

126138
//Debug call
127-
debug::Debug::GjkCall(simplex, static_cast<bool>(maxIterations));
139+
debug::Debug::GjkCall(simplex, true);
128140

129141
return static_cast<bool>(maxIterations);
130142
}

0 commit comments

Comments
 (0)