4개의 축조정 방식은 회전된 AABB를 새로운 AABB로 감싸는 방법이 가장 간단하다. 이방법은 AABB보다 간단하다. 처음 AABB보다 거대해진 AABB는 로컬공간의 원점의 회전으로부터 계산된 AABB는 중요하다. 아니면, AABB는 점점 커지면서 이전시간으로 돌아가면서 회전된 AABB를 반복적으로 계산한다. AABB의 A는 회전행렬 M에 의해 영향을 받으며 OBB의 A'의 결과를 갖는다. 회전행렬의 3개의 열(또는 행, 행렬에 따라 다름)은 로컬좌표 프레임에서 A'의 월드좌표축으로 반환한다.(벡터가 열벡터이고, 오른쪽 행렬에 곱해지면,M의 열은 축이다. 만약 벡터가 왼쪽행렬에 행벡터로 곱해지면 M의행은 축이다.) A는 최소-최고점 표현방식이고, M은 열행렬이라고 치자. 월드좌표축으로의 A'의 회전된 ..
AABB축 재조정의 속도를 향상시킬수 있는 또다른 방법은 정점을 빠르게 찾아낼수 있는 이웃정점의 표현 방식이다. 이와 같은 표현은 새로운 AABB의 극점을 간단한 언덕오르기 기법을 통해 정의 할 수 있도록 한다.(4.7 참조) 최소점,최고점 규모 값을 파악하고있는 대신에, 6개 정점이 유지된다. 앞서의 같은 값을 갖는 것처럼 이것들은 각각의 축에 관해 객체의 극점을 가리킨다. 만약 그점들이 이전과 같이 극값을 갖는다면 이웃의 정점에 관한 언급된 점들을 비교함으로써 언덕오르기 단계가 진행된다. 이 극점들은 이웃점들로 대체되지 않고, 검사는 극점의 방향을 찾을 때 까지 지속된다. 로컬좌표계에서 최소점에서 겹치지 않는것처럼, 언덕오르기과정은 객체를 블록하도록 요구한다. 이 이유에서, 블록하지 않은 객체의 블록..
좌표계에서의 축 재조정과 같은 AABB의 크기 재조정이 동적으로 이루어지는 비법이 이번 절에서 설명된다. 꽉 맞는 경계 상자처럼, 기본이 되는 기하적인 경계 객체는 검사를 하고, 경계 상자는 6개의 다른방향의 극점을 찾아서 생성된다. 근접점은 정점벡터에서 방향벡터로의 투영을 통해 계산된다. 그러므로, 정규화는 필요없다. 이 과정은 다음 코드에서 그려지며, 이것은 가장 가까운점과 가장 먼 점을 찾아낸다. void ExtreamPointsALongDirection(Vector dir,point pt[],int n,int *imin,int *imax){float minproj=FLT_MAX,maxproj=-FLT_MAX;for(int i=0;i
완벽하게 피하는 첫번째 방법은 객체의 어느 방향이든 포함할수 있도록 크게 만들어서 AABB를 재가공하는 것이다. 고정된 크기의 충분히 아우르는 AABB는 포함된 객체 A의 경계 구의 경계 상자처럼 계산된다. 경계구는 (차례대로) 객체 A를 회전시키는 중앙에 중심점 P가 있다. 그것의 반지름 r은 중심으로부터의 거리를 말한다. 이 표현방식의 이점은 AABB 업데이트가 간단하다는것, 그리고 어떤 객체 회전은 완벽하게 무시된다.하지만, 경계 구 자신은 이러한 장점은 갖는다. 그러므로, 경계 구는 잠재적으로 개선된 방식으로 고려되어야한다.
경계 용량은 보통 객체의 모델좌표공간에서 구체화된다. 2개의 경계 용량사이의 겹침 여부를 검사하기위해서, 그용량은 보통 좌표계시스템으로 변형되어야 한다. 한 객체의 좌표계가 다른 객체의 좌표계로 변형되는것은 옵션이다. 로컬좌표계로의 변형의 장점은 월드좌표계에서의 계산량의 절반이라는 점이다. 그리고 월드좌표계보다 로컬좌표계에서의 계산은 더 딱 들어맞게된다. 4.4절에서 그 개념에대해 설명한다. 월드좌표계에서는 AABB객체의 A,B는 재계산해야 한다.(4.4a참조). 하지만, B객체의 좌표계에서는 그 객체는 분리되는것을 발견 할 수 있다.(4.4c 참조) 정확성은 로컬좌표계에서의 계산에서 또다른 중요한 이유중 하나이다. 월드좌표계 검사는 원점에서 멀리 떨어질수 있다. 원점에서 멀리 떨어진 물체를 검사하는 것..
AABB의 겹침 검사는 표현방식에 상관없이 간단하다. 두개의 AABB는 세개의 축으로 그들의 차원에 따른 크기에 일치하는 축으로 겹침이 이루어진다. 최소-최고점 표현에서는 이 간격의 겹침검사가 된다:int TestAABBAABB(AABB a,AABB b){if(a.max[0]b.max[0]) return 0;if(a.max[1]b.max[1]) return 0;if(a.max[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 ..