i have implemented discrete SAT (Separating Axis Theorem) in the past successfully.
Therefore i have now remade this to fix the "fast moving issue" - calculate the time when the collision first happens - to get a value for scaling the velocity to remove the penetration in the first place.
What i basically do is to test two OBB with two fixed axis of (1, 0) and (0, 1) with the following algorythm:
- Get the relative position (distance) between the 2 OBBs (pA - pA)
- Get the relative velocity between the 2 OBBs (vA - Vb) - Just to remove the second velocity to make the second one static.
- For loop over the two axes
- Project the relative position onto the axis to get an offset based on current axis
- Project A onto current axes and get min/max projection
- Add the offset to projection of A
- Project B onto current axes and get min/max projection
- Calculate distances between min/max projections of A and B (d0, d1)
- Calculate time enter and time leave factor by divide both distances by projected velocity on axis
- Swap time enter with time leave if required (Time enter must always be smaller than time leave)
- Get the highest overlap to skip out collisions which not happens or are too late
- Time Enter is the factor used to fix the velocity.
These steps are implemented a simple JSFiddle demo i have written to visualize the entire process, see here:
It would be really great if you can help me to fix these problems.