OBB 대 OBB 충돌 감지


20

상자의 현재 정점을 벡터에 저장하는 두 개의 경계 상자 객체가 있다고 가정하고, 객체의 모든 정점이 회전하고 공통 축을 기준으로 변환됩니다.

내 문제를 설명하는 이미지는 다음과 같습니다.

두 OBB가 문제에 대한 해결책을 설명하는 데 도움이되는 링크와 겹치는 지 어떻게 해결할 수 있습니까? 너무 복잡한 것은 없습니다.

답변:


16

OBB는 볼록 껍질입니다. 볼록 껍질은 표면에 "크리스탈"이없는 3D 모양입니다. 볼록 껍질의 모든 "범프"(정점)는 안쪽으로 돌출 되지 않습니다. 볼록 껍질을 통해 평면을 슬라이스하면 볼록 다각형이 하나만 생깁니다. 볼록 선체 내부에 있고 바깥 쪽을 향한 레이저를 발사하면 선체 표면을 한 번만 (두 번 이상) 뚫지 않습니다.

Separating Axis Theorem 테스트는 볼록 껍질의 충돌을 감지하는 데 사용할 수 있습니다. SAT 시험은 간단합니다. 2D와 3D에서 작동합니다. 아래 그림은 2D로 표시되지만 3D에도 쉽게 적용 할 수 있습니다.

개념

이것이 SAT와 함께 사용하는 핵심 개념입니다.

  • 두 셰이프는 두 셰이프의 모든 법선 축에 "투사"될 때 겹치는 경우에만 교차합니다 .

1D 벡터에 대한 모양의 "투영"은 다음과 같습니다 ( "파쇄"라고 함).

빨간색 버텍스가있는 모양과 축

여기에 이미지 설명을 입력하십시오

"모양을 축에 투영"이란 축에 착륙하기 위해 모양의 각 점에서 수직선을 떨어 뜨리는 것을 의미합니다. 이것을 모든 것을 모아서 축에 수직으로 으깨는 손으로 포인트를 "파쇄"하는 것으로 생각할 수 있습니다.

여기에 이미지 설명을 입력하십시오

남은 것 : 축의 점

여기에 이미지 설명을 입력하십시오

SAT는 말합니다 :

2 개의 볼록 선체가 교차하려면 모든 축 에서 겹쳐 야합니다 ( 두 모양의 모든 법선이 확인해야하는 축으로 계산 됨).

이 두 가지 모양을 취하십시오.

여기에 이미지 설명을 입력하십시오

교차하지 않는 것을 볼 수 있으므로 몇 개의 축을 사용하여 겹침 발생 하지 않았 음 을 보여 드리겠습니다.

오각형의 최고 법선을 시도 :

여기에 이미지 설명을 입력하십시오

이것들은 범위입니다. 그들은 겹칩니다.

여기에 이미지 설명을 입력하십시오

사각형의 왼쪽을보십시오. 이제이 축에서 겹치지 않으므로 간섭이 없습니다.

여기에 이미지 설명을 입력하십시오

연산:

각각에 대해 정상적인 얼굴 모두 모양에 :

  • 두 축의 모든 정점 코너 포인트 가 해당 축에 투영되는 최소 및 최대 범위 (최소 및 최소값)를 찾습니다.
  • 겹치지 않으면 교차점이 없습니다 .

그게 다야. SAT가 작동하도록하는 코드는 매우 짧고 간단합니다.

다음은 SAT 축 투영을 수행하는 방법을 보여주는 코드입니다.

void SATtest( const Vector3f& axis, const vector<Vector3f>& ptSet, float& minAlong, float& maxAlong )
{
  minAlong=HUGE, maxAlong=-HUGE;
  for( int i = 0 ; i < ptSet.size() ; i++ )
  {
    // just dot it to get the min/max along this axis.
    float dotVal = ptSet[i].dot( axis ) ;
    if( dotVal < minAlong )  minAlong=dotVal;
    if( dotVal > maxAlong )  maxAlong=dotVal;
  }
}

전화 코드 :

// Shape1 and Shape2 must be CONVEX HULLS
bool intersects( Shape shape1, Shape shape2 )
{
  // Get the normals for one of the shapes,
  for( int i = 0 ; i < shape1.normals.size() ; i++ )
  {
    float shape1Min, shape1Max, shape2Min, shape2Max ;
    SATtest( normals[i], shape1.corners, shape1Min, shape1Max ) ;
    SATtest( normals[i], shape2.corners, shape2Min, shape2Max ) ;
    if( !overlaps( shape1Min, shape1Max, shape2Min, shape2Max ) )
    {
      return 0 ; // NO INTERSECTION
    }

    // otherwise, go on with the next test
  }

  // TEST SHAPE2.normals as well

  // if overlap occurred in ALL AXES, then they do intersect
  return 1 ;
}

bool overlaps( float min1, float max1, float min2, float max2 )
{
  return isBetweenOrdered( min2, min1, max1 ) || isBetweenOrdered( min1, min2, max2 ) ;
}

inline bool isBetweenOrdered( float val, float lowerBound, float upperBound ) {
  return lowerBound <= val && val <= upperBound ;
}

Hullinator 는 볼록 껍질에 대한 SAT 테스트를 구현합니다.
bobobobo

대단한 설명! 감사. 난 당신이 줄에 오타가있을 수 있습니다 생각한다, 당신은 그들이 어디에 예제를 제공하기 위해 진행하기 때문에 "그래서 중복이 발생하지 않습니다했다 쇼 몇 가지 축을 시도 할 수 있습니다." 겹치는. 다시 감사합니다!

법선의 모든 교차 곱에 대해서도 테스트를 수행 할 필요가 없습니까? 이 기사 geometrictools.com/Documentation/DynamicCollisionDetection.pdf에 나와 있습니다.
iNFINITEi

이 SAT의 특정 방법은 2D에서만 작동한다고 말할 가치가 있습니다. 3D에서는 각면의 법선 이상의 것을 가져와야합니다. 그러나 올바른 법선이 있으면 나머지 프로세스 (프로젝트, 비교)는 정확히 같습니다.
Fund Monica의 소송

2D 사진에서 화살표가 어떤 방향으로 가고 있는지 말하기는 정말 어렵습니다.
WDUK

7

축 정리 정리를 찾아야합니다 . 볼록한 물체를위한 것입니다. "두 개의 볼록한 물체가 교차하지 않으면이 두 물체의 투영이 교차하지 않는 평면이 있습니다"라는 규칙이 있습니다.

위키 에서 몇 가지 예를 찾을 수 있습니다 . 그러나 귀하의 경우보다 조금 더 복잡합니다.

귀하의 문제에 더 적합한 것이 여기 에서 찾을 수 있습니다 (두 대의 자동차 충돌).


1

더 많은 SAT 기사.

이 사이트의 마지막 기사는 완전한 코드와 함께 제공됩니다 .FLASH라고 생각합니다. 모릅니다.하지만 SAT를 처음 사용했을 때 C ++로 변환하는 데 정확히 0 개의 문제가 발생했습니다. 다른 언어에서도 마찬가지입니다. 추가해야 할 유일한 것은 각 계산에 변위 벡터를 저장하는 것입니다 (가장 작은 경우 SAT에 대해 배울 때 이것을 이해할 것입니다).이 자습서의 코드는 그렇게하지 않습니다. 마지막으로 계산 된 벡터로 끝납니다.

http://rocketmandevelopment.com/tag/separation-axis-theorem/

좋은 오래된 N- 게임 튜토리얼. 웹상에서 최고의 SAT 이론.

http://www.metanetsoftware.com/technique/tutorialA.html


아무도 모든 필수 클래스와 함께 전체 작업 소스를 게시하는 것은 너무 자극적입니다. 그의 코드를 내 데모로 이식했지만 작동하지 않습니다. :( 누군가 그것을 디버깅 할 수 있다면 지금까지 내 프로젝트입니다. link
Joshua Barnett

작동하지 않는다는 것은 무엇을 의미합니까? 정점을 저장하는 방법, 직교 좌표계에있는 이미지, 정점에 대한 벡터로 정점을 저장하는 자습서에주의를 기울이십시오 (자신의 정점에서 중심을 빼기 만하면됩니다. 그가 자신의 꼭짓점을 수정하는 선을 제거하십시오), 직접 만들 수있는 도트 제품과 같은 기능, 그에 대한 안내서가 필요하지 않으며, 휴식을 취해야합니다.
dreta

이것이 내가 그것을 구현 한 방법입니다 : SAT.as , Shape2D.as , 중심은 무엇을 의미합니까? (x, y)와 같은 다각형의 중심?
Joshua Barnett

현재 getOBB () 함수를 사용하여 원본 이미지에 설명 된대로 정점을 반환합니다. 이것은 모양의 정점, 각도 변수 및 위치 변수를 포함하는 Vector <b2Vec2>에서 계산됩니다.
Joshua Barnett

예, 중심,이 사람이 다각형을 만드는 방법은 중심, idk AS3에서 오프셋을 제공하는 것입니다. 그러나 점 제품을 계산할 때 정점에서 정점을 빼려고 할 때 정점을 그대로 투영하는 것을 볼 수 있습니다 (벡터 subraction ), 옆에 어떤 분리 벡터가 여전히 가장 작은 지 확인하지 않고 마지막 계산 된 것만 저장합니다
dreta
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.