수학/이득우의 게임 수학

절두체 컬링 (3) 평면의 방정식을 활용한 절두체 표현

monstro 2026. 7. 1. 11:18
728x90
반응형

- 개요

이전까지 알아본 평면의 방정식을 활용하여 절두체를 구성하는 6개의 평면에 대한 방정식을 계산하고

이를 활용하여 시야 영역에서 벗어난 게임 오브젝트를 솎아내는 절두체 컬링을 구현한다

 

- 절차

1) 근평면과 원평면을 제외한 나머지 네 개의 평면에 대한 평면의 방정식 

절두체의 Y축 상단 평면

 

우선, 위의 그림처럼 절두체 상단 평면의 방정식을 계산한다

절두체의 상단 평면을 무한하게 확장하면 상단 평면은 원점을 품게 된다

이는 근평면과 원평면을 제외한 나머지 평면에서도 동일하다

이때 근평면과 원평면을 제외한 네 개의 평면을 구성하는 평면의 방정식의 상수 d는 0이므로

크기가 1인 법선 벡터만 계산하면 근평면과 원평면을 제외한 네 개의 평면의 방정식을 얻을 수 있다

 

절두체 상단 평면의 법선 벡터를 계산하는 과정

 

뷰 공간의 측면에서 절두체를 투영한 모습을 위와 같이 표현한다

측면에서 바라본 평면의 좌표계에서 오른쪽 방향은 뷰 공간의 -Z축에 대응되고 위쪽 방향Y축에 대응된다

평면에서 오른쪽을 향하는 (0, 0, 1)의 벡터를 반시계 방향으로 θ/2 만큼 회전하면

결과값은 (0, sin(θ/2), -cos(θ/2))와 같이 계산된다

 

계산된 절두체 상단에 대한 평면의 방정식 (1)

 

이때 평면의 법선 벡터는 여기서 90°만큼 더 회전한 값이므로

Y 값과 Z값을 교차시키고 Y값에 반대 부호를 수식하면 평면의 법선 벡터를 위와 같이 계산할 수 있다

 

계산된 절두체 상단에 대한 평면의 방정식 (2)

 

이때 상수 d의 값은 0이므로 절두체 상단을 구성하는 평면의 방정식은 위와 같이 계산한다

 

절두체 상단을 제외한 나머지 세 개의 절두체 평면에 대한 평면의 방정식

 

절두체 상단에 대한 평면의 방정식을 계산한 것과 유사하게 나머지 세 개의 평면의 대한 평면의 방정식을 계산할 수 있다

 

2) 근평면과 원평면에 대한 평면의 방정식

근평면의 특징

 

근평면은 위의 그림에서 보이듯이 원점을 향하고 있으며

원점으로부터의 거리가 n이라고 가정할 때, 평면의 방정식의 상수 d의 값도 n이 된다

그리고 근평면의 법선 벡터의 값은 (0, 0, 1)이다

 

 

근평면에 대한 평면의 방정식

 

따라서 근평면에 대한 평면의 방정식은 위와 같이 계산할 수 있다

 

원평면에 대한 평면의 방정식 (1)

 

원평면의 법선 벡터근평면에 반대 방향인 원점에서 멀어지는 (0, 0, -1)이고,

이때 원점으로부터의 거리를 f라고 가정한다

따라서 원평면에 대한 평면의 방정식은 위와 같이 계산된다

 

원평면에 대한 평면의 방정식 (2)

 

위에서 계산한 원평면의 방정식을 이항하여 정리하면 위와 같다

이때 평면의 방정식은 방향 정보가 포함되어 있으므로 다음과 같은 결과가 발생한다

  • 두 원평면의 위치동일하지만, 방향반대
  • - z - f = 0의 방향 : 원점으로부터의 반대 방향
  • 0 = z + f의 방향 : 원점으로 향하는 방향

 

- 프로젝트에서의 구현

1) 6개의 평면으로 구성된 절두체의 선언

 

프로젝트에서 절두체로 사용하는 Frustum 구조체를 위와 같이 설계한다

Planes 변수를 사용하여 절두체를 구성하는 6개의 평면을 생성한다

이때 5번째 평면이 근평면이고, 6번째 평면이 원평면으로 동작한다

 

2) 점의 상태

 

평면의 방정식을 활용하여 주어진 점이 절두체의 영역의 어디에 있는지 판단할 수 있다

위와 같이 BoundCheckResult 열거형 클래스를 생성하여 점의 상태를 판단한다

  • Oustide : 절두체의 영역 외부
  • Intersect : 절두체의 영역과 겹침
  • Inside : 절두체의 영역 내부

 

3) 절두체의 어느 영역에 있는지 판별

 

Frustum 구조체의 CheckBound 함수를 호출하여 인자로 받은 점이 절두체의 어느 영역에 있는지 판단한다

절두체를 구성하는 6개의 평면에 대해서 모두 테스트를 진행한다

  • 한 개의 평면에서라도 점이 외부에 있다면, Outside 상태를 반환
  • 평면 사이의 오차 범위 내에 거리가 0에 근접하면, Intersect 상태를 반환
  • 얼리 리턴되지 않았다면, Inside 상태를 반환
728x90
반응형