컴퓨터 공학

4.2.6 회전된 AABB로부터 재계산된 AABB

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

4개의 축조정 방식은 회전된 AABB를 새로운 AABB로 감싸는 방법이 가장 간단하다. 이방법은 AABB보다 간단하다. 처음 AABB보다 거대해진 AABB는 로컬공간의 원점의 회전으로부터 계산된 AABB는 중요하다. 아니면, AABB는 점점 커지면서 이전시간으로 돌아가면서 회전된 AABB를 반복적으로 계산한다. AABB의 A는 회전행렬 M에 의해 영향을 받으며 OBB의 A'의 결과를 갖는다.

  회전행렬의 3개의 열(또는 행, 행렬에 따라 다름)은 로컬좌표 프레임에서 A'의 월드좌표축으로 반환한다.(벡터가 열벡터이고, 오른쪽 행렬에 곱해지면,M의 열은 축이다. 만약 벡터가 왼쪽행렬에 행벡터로 곱해지면 M의행은 축이다.) A는 최소-최고점 표현방식이고, M은 열행렬이라고 치자. 월드좌표축으로의 A'의 회전된 8개의 정점의 투영행렬에 의한 규모간격 형태에 의해 구체화된 경계 A'의 AABB의 B. B의 규모 x는 M행렬이 주는 열벡터의 x요소와 같다. 그러므로, M의 행과 같은 최소-최고점을 만드는 정점을 찾아야 한다. 각각의 B의 정점은 A로부터의 최소,최고점을 변형하는 세개의 결합이다. 최소규모값은 가장 작은 거리의 합이고, 최고규모는 가정 거대한 거리의 합이다. 번역은 새로운 경계상자의 크기 계산에 영향을 끼치지 않는다. 그리고 추가 될수 있다. 예를 들어 최고점 규모의  x축은 이렇게 계산될 수 있다.

B.max[0]=max(m[0][0]*A.min[0],m[0][0]*A.max[0])

+ max(m[0][1]*A.min[1],m[0][1]*A.max[1])

+max(m[0][2]*A.min[2],m[0][2]*A.max[2])+t[0];

최소-최고점 표현 기법을 사용한 회전된 AABB를 아우르는 계산은 다음과 같이 실행될 수 있다.

void UpdateAABB(AABB a,float m[3][3],float t[3],AABB &b)

{

for(int i=0;i<3;i++){

b.min[i]=b.max[i]=t[i];

for(int j=0;j<3;j++){

float e=m[i][j]*a.min[j];

float f=m[i][j]*a.max[j];

if(e<f){

b.min[i]+=e;

b.max[i]+=f;

}else {

b.min[i]+=f;

b.max[i]+=e;

}

}

}

}

일치하게도, 중앙-반지름 AABB표현기법은 [Arvo90]이 된다.

void UpdateAABB(AABB a,float m[3][3],float t[3],AABB &b)

{

for(int i=0;i<3;i++){

b.c[i]=t[i];

b.r[i]=0.0f;

for(int j=0;j<3;j++){

b.c[i]+=m[i][j]*a.c[j];

b.r[i]+=Abs(m[i][j])*a.r[j];

}

}

}

 

회전된 AABB로부터 AABB계산은 자유로운 원점의 경계상자의 계산과 같다는 걸 알아두어야한다. OBB와 그들의 교차검사는 다음에 더 자세하게 다룬다. 하지만 여기에서의 표현 방법과 거기의 그것은 OBB객체로 표현된다. 하지만 여전히 AABB재거설처럼 그들은 교차한다. 근본행렬은 저장하기 위해 여분의 메모리가 필요하다. 변형 행렬 M을 사용한 OBB의 회전행렬의 결합을 위한 행렬간의 곱셈 또한 포함된다. 이 해법의 장점은 AABB건설이 더 딱 맞는다는 것이다. AABB검사는 꽉찬팽창 검사보다 적은 연산이 이루어진다.

}

반응형