在3D遊戲中常對『3D模型』進行多邊形『碰撞檢測』.例如武器擊中『牆體』或『怪物』.最容易最常用是『邊界球』進『碰撞檢測』.每個『邊界球』均由3D模型『中心點』與『半徑』. 這『半徑』並不一定是最長半徑,通常這個值只包裹核心部分.定義3D球體:
typedef struct SPHERE3D_TYP{
float x, y, z;// 中心點
float radius;// 球體半徑
}SPHERE3D,* SPHERE3D_PTR;
『3D模型』最大半徑與平均平徑可遍歷所有頂點而取得:
1.模型半徑前設為零
radius_avg = 0;// 平均半徑
radius_max = 0;// 最大半徑
2.遍歷3D模型所有頂點
for (int index = 0; index < vertex_num; ++index)
{
3.計算3D頂點與中心距離
float dist = (float)sqrt(vertex_array[index].x*vertex_array[index].x +
vertex_array[index].y*vertex_array[index].y +
vertex_array[index].z *vertex_array[index].z);
4.累加半徑
radius_avg = radius_avg + dist;
5.求得最大半徑
if (dist > radius_max)
radius_max = dist;
}
6.計算平均半徑
radius_avg = radius_avg / vertex_num;
要對兩『邊界球』進行『碰撞檢測』只需求得兩『邊界球』之距,然後與兩『邊界球』半徑之和進行比較:
bool Compute_Sphere3D_In_Sphere3D(SPHERE3D_PTR sphereA, SPHERE3D_PTR sphereB)
{1.計算兩頂點XYZ分量距離
float x = sphereA->x – sphereB->x;
float y = sphereA->y – sphereB->y;
float z = sphereA->z – sphereB->z;
2.球體距離
float dist = sqrtf(x*x + y * y + z * z);
3.半徑之和進行比較
if (dist < (sphereA->radius + sphereB->radius))
return true;// 球體重疊/碰撞
else
return false;//
}