Hi, I'm currently implementing SAT collision detection for my game using SAT, which correctly returns true when there is a collision and false when there is isn't. However, I want to extend the code to return the MTV but I'm having difficulties trying to return the correct value. Below is the code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| ArrayList<Vector2f> playerV = new ArrayList<Vector2f>(); ArrayList<Vector2f> shape2V = new ArrayList<Vector2f>();
float playerMin = 0; float playerMax = playerMin; float shapeMin = 0; float shapeMax = shapeMin; Vector2f shapeNormal = new Vector2f(0,0); for(int j = playerV.size()-1, i = 0; i < playerV.size(); j = i, i++){ Vector2f playerCorner1 = new Vector2f(playerV.get(j)); Vector2f playerCorner2 = new Vector2f(playerV.get(i)); Vector2f shapeCorner1 = new Vector2f(shape2V.get(j)); Vector2f shapeCorner2 = new Vector2f(shape2V.get(i)); Vector2f playerNormal = new Vector2f (playerCorner2.sub(playerCorner1).getPerpendicular().normalise()); playerMin = playerV.get(0).dot(playerNormal); playerMax = playerMin; for(int v = 0; v < playerV.size(); v++){ float dot = playerV.get(v).dot(playerNormal); if(dot < playerMin){ playerMin = dot; }else if(dot > playerMax){ playerMax = dot; } } for(int u = 0; u < shape2V.size(); u++){ float dot = shape2V.get(u).dot(playerNormal); if(dot < shapeMin){ shapeMin = dot; }else if(dot > shapeMax){ shapeMax = dot; } } if(playerMin > shapeMax || shapeMin > playerMax){ return false; }else{ copyaxis = playerNormal; } } mtv.set((shapeMax-playerMin) *-copyaxis.x ,(shapeMax-playerMin)*-copyaxis.y); return true; } |
What would be the best way to calculate the MTV? This was the recourse that I had used
http://rocketmandevelopment.com/2010/05/19/separation-of-axis-theorem-for-collision-detection/ , but the method used to calculate the MTV is giving odd results. The mtv returned with the method described in the article always returns a 0 value for the x part of the mtv, for example: (0.0,59.0). This does make sense since the normalized vector for the axis being tested is something like (0,1) on collision.