본문 바로가기

예전/3D

[3D] 절두체(Frustum)


[절두체 컬링의 종류] http://ha2rupms.tistory.com/131


에 미리 절두체 컬링의 종류에 대해 포스팅해놨습니다. 

뭔가 앞뒤가 바뀐 느낌이지만 ... 


간단하나마 구현 알고리즘에 관한 것이므로 포스팅하겠습니다.






절두체란 시야에 보이는 영역을 표현한 입체이다.






사각 뿔에서 앞면만 조금 잘라낸 상태로 

프로그램의 부하를 줄이기 위해 컬링을 해야하기 때문에 절두체를 구해야 한다.






절두체를 만들기 위해서는 먼저 8개의 점을 선언한다.


그래픽스 파이프라인에서 정점 적용순서가 



월드 행렬 * 카메라 행렬 * 투영 행렬이다.



양 변에 (카메라 행렬 * 투영 행렬)^(-1)를 곱하면


최종 좌표 * (카메라 행렬 * 투영 행렬)^(-1)  = 월드 행렬 * 카메라 행렬 * 투영 행렬 * (카메라 행렬 * 투영 행렬)^(-1)

이 되고,

최종 좌표 * (카메라 행렬 * 투영 행렬)^(-1)  = 월드 행렬

이 된다.



물체가 존재하는 공간은 월드 공간이므로 8개의 좌표의 월드 좌표를 알아내야한다.



알아낸 점으로 6개의 평면을 생성한다.


D3DXPLANE *D3DXPlaneFromPoints(      

    D3DXPLANE *pOut,     CONST D3DXVECTOR3 *pV1,     CONST D3DXVECTOR3 *pV2,     CONST D3DXVECTOR3 *pV3 );


이 함수는 3개의 점을 통해 평면을 return 하는 함수이다.



이때 중요한 것이 두르기 순서!! 이다.



보통 평면과 점의 판단은 거리로 한다. 

일반적으로 어떤 평면과 점의 거리가 양수일 때, 그 점은 평면 위에 있다고 판단된다.



이렇게 하기위해 모든 평면의 위가 안쪽을 바라보게 구현해야 한다.


근, 우, 상 평면은 버텍스를 시계 방향으로 

원, 좌, 하 평면은 버텍스를 반 시계 방향으로 대입하면 모든 평면의 위가 안쪽을 바라보게 절두체가 형성된다. 




이와 같이 만들어진 절두체를 

과 평면의 판단을 통해 어떤 점이 절두체 내에 있는지 알아내는 것절두체 컬링이다.


FLOAT D3DXPlaneDotCoord(      

    CONST D3DXPLANE *pP,     CONST D3DXVECTOR3 *pV );


이 함수는 평면과 벡터의 내적을 계산해 return 하는 함수이다.


만약 내적의 값이 양수라면 그 평면의 위쪽에 있는 것이므로 

6 평면의 모든 return 값이 양수라면 그 점은 절두체 내에 있는 것이다. 







[이미지 참고] http://blog.naver.com/hermet/52167752


'예전 > 3D' 카테고리의 다른 글

[3D] LOD Crack  (0) 2013.01.10
[3D] LOD (Level of Detail)  (0) 2013.01.10
[3D] 지형 올리고 내리기  (0) 2013.01.08
DrawPrimitive , DrawPrimitiveUP  (0) 2013.01.08
[3D] 지형(Terrain)  (0) 2013.01.08