遊戲建模之邊界球

遊戲建模之邊界球

在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;//

}

評論