2.
struct AABB
{
D3DXVECTOR3 minPt;
D3DXVECTOR3 maxPt;
};
D3DXVECTOR3 billPts[4];
...
AABB bb;
bb.minPt = D3DXVECTOR3(FLT_MAX, FLT_MAX, FLT_MAX);
bb.maxPt = D3DXVECTOR3(FLT_MIN, FLT_MIN, FLT_MIN);
for(int i = 0; i < 4; ++i)
{
// check min
if(bb.minPt.x > billPts.x) bb.minPt.x = billPts.x;
if(bb.minPt.y > billPts.y) bb.minPt.y = billPts.y;
if(bb.minPt.z > billPts.z) bb.minPt.z = billPts.z;
// check max
if(bb.maxPt.x < billPts.x) bb.maxPt.x = billPts.x;
if(bb.maxPt.y < billPts.y) bb.maxPt.y = billPts.y;
if(bb.maxPt.z < billPts.z) bb.maxPt.z = billPts.z;
}
3.
struct _Plane
{
float nx;
float ny;
float nz;
float d;
};
_Plane PlaneFromPointNormal(const D3DXVECTOR3 &Pt, const D3DXVECTOR3 &Normal)
{
_Plane Result;
D3DXVECTOR3 NormalizedNormal;
D3DXVec3Normalize(&NormalizedNormal, &Normal);
Result.nx = NormalizedNormal.x;
Result.ny = NormalizedNormal.y;
Result.nz = NormalizedNormal.z;
Result.d = -D3DXVec3Dot(&Pt, &NormalizedNormal);
return Result;
}
std::array<_Plane, 6> ExtractPlanesFromBBox(const AABB* bb)
{
std::array<_Plane, 6> out;
D3DXVECTOR3 center = (bb->maxPt + bb->minPt) * 0.5f;
D3DXVECTOR3 extent = (bb->maxPt - bb->minPt) * 0.5f;
// up
D3DXVECTOR3 ptUp = center + D3DXVECTOR3(0.0f, extent.y, 0.0f);
D3DXVECTOR3 nrmUp = center - ptUp;
out[0] = PlaneFromPointNormal(ptUp, nrmUp);
// down
D3DXVECTOR3 ptDown = center + D3DXVECTOR3(0.0f, -extent.y, 0.0f);
D3DXVECTOR3 nrmDown = center - ptDown;
out[1] = PlaneFromPointNormal(ptDown, nrmDown);
// left
D3DXVECTOR3 ptLeft = center + D3DXVECTOR3(-extent.x, 0.0f, 0.0f);
D3DXVECTOR3 nrmLeft = center - ptLeft;
out[2] = PlaneFromPointNormal(ptLeft, nrmLeft);
// right
D3DXVECTOR3 ptRight = center + D3DXVECTOR3(extent.x, 0.0f, 0.0f);
D3DXVECTOR3 nrmRight = center - ptRight;
out[3] = PlaneFromPointNormal(ptRight, nrmRight);
// back
D3DXVECTOR3 ptBack = center + D3DXVECTOR3(0.0f, 0.0f, -extent.z);
D3DXVECTOR3 nrmBack = center - ptBack;
out[4] = PlaneFromPointNormal(ptBack, nrmBack);
// front
D3DXVECTOR3 ptFront = center + D3DXVECTOR3(0.0f, 0.0f, extent.z);
D3DXVECTOR3 nrmFront = center - ptFront;
out[5] = PlaneFromPointNormal(ptFront, nrmFront);
return out;
}
You'll need this also:
// plane - point relationship
float PlaneDotCoord(const _Plane* p, const D3DXVECTOR3* c)
{
return ( (p->nx) * (c->x) + (p->ny) * (c->y) + (p->nz) * (c->z) + (p->d) );
}
result > 0 - in front of plane
result < 0 - back of plane
result == 0 - on plane
Happy copy/pasting.