답변:
OBB는 볼록 껍질입니다. 볼록 껍질은 표면에 "크리스탈"이없는 3D 모양입니다. 볼록 껍질의 모든 "범프"(정점)는 안쪽으로 돌출 되지 않습니다. 볼록 껍질을 통해 평면을 슬라이스하면 볼록 다각형이 하나만 생깁니다. 볼록 선체 내부에 있고 바깥 쪽을 향한 레이저를 발사하면 선체 표면을 한 번만 (두 번 이상) 뚫지 않습니다.
Separating Axis Theorem 테스트는 볼록 껍질의 충돌을 감지하는 데 사용할 수 있습니다. SAT 시험은 간단합니다. 2D와 3D에서 작동합니다. 아래 그림은 2D로 표시되지만 3D에도 쉽게 적용 할 수 있습니다.
이것이 SAT와 함께 사용하는 핵심 개념입니다.
1D 벡터에 대한 모양의 "투영"은 다음과 같습니다 ( "파쇄"라고 함).
빨간색 버텍스가있는 모양과 축
"모양을 축에 투영"이란 축에 착륙하기 위해 모양의 각 점에서 수직선을 떨어 뜨리는 것을 의미합니다. 이것을 모든 것을 모아서 축에 수직으로 으깨는 손으로 포인트를 "파쇄"하는 것으로 생각할 수 있습니다.
남은 것 : 축의 점
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 ;
}
더 많은 SAT 기사.
이 사이트의 마지막 기사는 완전한 코드와 함께 제공됩니다 .FLASH라고 생각합니다. 모릅니다.하지만 SAT를 처음 사용했을 때 C ++로 변환하는 데 정확히 0 개의 문제가 발생했습니다. 다른 언어에서도 마찬가지입니다. 추가해야 할 유일한 것은 각 계산에 변위 벡터를 저장하는 것입니다 (가장 작은 경우 SAT에 대해 배울 때 이것을 이해할 것입니다).이 자습서의 코드는 그렇게하지 않습니다. 마지막으로 계산 된 벡터로 끝납니다.
http://rocketmandevelopment.com/tag/separation-axis-theorem/
좋은 오래된 N- 게임 튜토리얼. 웹상에서 최고의 SAT 이론.