공간벡터 내적으로 분석하는 3D 게임 엔진의 시야 판정 알고리즘
기하 · 공간벡터 · 컴퓨터공학
관련 성취기준
- [12기하03-04] 벡터를 이용하여 직선의 방정식을 구할 수 있다.
- [12기하03-05] 좌표공간에서 벡터를 이용하여 평면의 방정식과 구의 방정식을 구할 수 있다.
1내적이 게임 속 '보임' 판정이 되는 이유
기하 수업에서 공간벡터의 내적을 배울 때 처음에는 두 벡터 사이의 각을 구하는 계산 공식으로만 이해했다. 그러나 교과서의 실생활 연결 예시에서 게임 엔진이 캐릭터의 시선 방향 벡터와 적의 위치 벡터의 내적으로 시야 안팎을 판별한다는 내용을 보고, 교과서 공식이 실제 소프트웨어의 판단 규칙으로 바로 이어질 수 있다는 점이 인상적이었다. 이때부터 내적이 단순한 풀이 도구가 아니라, 3차원 공간에서 ‘보인다/보이지 않는다’를 빠르게 결정하는 기준식이 될 수 있다는 궁금증이 생겼다.
3D 게임 엔진에서는 카메라가 어떤 물체를 화면에 보여 줄지, NPC가 플레이어를 탐지할지, 특정 오브젝트를 렌더링할 필요가 있는지를 매 프레임 반복적으로 판단해야 한다. 이런 상황에서는 대상마다 각도를 일일이 자세히 해석하기보다, 방향 관계를 매우 짧은 계산으로 처리하는 수학적 조건식이 필요하다. 특히 벡터는 게임의 이동, 물리, 조명, 충돌 계산의 공통 언어이므로, 시야 판정 역시 벡터 연산으로 표현될 가능성이 높다고 보았다.
그런데 자료를 살펴보며 같은 시야 판정이라도 구현 방식이 하나로 고정되지 않는다는 점이 흥미로웠다. 어떤 방식은 먼저 내적을 이용해 각도 를 구한 뒤 기준 시야각과 비교하고, 다른 방식은 값 자체를 임계값과 직접 비교한다. 수학적으로는 비슷해 보이지만, 실제 프로그램에서는 역삼각함수 사용 여부, 연산 횟수, 경계값 처리 방식에서 차이가 생길 수 있다. 따라서 두 방식이 왜 함께 쓰이는지, 무엇이 더 효율적인지 비교할 필요가 있다고 판단했다.
이에 따라 본 탐구의 핵심 질문을 두 가지로 정리하였다. 첫째, 내적이 어떤 수학적 의미를 거쳐 실시간 게임 알고리즘의 조건식이 되는가이다. 둘째, 각도 비교 방식과 코사인 임계값 방식은 정확도와 연산 효율 면에서 어떤 차이를 보이는가이다. 이후 탐구에서는 먼저 교과서의 내적 공식과 단위벡터 개념으로 시야 판정의 수학적 근거를 정리하고, 그다음 이를 게임 엔진의 가시성 검사 문제와 연결하여 두 알고리즘을 비교하고자 한다.
2교과서로 정리한 시선 방향 벡터와 내적의 의미
섹션 1에서 설정한 첫 번째 질문, 즉 내적이 왜 시야 판정의 조건식이 되는가를 이해하기 위해 먼저 교과서의 공간벡터 개념으로 문제를 정리하였다. 관찰자 위치를 기준점 로 두고, 관찰자의 시선 방향 벡터를 , 대상까지의 방향 벡터를 라고 하면 두 벡터는 같은 시작점을 가지므로 서로의 방향 차이를 직접 비교할 수 있다. 결국 시야 판정은 대상이 관찰자의 시선과 얼마나 비슷한 방향에 놓여 있는지를 판단하는 문제로 바뀐다.
이때 핵심이 되는 교과 개념이 내적 공식이다.
여기서 와 는 각각 두 벡터의 크기, 는 두 벡터의 끼인각이다. 즉 내적값은 단순히 하나의 수가 아니라, 벡터의 크기 정보와 방향 정보가 결합된 결과이다. 두 벡터가 같은 방향에 가까울수록 가 1에 가까워져 내적값이 커지고, 직각이면 0, 반대 방향이면 음수가 된다. 따라서 내적은 시야 판정에서 필요한 ‘방향 유사도’를 수식 하나로 압축해 준다.
다만 시야 판정에서는 거리보다 방향 비교가 더 중요하므로, 두 벡터를 단위벡터로 정규화하면 의미가 더 분명해진다. 로 두면
가 되어 내적값이 곧 방향 유사도 자체가 된다. 즉 값이 1에 가까울수록 정면, 0에 가까울수록 옆, -1에 가까울수록 뒤쪽이라는 해석이 가능하다. 이 점에서 정규화는 내적을 단순 계산 결과가 아니라 직접적인 시야 판정 지표로 바꿔 준다.
이제 시야각을 라고 할 때 실제 판정은 전체 시야각의 절반인 를 기준으로 이루어진다. 대상이 시야 안에 있으려면
이어야 하고, 이를 코사인으로 바꾸면
가 된다. 정규화된 벡터를 사용하면 최종 판정식은 로 정리된다. 예를 들어 시야각이 90°이면 기준값은 이므로, 내적값이 0.707 이상이면 시야 안으로 볼 수 있다.
| 시야각 (deg) | 반시야각 (deg) | 임계값 |
|---|---|---|
| 60 | 30 | 0.866 |
| 90 | 45 | 0.707 |
| 120 | 60 | 0.500 |

이처럼 섹션 1의 문제의식은 교과서의 내적 공식만으로도 명확한 판정식으로 바뀔 수 있었다. 또한 이 식은 뒤에서 비교할 각도 비교 방식과 코사인 임계값 방식이 사실 같은 수학 원리에서 출발한다는 점을 보여 주므로, 이후 알고리즘 비교의 가설을 세우는 핵심 근거가 된다.
3내적 조건식을 게임 엔진의 가시성 검사로 연결하기
섹션 1에서 제기한 문제의식과 섹션 2에서 정리한 내적 공식을 바탕으로, 이번에는 이를 실제 게임 엔진의 가시성 검사 상황에 연결해 보았다. 게임에서 NPC가 플레이어를 발견하는 장면이나 카메라가 어떤 오브젝트를 화면에 포함할지를 판단하는 과정은 겉보기에는 복잡하지만, 수학적으로는 결국 시선 벡터와 대상 방향 벡터의 방향 유사도를 빠르게 검사하는 문제로 환원된다. 즉 엔진은 대상의 모양 전체를 먼저 분석하는 것이 아니라, 우선 ‘대상이 대략 앞쪽에 있는가’를 벡터 연산으로 거른다고 볼 수 있다.
이때 내적값의 부호만 보아도 1차적인 분류가 가능하다. 정규화 여부와 관계없이 이면 끼인각 가 90°보다 작아 대상이 정면 반공간에 있고, 이면 경계선상, 이면 뒤쪽에 있다고 해석할 수 있다. 따라서 적 탐지 알고리즘에서 매우 많은 대상 중 우선 뒤쪽 대상을 제외하는 1차 필터로 내적 부호 검사가 유용하다. 이는 교과서의 해석이 그대로 구현 규칙이 되는 사례라고 볼 수 있다.
그러나 앞뒤만 구분하는 조건으로는 실제 게임에서 요구하는 세부 시야각을 충분히 표현하기 어렵다. 예를 들어 NPC의 시야각이 60°, 90°, 120°로 달라지면 단순히 인지만으로는 같은 앞쪽에 있는 대상들을 세밀하게 나눌 수 없다. 80° 방향의 대상은 120° 시야에서는 보이지만 60° 시야에서는 보이지 않아야 하므로, 단순 부호 판정보다 더 정밀한 임계값 비교가 필요하다. 이 지점에서 섹션 2의 판정식 가 실제 의미를 갖는다.
| 내적 조건 | 끼인각 범위 | 공간적 의미 | 활용 가능한 1차 판정 |
|---|---|---|---|
| 앞쪽 | 후보 유지 | ||
| 경계 | 추가 검사 필요 | ||
| 뒤쪽 | 즉시 제외 |
또한 실제 구현에서는 수학 교과서처럼 이상적인 실수 계산만 일어나지 않는다. 벡터를 정규화하지 않으면 내적값에 거리 크기가 함께 섞여 방향 비교가 왜곡될 수 있고, 부동소수점 오차 때문에 경계 근처에서는 같은 좌표라도 프레임마다 판정이 흔들릴 가능성이 있다. 예를 들어 이론상 임계값이 0.707인 경우, 계산 결과가 0.706999와 0.707001처럼 미세하게 달라질 수 있어 경계 대상의 가시 여부가 불안정해질 수 있다. 이러한 이유로 게임 엔진에서는 단순한 수학식 선택이 아니라 어떤 형태의 조건식으로 구현할 것인가가 중요해진다.[1]
결국 섹션 2의 교과 개념만으로도 시야 판정의 원리는 설명되지만, 실제 엔진 수준으로 가면 정규화 여부, 경계 처리, 조건식 표현 방식까지 검토해야 한다는 연구 갭이 생긴다. 바로 이 지점에서 섹션 1의 두 번째 질문, 즉 각도 비교 방식과 코사인 임계값 방식 중 무엇이 더 안정적이고 효율적인가라는 비교 탐구가 자연스럽게 이어진다.