컴퓨터 공학

4.2.1 AABB-AABB 교차

혼새미로 2015. 11. 26. 02:52
반응형

AABB의 겹침 검사는 표현방식에 상관없이 간단하다. 두개의 AABB는 세개의 축으로 그들의 차원에 따른 크기에 일치하는 축으로 겹침이 이루어진다. 최소-최고점 표현에서는 이 간격의 겹침검사가 된다:

int TestAABBAABB(AABB a,AABB b)

{

if(a.max[0]<b.min[0]||a.min[0]>b.max[0]) return 0;

if(a.max[1]<b.min[1]||a.min[1]>b.max[1]) return 0;

if(a.max[2]<b.min[2]||a.min[2]>b.max[2]) return 0;

return 1;

}

  최소-길일 표현방식은 덜 매력적이다. 이것의 겹침 검사는, 심지어 경제적으로 쓰여도, 첫번째 검사가 행해진다. :

int TestAABBAABB(AABB a,AABB b)

{

float t;

if((t=a.min[0]-b.min[0])>b.d[0]||-t>a.d[0]) return 0;

if((t=a.min[1]-b.min[1])>b.d[1]||-t>a.d[1]) return 0;

if((t=a.min[2]-b.min[2])>b.d[2]||-t>a.d[2]) return 0;

return 1;

}

마지막으로, 중심-반지름 표현 결과값은 다음 겹침검사를 한다:

int TestAABBAABB(AABB a,AABB b)

{

if(Abs(a.c[0]-b.c[0])>(a.r[0]+b.r[0])) return 0;

if(Abs(a.c[1]-b.c[1])>(a.r[1]+b.r[1])) return 0;

if(Abs(a.c[2]-b.c[2])>(a.r[2]+b.r[2])) return 0;

return 1;

}

  요즘에는, Abs()는 일반적으로 단일하게 설명되어진다. AABB 공간이 플로트 대신 인티저로 선언되었을때, 중심-반지름 표현방식은 다음 방식으로 대체될수 있다. 인티저와, [A,B]의 범위와 [C,D]의 위치 사이의 겹침은 다음 표현으로 결정된다.

 

overlap = (unsigned int)(B-C) <=(B-A)+(D-C);

 

  C>B에서 언더플로우에 의해, 매우 큰값을 갖게 되며, 렌더링에 실패한다. 강제적인 오버플로우는 절대값함수의 호출로써 대체될수있고, 중심-반지름 표현방식의 테스트는 다음과같이 쓰여진다.:

 

int TestAABBAABB(AABB a,AABB b)

{

int r;

r=a.r[0]+b.r[0]; if((unsigned int)(a.c[0]-b.c[0]+r)>r+r) return 0;

r=a.r[1]+b.r[1]; if((unsigned int)(a.c[1]-b.c[1]+r)>r+r) return 0;

r=a.r[2] + b.r[2]; if((unsigned int)(a.c[2]-b.c[2]+r)>r+r) return 0;

return 1;

}

 인티저 사용은 다른 트릭을 허용하며, 많은 것들이 아키텍처에 의존적이다. SIMD 관한 설명은, 있는 경우, 일반적으로  AABB 검사는 의미있는 몇줄의 코드로 실행된다.(13장에서 예가 있음) 

반응형

'컴퓨터 공학' 카테고리의 다른 글

4.2.3 객체 경계 구로부터의 AABB  (0) 2015.11.26
4.2.2 계산 및 갱신 AABB  (0) 2015.11.26
4.2 AABB  (0) 2015.11.26
4.1 바람직한 경계용량의 특징들  (0) 2015.11.26
경계 용량  (0) 2015.11.26