Monday, February 13, 2017

2d - Collision Detection with SAT: False Collision for Diagonal Movement Towards Vertical Tile-Walls?


I'm developing my first tile-based 2D-game with Javascript. To learn the basics, I decided to write my own "game engine". I have successfully implemented collision detection using the separating axis theorem, but I've run into a problem that I can't quite wrap my head around.


If I press the [up] and [left] arrow-keys simultaneously, my character moves diagonally towards the upper left. If he hits a horizontal wall, he'll just keep moving in x-direction.


The same goes for [up] and [left] as well as downward-diagonal movements, it works as intended:


horizontal walls


Diagonal movement works fine for horizontal walls, for both left and right-movement


However: this does not work for vertical walls.


Instead of keeping movement in y-direction, he'll just stop as soon as he "enters" a new tile on the y-axis.


So for some reason SAT thinks my character is colliding vertically with tiles from vertical walls:



vertical walls


My character stops because he thinks that he is colliding vertically with tiles from the wall on the right.


This only occurs, when:



  • Moving into top-right direction towards the right wall

  • Moving into top-left direction towards the left wall


Bottom-right and bottom-left movement work: the character keeps moving in y-direction as intended.


Is this inherited from the way SAT works or is there a problem with my implementation? What can I do to solve my problem?


Oh yeah, my character is displayed as a circle but he's actually a rectangular polygon for the collision detection.



Thank you very much for your help.



Answer



Big thanks to Jonathan who pointed me in the right direction. Sean describes the method I used in a different thread. Also big thanks to him! :)


Here is how I solved my problem:


If a collision is registered by my SAT-method, only fire the collision-event on my character if there are no neighbouring solid tiles in the direction of the returned minimum translation vector.


No comments:

Post a Comment

Simple past, Present perfect Past perfect

Can you tell me which form of the following sentences is the correct one please? Imagine two friends discussing the gym... I was in a good s...