상세 컨텐츠

본문 제목

프러스텀 컬링

게임엔진공부

by 뿡뿡이형 2020. 1. 13. 01:03

본문

프러스텀컬링이란

백스페이스 컬링처럼 우리가 보지 못하는것을 굳이 그려주지 않아 컴퓨터의 계산량을 줄여주는 방법중 하나인데

출처 : https://relativity.net.au/gaming/java/Frustum.html

우리가 카메라로 보고있는 영역 즉 절두체 밖의 오브젝트는 그리지 않고 절두체 내부에 있는 오브젝트들만 그리는 것인데

이 절두체는 근평면, 원평면, 상평면, 하평면, 좌평면, 우평면으로 총 6개의 평면으로 이루어져 있다.

평면은 점 1개와 법선벡터 1개 혹은 점 3개 등의 방법으로 표현이 가능한데 그 중 점 1개와 법선벡터를 이용한 평면으로 프러스텀 컬링을 설명해 보겠다.


근평면과 원평면

가장 쉽게 구할 수 있는 두개의 평면이다.

우리는 무려 카메라와 근평면 사이의 거리 NearZ 값과 카메라와 원평면사이의 거리인 FarZ값을 알고있다.

Forward 벡터(0,0,1)에  NearZ의 값을 곱하면 근평면의 점 1개가 나오고 법선벡터는 (0,0,1)을 사용하면 된다. 

원 평면도 마찬가지로 Forward벡터에 FarZ값을 곱해 점1개를 구하고 법선벡터는 (0,0,-1)을 사용하면 된다.

  이렇게 근평면과 원평면을 구했다.


상하좌우평면

그럼 이제 나머지 평면은 어떻게 구하냐

상하좌우 평면들은 점이 이미 있다.

카메라의 원점이 바로 점이다. 그럼 법선벡터만 구하면 된다.

법선벡터를 구하려면 뭐가 좋을까?

우리에겐 시야각이라는 써먹기 좋은 친구가 있다. 이 친구를 이용해  나머지 평면의 법선을 구해보자 

일단 시야각에 0.5를 곱해 반으로 만든 값을 HalfFOV라고 하고

HalfFOV를 라디안 값으로 바꿔준뒤 탄젠트값을 구한다. 그걸 tanHalfFOV라고 부르자

그리고 1을 tanHalfFOV로 나눠 나온 값을 invTanHalfFOV라고 했을 때

이 나온 값을 이용해 (0,-invTanHalfFOV,1)를 하면 상평면의 법선 벡터를 구할 수 있다.

나머지도 응용하여

(0,-invTanHalfFOV,1)

하 (0,invTanHalfFOV,1)

(-invTanHalfFOV,0,1)

우 (invTanHalfFOV,0,1)


이렇게 상하좌우 근원 평면 6개를 다 구했으니 이제

그려야할 오브젝트들에 뷰 좌표계를 곱해 뷰좌표계로 옮겨준뒤

상하좌우 원 근 평면과 비교하여 오브젝트의 위치가가 한개의 평면이라도 바깥에 있다면 그리지 않고 넘어가면 된다.

(오브젝트의 위치는 오브젝트내의 모든 버텍스를 비교할 수 없으므로 바인딩 구체나 바인딩 박스를 통해 계산된다.)

관련글 더보기