Good afternoon people of Game Dev.
For the past several days now I have been trying to implement the GJK algorithm for my 2D game with no avail. I fully understand the concept behind the algorithm and theoretically implementing it. But I believe my problems lie elsewhere: lacking knowledge and experience with vectors(resulting in bad calculation), Win32 API(Inverted coordinate), multiple resources whose implementation of the algorithm greatly varies, etc.
Nevertheless, I'd appreciate it if someone could look at my code and tell me what I'm doing wrong. I believe the problem lies with me failing to find the correct perpendicular vectors of an edge. I've tried various methods of calculations: perpAB = ABxACxAC, ABxAOxAB. and the last method, posted in the code below, with no conclusive result. I've tried just using the normal/perpendicular, being that for now I'm attempt to implement it in 2D.
The brunt of the Code:
bool SMYGJK::gjk_work( SmyPoint & D, SmyPoint simplex[], int & count )
{
SmyPoint a = simplex[count-1]; // point a, the newest point added to the simplex
SmyPoint b = simplex[0]; // point b
SmyPoint origin = -a; // ao(direction towards origin) = origin(0,0) - a which equals -a
SmyPoint ab = b - a; // edge ab( vector between a and b )
if( count == 2 )// simplex-1( line )
{
SmyPoint abp = ab.normal();
// Find ab perp in direction of the origin
if( abp.dot( origin ) < 0 )
abp.negate();
D = abp; // change the direction to where a new point should be located
}
else
if( count == 3 )//simplex-2(triangle)
{
SmyPoint c = simplex[1];
SmyPoint ac = c - a;
SmyPoint abp = ab.normal(); // possible new search direction if collision not found
if( abp.dot( c ) >= 0 ) // Check other side if facing wrong way
abp.negate();
if( abp.dot( origin ) > 0 )
{
// remove c
count--;
simplex[0] = b;
simplex[1] = a;
D = abp; // change the direction to where a new point should be located
}
else
{
// check direction ac perp
SmyPoint acp = ac.normal();
if( acp.dot( b ) >= 0 ) // Check other side if facing wrong way
acp.negate();
if( acp.dot( origin ) <= 0 )// collision detected because not in region acperp nor abperp, thus, origin is enclosed
return true;
// remove b
count--;
simplex[0] = c;
simplex[1] = a;
D = acp; // Face direction perpendicular to edge ac
}
}
// keep building
return false;
}
Help is much appreciated. If you'd like to see the support function or function that contains the loop of the algorithm let me know.






