- 개요

이전에 원근 투영 행렬을 활용한 절두체 컬링에서 카메라를 이동시키면
화면 가장자리의 게임 오브젝트가 갑자기 튀어오르거나 사라지는 현상이 발생하였다
위와 같은 현상이 발생하는 이유는 게임 오브젝트의 메시가 차지하는 공간 영역이 있음에도 불구하고
게임 오브젝트의 기존 위치만 가지고 절두체 컬링을 수행하기 때문이다
위의 이미지와 같은 상황에서 해당 게임 오브젝트는 그려져야 하지만
기존의 절두체 컬링 로직을 사용한다면 절두체의 외부에 있다고 판단하여 그리기를 생략한다
1) 바운딩 볼륨의 도입

문제를 해결하기 위해 절두체 컬링은 게임 오브젝트의 위치가 아닌, 메시가 차지하는 영역을 대상으로 진행해야 한다
게임 엔진은 메시가 차지하는 영역을 효과적으로 관리하기 위해 구나 박스와 같은 원시 도형을 사용하는데,
이러한 원시 도형으로 설정한 공간 데이터를 바운딩 볼륨이라고 표현한다
위 이미지에서 회색 선으로 구성된 박스가 바운딩 볼륨을 의미한다
2) 구 바운딩 볼륨의 판정


구를 사용한 바운딩 볼륨의 판정 과정을 알아본다
구는 두 영역이 서로 겹치는지, 떨어져 있는지를 쉽게 판단할 수 있어 바운딩 볼륨에서 손쉽게 사용된다
하나의 점이 구의 외부에 있는지 판단하는 방법은 구의 중점에서부터 점까지의 거리와 구의 반지름을 비교하는 것이다


또한 두 개의 구의 영역이 서로 떨어져 있는지 여부를 판단하는 공식은 위와 같다
두 구의 중점 사이의 거리와 두 구의 반지름의 합을 비교하여 두 구의 겹침을 판단할 수 있다
3) 프로젝트에서 구 바운딩 볼륨의 구현
3 - 1) 구의 선언

Sphere 구조체를 통해 프로젝트에서 구를 사용할 수 있다
멤버변수는 다음과 같다
- Center 멤버변수 : 구의 중점
- Radius 멤버변수 : 구의 반지름
멤버함수는 다음과 같다
- IsInside 멤버 함수 : 구 영역이 어느 한 점을 포함하는지 판단
- 해당 함수를 호출하여 주어진 점과 중점과의 거리가 반지름보다 작으면 주어진 점은 구 안에 포함
- Intersect 멤버 함수 : 두 구의 영역이 겹치는지 판단
- 해당 함수를 호출하여 두 구의 중점간의 거리가 두 구의 반지름의 합보다 작으면 두 구는 겹치게 됨
3 - 2) 메시 정보로부터 구를 생성

Sphere 구조체의 생성자에 메시의 정보를 넘겨주어 메시를 감싸는 구 영역을 생성할 수 있다
메시를 구성하는 모든 점의 위치 값에 대한 평균을 계산하여 중점 위치를 계산하고,
중점에서 가장 먼 점과의 거리를 구의 반지름으로 결정하면 메시의 모든 영역을 감싸는 구 영역을 생성할 수 있다
3 - 3) 메시에 대한 바운딩 볼륨을 생성

LoadResources 함수는 메시를 생성한다
이때 내부적으로 CaclulateBounds 함수를 실행하여 메시가 생성된 후에 메시의 바운딩 볼륨을 생성한다
3 - 4) 구 영역을 활용한 절두체 컬링

구 영역을 활용한 CheckBound 함수를 구성하여 구를 사용한 절두체 컬링을 구현한다
총 3개의 조건을 통해 게임 오브젝트를 그려야 하는지 판단한다
- 평면으로부터의 거리값 > 구의 반지름 : 해당 게임 오브젝트의 메시는 절두체의 외부에 존재
- 평면으로부터의 거리값 <= 구의 반지름 : 해당 게임 오브젝트의 메시는 절두체의 경계에 존재
- 그 외의 경우 : 해당 게임 오브젝트의 메시는 절두체의 내부에 존재
'수학 > 이득우의 게임 수학' 카테고리의 다른 글
| 절두체 컬링 (4) 원근 투영 행렬을 이용한 평면의 방정식 생성 (0) | 2026.07.08 |
|---|---|
| 절두체 컬링 (3) 평면의 방정식을 활용한 절두체 표현 (0) | 2026.07.01 |
| 절두체 컬링 (2) 평면의 방정식의 정규화 (0) | 2026.06.24 |
| 절두체 컬링 (1) 평면의 방정식 (0) | 2026.06.24 |
| 원근 투영 (7) 깊이 버퍼의 시각화 (2) (0) | 2026.06.17 |