两个AABB的相交性检测
检测两个静止AABB的相交性是很简单的,只需要在每一维上单独检查它们的重合程度即可。如果在所有维上都没有重合,那么这两个AABB就不会相交。intersectAABBs()就是用这项技术来实现的。
01 |
//--------------------------------------------------------------------------- |
02 |
// Check if two AABBs intersect, and return true if so. Optionally return |
03 |
// the AABB of their intersection if an intersection is detected. |
04 |
//--------------------------------------------------------------------------- |
05 |
bool intersectAABBs( const AABB3& box1, const AABB3& box2, AABB3* boxIntersect) |
06 |
{ |
07 |
// Check for no overlap |
08 |
if (box1.min.x > box2.max.x) return false ; |
09 |
if (box1.max.x < box2.min.x) return false ; |
10 |
if (box1.min.y > box2.max.y) return false ; |
11 |
if (box1.max.y < box2.min.y) return false ; |
12 |
if (box1.min.z > box2.max.z) return false ; |
13 |
if (box1.max.z < box2.min.z) return false ; |
14 |
|
15 |
// We have overlap. Compute AABB of intersection, if they want it. |
16 |
if (boxIntersect != NULL) |
17 |
{ |
18 |
boxIntersect->min.x = max(box1.min.x, box2.min.x); |
19 |
boxIntersect->max.x = min(box1.max.x, box2.max.x); |
20 |
boxIntersect->min.y = max(box1.min.y, box2.min.y); |
21 |
boxIntersect->max.y = min(box1.max.y, box2.max.y); |
22 |
boxIntersect->min.z = max(box1.min.z, box2.min.z); |
23 |
boxIntersect->max.z = min(box1.max.z, box2.max.z); |
24 |
} |
25 |
|
26 |
return true ; |
27 |