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:
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.