Game Development Reference

In-Depth Information

vRelativeVelocity = v1 - v2;

Vrn = vRelativeVelocity * vCollisionNormal;

if( ArePointsEqual(vList1[i],

vList2[j]) &&

(Vrn < 0.0) )

haveNodeNode = true;

}

}

This comparison makes a call to another new function,
ArePointsEqual
:

if( ArePointsEqual(vList1[i],

vList2[j]) &&

(Vrn < 0.0) )

haveNodeNode = true;

ArePointsEqual
simply checks to see if the points are within a specified distance from

each other, as shown here:

bool ArePointsEqual(Vector p1, Vector p2)

{

// Points are equal if each component is within ctol of each other

if( (fabs(p1.x - p2.x) <= ctol) &&

(fabs(p1.y - p2.y) <= ctol) &&

(fabs(p1.z - p2.z) <= ctol) )

return true;

else

return false;

}

Within the nested
for
loops of the vertex-vertex check, we perform a number of im‐

portant calculations to determine the collision normal vector and relative velocity that

are required for collision response.

First, we calculate the collision point, which is simply the coordinates of a vertex that is

involved in the collision. Note that this point will be in global coordinates, so it will have

to be converted to local coordinates for each hovercraft in order to be useful for collision

response. Here's how that's done:

vCollisionPoint = vList1[i];

body1->vCollisionPoint = vCollisionPoint −

body1->vPosition;

body2->vCollisionPoint = vCollisionPoint −

body2->vPosition;

The second calculation is aimed at determining the collision normal vector, which for

vertex-vertex collisions we've assumed is along the line connecting the centers of gravity