@@ -118,6 +118,27 @@ TEST(GJK, circleAndTriangleCollide2) {
118118 EXPECT_TRUE (result);
119119}
120120
121+ TEST (GJK, circleAndTriangleCollide3) {
122+ Circle3D circle{ glm::vec3{7 .22956371f , 0 .65463f , -0 .94764f }, 0 .5f };
123+ Tri3D triangle{
124+ glm::vec3{1 .0f , -1 .0f , -1 .0f },
125+ glm::vec3{1 .0f , 1 .0f , 1 .0f },
126+ glm::vec3{1 .0f , -1 .0f , 1 .0f }
127+ };
128+
129+ glm::mat4 transform = glm::translate (glm::mat4{ 1 .0f }, glm::vec3 (5.0 , 1.5 , 0.0 ));
130+ transform = glm::scale (transform, glm::vec3 (2.0 , 1.5 , 5.0 ));
131+ auto inv = glm::inverse (transform);
132+
133+ auto ttri = transformSupportFn (getSupportFn (triangle), transform, inv);
134+
135+ auto result = gjk (getSupportFn (circle), ttri);
136+ EXPECT_TRUE (result);
137+
138+ result = gjk (ttri, getSupportFn (circle));
139+ EXPECT_TRUE (result);
140+ }
141+
121142// because EXPECT_FLOAT_EQ is WAYYYYY too strict.
122143bool floatEq (float a, float b) {
123144 return std::abs (a - b) <= 0 .00005f ;
@@ -218,7 +239,7 @@ TEST(EPA, simpleBoxesGiveCorrectDirection) {
218239 auto result = epa (*simplex, getSupportFn (boxA), getSupportFn (boxB));
219240 ASSERT_LE (std::abs (result.depth - 0 .50001f ), 0 .0001f );
220241
221- boxB.translate (result.normal * (result.depth + 0 .0001f ));
242+ boxB.translate (result.normal * (result.depth + 0 .004f ));
222243 EXPECT_FALSE (gjk (getSupportFn (boxA), getSupportFn (boxB)));
223244}
224245
@@ -248,4 +269,31 @@ TEST(EPA, mixedShapesGiveCorrectDirection) {
248269
249270 auto result = epa (*simplex, sptA, sptB);
250271 EXPECT_TRUE (floatEq (result.depth , 0.5 ));
272+ }
273+
274+ TEST (EPA, mixedShapesGiveCorrectDirection2) {
275+ Circle3D circle{ glm::vec3{-6 .91016197f , 0 .49365893f , 1 .70220768f }, 0 .5f };
276+ Tri3D tri{
277+ glm::vec3{-1.0 , -1 .0f , 1 .0f },
278+ glm::vec3{-1 .0f , 1 .0f , 1 .0f },
279+ glm::vec3{-1 .0f , 1 .0f , -1 .0f }
280+ };
281+
282+ glm::mat4 t = glm::translate (glm::mat4{ 1 .0f }, glm::vec3 (-5.0 , 0.5 , 1.0 ));
283+ t = glm::rotate (t, glm::radians (45 .0f ), glm::vec3 (0.0 , 0.0 , 1.0 ));
284+
285+ auto sptA = getSupportFn (circle);
286+ auto sptB = transformSupportFn (getSupportFn (tri), t, glm::inverse (t));
287+
288+ auto simplex = gjk (sptA, sptB);
289+ ASSERT_TRUE (simplex);
290+
291+ auto result = epa (*simplex, sptA, sptB);
292+ EXPECT_LE (result.depth , 0 .004f );
293+
294+ simplex = gjk (sptB, sptA);
295+ ASSERT_TRUE (simplex);
296+
297+ result = epa (*simplex, sptB, sptA);
298+ EXPECT_LE (result.depth , 0 .004f );
251299}
0 commit comments