[이득우 게임수학] 13. 절두체: 최적화된 3차원 공간
- 📕 Book/이득우 게임수학
- 2023. 3. 15.
13.1 절두체 컬링
- 절두체 컬링(Frustum culling) : 절두체의 영역 밖에 있는 게임 오브젝트를 파악하고 걸러내는 기능
평면의 방정식
하나의 평면을 정의하려면 최소 3개의 점이 필요하다. 3차원 공간의 평면은 앞면과 뒷면이 존재하기 때문에 이를 구분할 수 있는 정보도 필요하다.
법선 벡터 n과 평면위의 점 P_0 에서 점 P로 향하는 벡터를 내적해보자.
n·(P - P_0) = (a,b,c)·(x-x_0, y-y_0, z-z_0) = 0
= ax + by + cz - (ax_0 + by_0 + cz_0) = 0
여기서 법선 벡터 (a,b,c)와 평면의 점(x_0, y_0, z_0)는 사전에 주어진 값이므로 -(ax_0 + by_0 + cz_0)는 미리 계산할수 있는 상수값 d로 치환한다. 이를 간략히 표시하면 평면의 방정식(The equation of plane)이라 한다.
ax + by + cz + d = 0
d = -(ax_0 + by_0 + cz_0)
d = -n·(x_0, y_0, z_0)
d = -n·OP_0 = -n·p
n·p = |n||p|cosθ
n·p = |p|cosθ //|n| = 1
- d의 부호 : d의 값이 양수면 평면이 바라보는 방향은 원점을 향하고 음수면 원점에서 멀어지는 방향을 가진다.
- d의 절댓값 : 평면에서 원점까지의 최단거리를 의미
평면의 방정식의 정규화
ax + by + cz + d = 0
//n (a',b',c')
a'x + b'y + c'z + d' = 0
(a',b',c') = n / |n| = n / sqrt(a^2 + b^2 + c^2) = (a, b, c) / sqrt(a^2 + b^2 + c^2)
d = -n·p = -|n||p|cosθ
d' = -|p|cosθ
d' = d / |n|
ax + by + cz + d / sqrt(a^2 + b^2 + c^2) = 0
평면의 방정식을 활용한 절두체 표현
- 절두체 하단 평면의 방정식 : -cos(θ/2)y + sin(θ/2)z = 0
- 절두체 좌측 평면의 방정식 : cos(θ/2)x + sin(θ/2)z = 0
- 절두체 우측 평면의 방정식 : -cos(θ/2)x + sin(θ/2)z = 0
13-1 실습
눈에 보이는 물체만 그리기
원근 투영 행렬로 부터 평면의 방정식 만들기
중략
13-2 실습
더 정확하고 빠르게 눈에 보이는 물체만 그리기
13.2 바운딩 볼륨
바운딩 볼륨(Bounding volume)은 구(Sphere)나 박스(Box)같은 원시 도형(Primitive shape)를 사용해서 메시가 차지하는 영역을 효과적으로 관리하기 위한 공간 데이터다.
구 바운딩 볼륨의 판정
구는 중점에서 부터 점까지의 거리와 구의 반지름 크기를 비교하여 겹치는지, 떨어져 있는지를 가장 쉽고 빠르게 파악할수 있는 도형이다.
13-3 실습
구 영역과 절두체 영역의 판정
13-4 실습
로컬 좌표로 간편하게 판정하기
AABB와의 판정
AABB(Axis aligned bounding box)는 각 축의 최댓값과 최솟값을 설정해 각 차원의 값을 비교하여 판정한다.
13-5 실습
박스 영역과 절투체 영역의 판정
13.3 삼각형 클리핑
삼각형 클리핑(Triangle clipping)은 원근 투영 행렬을 곱해 생성된 클립 좌표계의 w값을 보고 엉뚱하게 투영되지 않도록 삼각형 영역을 잘라내는 것이다.
13-6 실습
눈에 보이는 만큼 삼각형 쪼개기
13.4 정리
- 평면의 방정식으로부터 절두체를 형성하여 화면에 보여지는 물체들만 효과적으로 그려내는 방법
- 사영 공간에서 삼각형을 잘라 역투영 문제를 방지하고, 거대한 삼각형을 효과적으로 그려주는 삼각형 클리핑 기능 구현
반응형