[이득우 게임수학] 13. 절두체: 최적화된 3차원 공간

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, 13-4, 13-5 의 결과는 모두 같다

13.3 삼각형 클리핑

삼각형 클리핑(Triangle clipping)은 원근 투영 행렬을 곱해 생성된 클립 좌표계의 w값을 보고 엉뚱하게 투영되지 않도록 삼각형 영역을 잘라내는 것이다.

13-6 실습

눈에 보이는 만큼 삼각형 쪼개기

13.4 정리

  • 평면의 방정식으로부터 절두체를 형성하여 화면에 보여지는 물체들만 효과적으로 그려내는 방법
  • 사영 공간에서 삼각형을 잘라 역투영 문제를 방지하고, 거대한 삼각형을 효과적으로 그려주는 삼각형 클리핑 기능 구현
반응형

댓글

Designed by JB FACTORY