2013-05-14 1 views
0

내 OpenGL 응용 프로그램에 충돌을 만들려고합니다.OpenGL의 3D 충돌

나는 성공적으로 내 카메라 내 플랫폼 객체의 안쪽에 있을지 어떨지를 테스트 코드가 있습니다

void checkInsidePlatform() 
{ 
float halfW = gymPlatform -> getW()/2; 
float Height = gymPlatform -> getH(); 
float halfD = gymPlatform -> getD()/2; 
float platformRight = gymPlatform -> getX() + halfW + 1; 
float platformTop = gymPlatform -> getY() + Height + 1; 
float platformFront = gymPlatform -> getZ() - halfD - 1; 

if(testPlatformCollision()) 
{ 
    //Below code doesnt work (NEED HELP HERE) 
    if(myCamera -> curPos -> x < platformRight) 
    { 
     myCamera -> curPos -> platformRight; 
    } 
    if(myCamera -> curPos -> z > platformFront) 
    { 
     myCamera -> curPos -> platformFront; 
    } 
    if(myCamera -> curPos -> y < platformTop) 
    { 
     myCamera -> curPos -> platformTop; 
    } 
} 
} 

bool testPlatformCollision() 
{ 
float halfW = gymPlatform -> getW()/2; 
float Height = gymPlatform -> getH(); 
float halfD = gymPlatform -> getD()/2; 
float platformLeft = gymPlatform -> getX() - halfW - 1; 
float platformRight = gymPlatform -> getX() + halfW + 1; 
float platformTop = gymPlatform -> getY() + Height + 1; 
float platformFront = gymPlatform -> getZ() - halfD - 1; 
float platformBack = gymPlatform -> getZ() + halfD + 1; 

if((myCamera -> curPos -> x > platformLeft) && (myCamera -> curPos -> x < platformRight)) 
{ 
    if((myCamera -> curPos -> z > platformFront) && (myCamera -> curPos -> z < platformBack)) 
    { 
     if(myCamera -> curPos -> y < platformTop) 
     { 
      return true; 
     } 
    } 
} 

return false; 
} 

을하지만 지금은 갇혔어요. 안쪽으로 들어가면 카메라를 플랫폼 밖으로 옮기는 방법을 모르겠습니다. 카메라가 플랫폼 안에 있으면 3 가지 테스트가 모두 수행됩니다.

답변

2

충돌 해결을 수행해야합니다. 충돌 해결은 충돌을 해결하는 작업이며, 부울 IsColliding 함수를 수행하는 것보다 훨씬 복잡합니다.

검색 할 추가 정보 : 분리 축 검사 (SAT). AABB를 다루고 있기 때문에 (아마) 카메라를 바깥으로 움직이는 단순한 해상도를 아주 쉽게 조합 할 수 있습니다.

다음은 간단한 설명입니다. 카메라가 상자 바깥에 있도록 이동해야하는 방향을 찾습니다. 이 방향은 바깥으로 이동할 수있는 최단 경로 여야합니다. 이동할 거리를 찾은 다음 해당 이동 작업을 수행하십시오.

물론 실제 구현은 좀 더 복잡해집니다.

+1

RandyGaul의 위대한 답변에 작은 추가. 또한 플랫폼의 중심을 미리 계산할 수 있습니다. 그런 다음 (camera-> pos-platform-> pos) 절대 가장 큰 구성 요소 (x, y 또는 z)를 찾아 해당 축에서 카메라를 멀리 이동하십시오. – Trax

+0

완벽! 훌륭하게 작동합니다. 고마워! – Split