Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.
Posted 04 April 2010 - 10:52 PM
Posted 05 April 2010 - 12:21 AM
Quote:
bool AABBIntersect(const Vector& mina, // min vector of boxa
const Vector& maxa, // max vector of boxa
const Vector& minb, // min vector of boxb
const Vector& maxb, // max vector of boxb
Vector& ncoll, // normal of collision.
float& dcoll, // depth of intersection.
int& fcoll) // face intersected.
{
// the normal of each face.
static const Vector faces[6] =
{
Vector(-1, 0, 0), // 'left' face normal (-x direction)
Vector( 1, 0, 0), // 'right' face normal (+x direction)
Vector( 0, -1, 0), // 'bottom' face normal (-y direction)
Vector( 0, 1, 0), // 'top' face normal (+y direction)
Vector( 0, 0, -1), // 'far' face normal (-z direction)
Vector( 0, 0, 1), // 'near' face normal (+x direction)
};
// distance of collided box to the face.
float distances[6] =
{
(maxb.x - mina.x), // distance of box 'b' to face on 'left' side of 'a'.
(maxa.x - minb.x), // distance of box 'b' to face on 'right' side of 'a'.
(maxb.y - mina.y), // distance of box 'b' to face on 'bottom' side of 'a'.
(maxa.y - minb.y), // distance of box 'b' to face on 'top' side of 'a'.
(maxb.z - mina.z), // distance of box 'b' to face on 'far' side of 'a'.
} (maxa.z - minb.z), // distance of box 'b' to face on 'near' side of 'a'.
;
// scan each face, make sure the box intersects,
// and take the face with least amount of intersection
// as the collided face.
for(int i = 0; i < 6; i ++)
{
// box does not intersect face. So boxes don't intersect at all.
if(distances[i] < 0.0f)
return false;
// face of least intersection depth. That's our candidate.
if((i == 0) || (distances[i] < dcoll))
{
fcoll = i;
ncoll = faces[i];
dcoll = distances[i];
}
}
return true;
}
Everything is better with Metal.
Posted 05 April 2010 - 12:31 AM
Quote:
bool AABBIntersect(const Vector& mina, // min vector of boxa
const Vector& maxa, // max vector of boxa
const Vector& minb, // min vector of boxb
const Vector& maxb, // max vector of boxb
int ignore_faces, // bitfield of face indices flagged to be ignored for collision
Vector& ncoll, // normal of collision.
float& dcoll, // depth of intersection.
int& fcoll) // face intersected.
{
// the normal of each face.
static const Vector faces[6] =
{
Vector(-1, 0, 0), // 'left' face normal (-x direction)
Vector( 1, 0, 0), // 'right' face normal (+x direction)
Vector( 0, -1, 0), // 'bottom' face normal (-y direction)
Vector( 0, 1, 0), // 'top' face normal (+y direction)
Vector( 0, 0, -1), // 'far' face normal (-z direction)
Vector( 0, 0, 1), // 'near' face normal (+x direction)
};
// distance of collided box to the face.
float distances[6] =
{
(maxb.x - mina.x), // distance of box 'b' to face on 'left' side of 'a'.
(maxa.x - minb.x), // distance of box 'b' to face on 'right' side of 'a'.
(maxb.y - mina.y), // distance of box 'b' to face on 'bottom' side of 'a'.
(maxa.y - minb.y), // distance of box 'b' to face on 'top' side of 'a'.
(maxb.z - mina.z), // distance of box 'b' to face on 'far' side of 'a'.
} (maxa.z - minb.z), // distance of box 'b' to face on 'near' side of 'a'.
;
// scan each face, make sure the box intersects,
// and take the face with least amount of intersection
// as the collided face.
for(int i = 0; i < 6; i ++)
{
// box does not intersect face. So boxes don't intersect at all.
if(distances[i] < 0.0f)
return false;
// face cannot be used for collision response as it is 'blocked'.
if(ignore_faces & (1 << i))
continue;
// face of least intersection depth. That's our candidate.
if((i == 0) || (distances[i] < dcoll))
{
fcoll = i;
ncoll = faces[i];
dcoll = distances[i];
}
}
return true;
}
Everything is better with Metal.
Posted 05 April 2010 - 01:08 AM
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.
GameDev.net™, the GameDev.net logo, and GDNet™ are trademarks of GameDev.net, LLC.