*QuadTree

- 부모의 노드가 4개의 자식 노드를 가진다.

- terrain의 경우 index를 정보로 가진다.

- 1. 전체를 표현할 수 있는 4개의 index를 가진 root노드로 부터 자식 노드가 파생된다.

2. 자신을 4분할 하여 각각의 노드들이 자신의 index를 가진다.

3. 더이상 분할 할 수 없을 때 까지 2.를 재귀적으로 반복한다.

 

 

 

root노드로부터 4개의 자식노드가 파생되어 그 4개의 자식노드들도 각각 4개씩의 자식을 갖는다.

( 더이상 나눌 수 없을 때 까지 )

 

 

 

*terrain에 quadtree만 적용시 속도적 측면에서 오히려 손해를 본다.

quadtree를 활용하려면 FrustumCulling과 함께 사용하자.

 

*의사코드

class CTerQuadTree;

 

private:

//자식노드 멤버변수

CTerQuadTree* m_ar_pChild[4];

//index를 저장할 멤버변수

DWORD m_ar_dwCorner[4];

 

//root 생성 메소드

VOID CTerQuadTree::CreateQuadTree( int _iWidth, int _iHeight )

{

//root index 생성

DWORD ar_dwIndex[4] =

{

0,

_iWidth- 1,

_iWidth* ( _iHeight - 1 ),

_iWidth* _iHeight - 1

};

 

//m_ar_dwCorner배열에 index 저장

CTerQuadTree::_SetupIndex( ar_dwIndex[0], ar_dwIndex[1], ar_dwIndex[2], ar_dwIndex[3] );

 

//quadtree 생성

CTerQuadTree::_Build();

}

 

//build를 재귀호출하여 자식노드를 할당한다.

VOID CTerQuadTree::_Build()

{

//나눌 수 있다면 자식노드 build

if( CTerQuadTree::_SubDivide() )

{

for( int i = 0; i < 4; ++i )

m_ar_pChild[i]->_Build();

}

}

 

//더 나눌 수 있는지 검토한 후 index를 생성할수있는 데이터를 인자로 넘겨주며 자식 노드를 생성한다.

BOOL CTerQuadTree::_SubDivide()

{

if( ! CTerQuadTree::_IsDivisible() )

return FALSE;

 

DWORD dwTopCen, dwBotCen, dwLefCen, dwRigCen;

 

dwTopCen = ( m_ar_dwCorner[COR_TR] + m_ar_dwCorner[COR_TL] ) / 2;

dwBotCen = ( m_ar_dwCorner[COR_BR] + m_ar_dwCorner[COR_BL] ) / 2;

dwLefCen = ( m_ar_dwCorner[COR_TL] + m_ar_dwCorner[COR_BL] ) / 2;

dwRigCen = ( m_ar_dwCorner[COR_TR] + m_ar_dwCorner[COR_BR] ) / 2;

 

m_ar_pChild[COR_TL] = CTerQuadTree::_CreateChild( m_ar_dwCorner[COR_TL], dwTopCen, dwLefCen, m_dwCenter );

m_ar_pChild[COR_TR] = CTerQuadTree::_CreateChild( dwTopCen, m_ar_dwCorner[COR_TR], m_dwCenter, dwRigCen );

m_ar_pChild[COR_BL] = CTerQuadTree::_CreateChild( dwLefCen, m_dwCenter, m_ar_dwCorner[COR_BL], dwBotCen );

m_ar_pChild[COR_BR] = CTerQuadTree::_CreateChild( m_dwCenter, dwRigCen, dwBotCen, m_ar_dwCorner[COR_BR] );

 

 

return TRUE;

}

 

'programming > etc' 카테고리의 다른 글

Level of detail ( LOD )  (0) 2024.07.26
절두체 컬링 ( Frustum Culling )  (0) 2024.07.26
OBB 충돌  (0) 2024.07.26
*좌표계*삼각비*내적-정사영  (0) 2024.07.26
카메라  (0) 2024.07.26
Posted by mainep
: