2013-07-30 4 views
0

세계 좌표와 경계 상자 구조를 사용하는 알고리즘을 생성하여 두 경계 상자 간의 충돌을 이 감지하려고했습니다. 나는 정말로 내가하는 일을 모르지만, 아래 코드가 효과가 있다고 생각했다. 내 문제는 경계 상자가 정확히 동일한 x, y, z 위치에있는 경우에만 충돌을 감지한다는 것입니다. 내가 비교하고축 정렬 경계 상자 충돌 감지 문제

BOOL AABB::isCollidedWith(AABB* bb) 
{ 
if(bb == NULL) return FALSE; 

float radX1,radX2; 
float radY1,radY2; 
float radZ1,radZ2; 

float arr[12]; 

     //please note that all the mins are set to 0 
     //and all the maxes are set to 1 

radX1 = (bb->maxX - bb->minX)/2; 
radX2 = (this->maxX - this->minX)/2; 
radY1 = (bb->maxY - bb->minY)/2; 
radY2 = (this->maxY - this->minY)/2; 
radZ1 = (bb->maxZ - bb->minZ)/2; 
radZ2 = (this->maxZ - this->minZ)/2; 

//bb coords 

arr[1] = bb->bbX - radX1; 
arr[2] = bb->bbX + radX1; 
arr[3] = bb->bbY - radY1; 
arr[4] = bb->bbY + radY1; 
arr[5] = bb->bbZ - radZ1; 
arr[6] = bb->bbZ + radZ1; 

//this coords 
arr[7] = this->bbX - radX2; 
arr[8] = this->bbX + radX2; 
arr[9] = this->bbY - radY2; 
arr[10] = this->bbY + radY2; 
arr[11] = this->bbZ - radZ2; 
arr[12] = this->bbZ + radZ2; 

if(arr[2] >= arr[7] && arr[1] <= arr[8]) 
{ 
    if(arr[4] >= arr[9] && arr[3] <= arr[10]) 
    { 
     if(arr[6] >= arr[11] && arr[5] <= arr[12]) 
     { 
      this->collided = TRUE; 
      OutputDebugStringA("Collided!\n"); 
      return TRUE; 
     } 
    } 
} 
} 

구조 :

AABB* aabb1 = new AABB(0.0f,0.0f,0.0f,1.0f,1.0f,1.0f,0.0f,0.0f,0.0f); 
AABB* aabb2 = new AABB(0.0f,0.0f,0.0f,1.0f,1.0f,1.0f,0.0f,0.0f,0.0f); 
aabb2->isCollidedWith(aabb1); 

생성자 조각 : 또한 마지막 세 개의 매개 변수는 X, Y, 경계 상자

AABB::AABB(float minx,float maxx,float miny,float maxy,float minz,float maxz,float x,float y,float z) 
{ 
this->minX = minx; 
this->maxX = maxx; 
this->minY = miny; 
this->maxY = maxy; 
this->minZ = minz; 
this->maxZ = maxz; 

어떤을의 Z 코드를 지시 있습니다 도움, 비판 또는 조언이 도움이 될 것입니다.

+1

작동하는 충돌과 작동하지 않는 충돌의 예를 들려 줄 수 있습니까? – Xymostech

+0

AABB * aabb1 = 새로운 AABB (0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f) AABB * aabb2 = 새로운 AABB (0.0f, 0.0f, 0.0f , 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f)가 작동합니다. –

+0

AABB * aabb1 = 새로운 AABB (0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f) AABB * aabb2 = 새로운 AABB (0.0f, 0.0f, 0.0f , 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f)가 작동하지 않습니다. –

답변

0

minX = 0.0 및 maxX = 0.0 인 상자를 만들 때 radox = 0이기 때문에 상자가 충돌하기 위해서는 bbX 좌표가 동일해야합니다. minZ = maxZ = 1.0에서도 마찬가지입니다.

주 생성자에서 매개 변수의 순서 : 그것은 minX, maxX, minY, maxY, minZ, maxZ아니에요minX, minY, minZ, maxX, maxY, maxZ (내가 두 번째 순서를 가정하고 1.0 × 1.0 × 1.0 크기의 상자를 정의하고 싶었 추측).

+0

관찰에 감사드립니다! 그것은 그 후 잘 작동했습니다. –

0

간단한 오류! 매개 변수가 나열된 방식을 무시하여 문제가 발생했습니다. 또한 배열 "arr"의 각 멤버에서 0.5를 뺀 것을 AABB의 중심을 찾습니다.