2015-01-27 2 views
1

내 그래픽 엔진에 충돌 감지 시스템을 구현하고 싶습니다.3D 공간에서 두 상자 사이의 교차점

일반적인 방법인지는 모르지만 제 생각은 3D 상자 내에서 솔리드 오브젝트 (예 : 메쉬 또는 카메라)를 바인딩하는 것이 었습니다. 그러면 3D 상자 내에서 훨씬 정확한 결과를 얻을 수있었습니다. 구체.

이 상자는 세계에 바운딩 박스를 변환 한 후 팔 개 정점

x0 = min(vertices.x)-off // parsing mesh's vertices for the minimum x 
    y0 = min(vertices.y)-off 
    z0 = min(vertices.z)-off 
    x1 = max(vertices.x)+off // off avoids 2D bounding on 2D objects 
    y1 = max(vertices.y)+off 
    z1 = max(vertices.z)+off 
    boundingBox[0] = vec3(x0, y0, z0); 
    boundingBox[1] = vec3(x0, y1, z0); 
    boundingBox[2] = vec3(x1, y0, z0); 
    boundingBox[3] = vec3(x1, y1, z0); 
    boundingBox[4] = vec3(x0, y0, z1); 
    boundingBox[5] = vec3(x0, y1, z1); 
    boundingBox[6] = vec3(x1, y0, z1); 
    boundingBox[7] = vec3(x1, y1, z1); 

에 의해 정의된다, 나는 돈을 그 두 가지 사이의 교차가 있는지 확인하는 방법을 찾고,하지만 난거야 좌표 선형 대수학으로 그것을하는 방법을 안다.

는 내가 모든 상자가 XZ 평면에 평행 있다고 확신했다 경우 단순히 이런 BOX2의 최소/최대 좌표에 대한 BOX1의 모든 정점을 확인 수 있다고 생각 :

for(int i = 0; i < 8; i++) { 
    if(box1[i].x >= box2.minX && box1[i].x <= box2.maxX) && 
     (box1[i].y >= box2.minY && box1[i].y <= box2.maxY) && 
     (box1[i].z >= box2.minZ && box1[i].z <= box2.maxZ) { 
     // collision here 
    } 
} 

를하지만이 있습니다 메쉬가 회전되었을 수 있기 때문에 작동하지 않을 것입니다. 사용할 수있는 수학 공식이 있습니까? 두 배향 경계 박스 (또는 두 개체간에 더 일반적인) 사이

+1

도움이됩니다. - http://gamedev.stackexchange.com/questions/25397/obb-vs-obb-collision-detection – raveesh

답변

2

교차로 분리 축 정리 (here, herehere)에 의해 수행 될 수있다.

오브젝트 간의 일반적인 교차 테스트의 경우 두 오브젝트가 다른 반 영역에 있고 평면이 오브젝트 중 하나와 교차하지 않도록 평면을 검색합니다. 이것의 구현은 예를 들면 Gamasutra article에서 찾을 수 있습니다.