2011년 12월 10일 토요일

AABB와 평면 교차 ( Intersecting AABB and plane )


AABB에는 4개의 대각선이 존재
중점 C을 지니고 각 꼭지점을 이어서 나온 대각선들

먼저 충돌 검출할 평면의 n과 가장 평행한 대각선을 찾음
그러면 대각선의 양 끝점 vmin, vmax를 찾게 됨



v를 평면 방정식에 대입하여 위치를 판단한다.
n • v + d = 0
1. 두 점의 결과가 양의 영역에 있다면 평면의 바깥쪽에 AABB가 있음
2. 두 점의 결과가 음의 영역에 있다면 평면의 안쪽에 AABB가 있음
3. 두 점의 결과가 다른 경우 평면과 교차함

int CollisionAABBPlane(const D3DXVECTOR3* pMin, const D3DXVECTOR3* pMax, const D3DXPLANE& p)
{
 D3DXVECTOR3 NewMin, NewMax;

 for( int i=0; i<3; ++i)
 {
  if( p[i] >= 0)
  {
   NewMin[i] = pMin[i];
   NewMax[i] = pMax[i];
  }
  else
  {
   NewMin[i] = pMax[i];
   NewMax[i] = pMin[i];
  }
 }

 if( D3DXPlaneDotCoord(&p, &NewMin) > 0 )
 {
  return FRONT; 
 }

 if( D3DXPlaneDotCoord(&p, &NewMax) < 0 )
 {
  return BACK; 
 }

 return INTERSECT;
}




참고 자료: Real- Time Rendering 2판

댓글 없음:

댓글 쓰기