I've implemented some collision detection using separating axis theorem. Works fine for axis-aligned rectangles and two out of four possible right triangle orientations. For some reason when the hypotenuse is oriented down left or up right, the minimum translation vector being calculated is that of the normal of the base or height of the triangle rather than the hypotenuse that is being collided with.


I've got a jsfiddle demo of my implementation. The center box and right side triangles all show a correct MVT when the collision box collides with them. The ones on the left side do not. Move your mouse over the canvas to move the collision box.


  • 1
    \$\begingroup\$ This is a problem somewhere in your code. You need to debug your code. Try writing out the algorithm on paper with pictures and see if your code follows the algorithm correctly. Overall I think this question is too localized since it's just your code that's the problem. \$\endgroup\$ – MichaelHouse Jan 1 '13 at 16:32
  • \$\begingroup\$ You are making an undue assumption about which direction to move in checkNormal. \$\endgroup\$ – aaaaaaaaaaaa Jan 1 '13 at 23:17

I know this is a very old question, but for those trying to use this code to make a collision engine (like me), I will present a solution, though not a very elegant one:

For a reason I haven't yet identified, flipping the hypotenuse normal of the 'broken' triangles corrects the collision resolution.

Hope this helps:)

  • \$\begingroup\$ I think in your answer is something broken, right after the colon ;( \$\endgroup\$ – yckart Jan 11 '16 at 18:47
  • \$\begingroup\$ No, nothing is broken, i just phrased my answer somewhat poorly when i wrote it :) \$\endgroup\$ – Nikolai97 Jan 11 '16 at 19:15

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.