본문 바로가기

[ C/ C++ 프로그래밍 ]/[ 외부 지형 ]

컬링


ㅇ 절두체의 정의
  -  절두체 컬링이란? 전체 3차원 월드에서 카메라의 시야 범위에 포함된 것들만 랜덩링하는 기법 ==> 속도증가 기법

  - 렌더링 파이프 라인에서 절두체 ==> 모양이 삼각뿔의 머리를 잘라 놓은 것 같다고 해서 절두체라고 한다.

    


- 절두체를 이루는 6개의 평면

 

 

ㅇ 평면 방정식

    - 무한 평면을 정의하는 도구
    - ax + by + cz + d = 0  ==> a,b,c : 평면 방향을 나타내는 법선 벡터,  d : 평면과 원점간의 거리
    - 세개의 점(v0,v1,v2)로 부터 벡터v'와 벡터v'' 를 만들고, 이 두벡터를 외적연산하면 직교하는 벡터 N = (a,b,c) 가 나온다.

      


  
  - N = (a,b,c)가 평면 방정식의 벱선 벡터이다.
  - d 값은 v0, v1, v2중의 어느 하나의 값을 평면 방정식에 대입해서 얻으면 된다. ex) ax1 + by1 + cz1  + d = 0  => d =  - (ax1 + by1 + cz1 )
  - D3DX는 D3DXPlaneFromPoints()함수를 이용


ㅇ 평면 방정식의 성질
 
   - 평면 방정식을 통해서 평면에 방향을 알수 있다.
 
 


   

  - 평면 방정식에 한 점의 좌표를 대입해서 나오는 결과값은 다음과 같은 의미를 가짐
  

   


ㅇ 절두체 컬링 원리

 -  6개의 평면 방정식에 점의 좌표를 대입해서 모든 평면 방정식 결과값이 양수(+)이면 이 점은 절두체 내부에 포함된다.
 -  밑 그림은 원, 근, 좌, 우평면에 대해서만 표기
 

 

  - 경우 따라 6개 평면 방정식을 모두 사용하는 경우도 있고 좌우 평면과 원거리 평면 정도만 테스트해도 충분한 경우가 있다.

ㅇ 경계구 컬링 기법

   - 모든 점에 대해서 평면 방정식을 테스트하기에는 부담이 된다.
     ex) 캐릭터가 1000 개 폴리곤 ==> 정점은 대충 3000개가 있다고 가정, 이런 캐릭터가 100개 정도가 등장한다면  필요한 연산은?
  필요한 연산  = 3000(정점) x 100(캐릭터) x 6(평면방정식)

  - 메시를 전체를 감싸는 경계구를 정의하고 , 이 구가 절두체에 포함되는지를 판단한다.
  -  경계구의 경우 중심점과 반지름이라는 2개의 수자로 이루어지기 때문에 빠른 판정 가능
  - AABB(Axis Aligned Bounding Box) or OBB(Object Bounding Box)등의 기법도 있다.

 -  평면 방정식 ax + by + cz + d = 0 에 경계의 중심점 Vc = (xc,yc,zc)의 값을 대입해서 나온 결과가 경계의 반지름 r보다 작다면 평면과 중심점의
    반지름보다 작은 것이르므로 경계구에 평면이 포함되는 것이다.
 
 



 


ㅇ 경계 상자 컬링

 



 
ㅇ 쿼드 트리 컬링

 


 
 
  참고 및 자세한 내용은

 

 


 

'[ C/ C++ 프로그래밍 ] > [ 외부 지형 ]' 카테고리의 다른 글

LOD  (8) 2010.06.28
쿼드 트리  (2) 2010.06.28