『邊界球』雖然可解卻大部3D模型『碰撞測試』問題.單若3D模型是長條形則不適合如『牆體』『長劍』.『軸對齊坐標邊界盒』axis-aligned bounding box(AABB)引入則可解決這類問題.每個『邊界盒』均由3D模型『中心點』與『最遠點』、『最近點』所組成.通過遍歷每個3D模型頂點找出XYZ三軸上最遠頂點.定義3D邊界盒:
typedef struct AABB_TYP {
VECTOR3D center;// 中心點
VECTOR3D far;// 最遠
VECTOR3D near;// 最近
}AABB, *AABB_PTR;
『3D模型』最遠點與最近點可遍歷所有3D模型頂點獲得:
1.最遠點與最近點清零
VECTOR3D far = {0,0,0};// 最遠點
VECTOR3D near = {0,0,0};// 最近點
2.遍歷所有3D頂點
for (int index = 0; index < vertex_num; ++index){
3.XYZ三軸最遠點
if (far.x > vertex_array[index].x)
vertex_array[index].x = far.x;
if (far.y > vertex_array[index].y)
vertex_array[index].y = far.y;
if (far.z > vertex_array[index].z)
vertex_array[index].z = far.z;
4.XYZ三軸最近點
if (near.x > vertex_array[index].x)
vertex_array[index].x = near.x;
if (near.y > vertex_array[index].y)
vertex_array[index].y = near.y;
if (near.z > vertex_array[index].z)
vertex_array[index].z = near.z;
}
判斷頂點是否為於邊界盒
bool Compute_Point_In_AABB(AABB_PTR aabb, VECTOR3D_PTR point)
{
if ((point->x >= aabb->center.x + aabb->near.x && point->x <= aabb->center.x + aabb->far.x) &&
(point->y >= aabb->center.y + aabb->near.y && point->y <= aabb->center.y + aabb->far.y) &&
(point->z >= aabb->center.z + aabb->near.z && point->z <= aabb->center.z + aabb->far.z) )
return true;
return false;
}