내적

내적(Inner Product)은 두 벡터를 하나의 스칼라 값으로 변환하는 연산을 의미합니다.
벡터의 방향성을 고려하여 이루어지며, 두 벡터의 방향이 같을 수록 내적 값은 커지고, 방향이 다를 수록 내적 값이 작아집니다. 즉, 내적이 0이면 두 벡터가 직교(Orthogonal, 수직)하는 관계라는 의미입니다.

수학적 정의

내적의 정의는 기하학적 정의와 성분(좌표) 기반의 정의가 있습니다.

일반적으로 조금 더 이해하기 쉬운 정의는 성분(좌표) 기반의 정의입니다.

기하학적 정의

두 벡터 $A$와 $B$의 내적은 다음과 같이 정의됩니다.
$A \cdot B = \vert A \vert \times \vert B \vert \times \cos \theta$

여기서, $A \cdot B$는 두 벡터 $A$와 $B$의 내적 값을 의미합니다.
$\vert A \vert$, $\vert B \vert$는 각각 벡터 $A$와 $B$의 크기(길이)를 의미합니다.
벡터의 크기(길이)는 해당 벡터가 원점에서 얼마나 멀리 떨어져 있는지를 나타냅니다.
이는 벡터의 유클리드 거리(Euclidean Distance)로 계산합니다.

예를 들어, 어떤 벡터가 2차원 좌표에서 $A = (Ax, Ay)$, 3차원 좌표에서 $B = (Bx, By, Bz)$라고 주어졌다면, 벡터 $A$의 크기(길이)는 다음과 같이 계산할 수 있습니다.
$\vert A \vert = \sqrt{A_x^2 + A_y^2}$, $\vert B \vert = \sqrt{B_x^2 + B_y^2 + B_z^2}$

즉, 벡터의 크기는 벡터의 각 성분을 제곱한 후 모두 더한 값의 제곱근입니다.

$\theta$는 두 벡터가 이루는 각도를 의미합니다.
즉, 두 벡터가 서로 얼마나 벌어져 있는지를 나타내는 값입니다.

  1. $\theta = 0^\circ$
    • 두 벡터가 완전히 같은 방향을 향하고 있음
    • 예: $A=(1,0), B=(2,0)$
  2. $\theta = 90^\circ$
    • 두 벡터가 수직을 이루어 서로 직교(orthogonal)함
    • 예: $A=(1,0), B=(0,1)$
  3. $\theta = 180^\circ$
    • 두 벡터가 완전히 반대 방향을 향하고 있음
    • 예: $A=(1,0), B=(−1,0)$

$\cos \theta$는 두 벡터의 방향이 일치하는 정도를 나타냅니다.
$\cos \theta$의 값 범위는 -1에서 1 사이이며, 다음과 같은 의미를 가집니다.

$\theta$ (각도) $\cos \theta$ 값 의미
$0^\circ$ 1 완전히 같은 방향
$0^\circ < \theta < 90^\circ$ $0 < \theta < 1$ 유사한 방향
$90^\circ$ 0 직교(서로 독립적인 방향)
$90^\circ < \theta < 180^\circ$ $-1 < \theta < 0$ 반대 방향에 가까움
$180^\circ$ -1 완전히 반대 방향

내적의 결과는 벡터가 아닌 하나의 숫자(스칼라 값)입니다.
이때, $\cos \theta$ 값이 1이면 두 벡터의 방향이 완전히 같아서 내적 값이 최대가 되며, $\cos \theta$값이 0이면 두 벡터가 수직이므로 내적 값이 0, $\cos \theta$값이 -1이면 두 벡터가 반대 방향이므로 내적 값이 최소가 됩니다.

성분(좌표) 기반의 정의

벡터의 각 성분(Component)을 이용해 내적을 계산하는 방법은 다음과 같습니다.
$A \cdot B = AxBx ​+ AyBy​$

이 공식은 벡터의 각 성분(Component)을 이용해 내적을 계산하는 방법입니다.

두 내적 공식이 동일한지 증명하면 아래와 같습니다.
삼각함수를 사용하면, 두 벡터 사이의 각도 $\theta$에 대한 코사인 값은 다음과 같이 정의됩니다.
$\cos \theta = \frac{A \cdot B}{\vert A \vert \vert B \vert}$
$\cos \theta = \frac{A_x B_x + A_y B_y}{\vert A \vert \vert B \vert}$
$AxBx + AyBy = \vert A \vert \vert B \vert \cos \theta$

즉, 좌표 기반 내적 공식과 기하학적 내적 공식이 정확히 동일한 것을 증명할 수 있습니다.

내적의 활용

내적은 게임 개발에서 시야 판별, 방향 판정, 충돌 감지, 타격 판정, 카메라 시스템 등 다양한 곳에서 사용됩니다.

플레이어와 대상 물체 간의 전후방 판별

내적을 활용하면 대상이 플레이어의 앞쪽인지, 뒤쪽인지 쉽게 판별할 수 있습니다.

다음과 같이 벡터를 정의해봅시다.

  • 플레이어 위치: $P(x_p, y_p)$
  • 플레이어의 정면(시선) 방향(Forward Vector): $F = (F_x, F_y)$
  • 대상의 위치: $T(x_t, y_t)$

그러면 플레이어에서 타겟 방향을 나타내는 벡터는 다음과 같이 정의할 수 있습니다.
$T - P = (x_t - x_p, y_t - y_p)$

해당 벡터와 플레이어의 정면(시선) 방향의 벡터의 내적은 다음과 같이 나타낼 수 있습니다.
$F \cdot (T - P) = F_x(x_t - x_p) + F_y(y_t - y_p)$

대상이 전방에 있을 때($\theta = 0^\circ$)

  • 플레이어 위치: $P=(0,0)$
  • 플레이어 정면 방향 벡터: $F=(1,0)$ (오른쪽을 바라봄)
  • 대상 위치: T= $(3,0)$ (플레이어 앞쪽)

타겟 방향 벡터 계산
$T − P = (3 − 0, 0 − 0) = (3, 0)$

내적 계산
$F \cdot (T − P) = (1, 0) \cdot (3, 0) = (1 \times 3) + (0 \times 0) = 3$

내적 값이 양수로 나옵니다.
앞서 정의에서 확인하였듯이 내적 값이 양수면 대상은 전방에 위치합니다.

대상이 후방에 있을 때($\theta = 180^\circ$)

  • 플레이어 위치: $P = (0, 0)$
  • 플레이어 정면 방향 벡터: $F = (1, 0)$ (오른쪽을 바라봄)
  • 대상 위치: T = $(-3, 0)$ (플레이어 뒤쪽)

타겟 방향 벡터 계산
$T − P = (−3 − 0, 0 − 0) = (−3 , 0)$

내적 계산
$F \cdot (T − P) = (1, 0) \cdot (-3, 0) = (1 \times -3) + (0 \times 0) = -3$

내적 값이 음수로 나옵니다.
앞서 정의에서 확인하였듯이 내적 값이 음수면 대상은 후방에 위치합니다.

대상이 정확한 좌측에 있을 때($\theta = 90^\circ$)

  • 플레이어 위치: $P = (0, 0)$
  • 플레이어 정면 방향 벡터: $F = (1, 0)$ (오른쪽을 바라봄)
  • 대상 위치: T = $(0, 3)$ (플레이어 왼쪽)

타겟 방향 벡터 계산
$T − P = (0 − 0, 3 − 0) = (0 , 3)$

내적 계산
$F \cdot (T − P) = (1, 0) \cdot (0, 3) = (1 \times 0) + (0 \times 3) = 0$

내적 값이 0으로 나옵니다.
앞서 정의에서 확인하였듯이 내적 값이 0이면 대상은 측면에 위치합니다.

이때 왼쪽인지 오른쪽인지에 대한 판별은 외적(Cross Produc)이라는 개념으로 가능합니다.

시야각(FOV) 내에 물체가 있는지 판별

게임에서 플레이어의 시야각(Field of View, FOV) 내에 오브젝트가 포함되는지 확인하는 것은 AI의 적 탐지, 슈팅 게임에서의 타겟팅, 경비 시스템 등에서 중요한 요소입니다.
이때, 내적을 활용하면 대상이 플레이어의 시야각 내에 있는지 판별할 수 있습니다.

다음과 같이 벡터를 정의해봅시다.

  • 플레이어 위치: $P(x_p, y_p)$
  • 플레이어의 정면(시선) 방향(Forward Vector): $F = (F_x, F_y)$
  • 대상의 위치: $T(x_t, y_t)$

그러면 플레이어에서 타겟 방향을 나타내는 벡터는 다음과 같이 정의할 수 있습니다.
$D = T - P = (x_t - x_p, y_t - y_p)$

이제 플레이어의 정면 벡터 $F$와 타겟 방향 벡터 $D$의 내적을 이용하여 대상이 시야각 내에 있는지 판별할 수 있습니다.
두 벡터의 내적과 코사인 값을 이용하여 시야각을 판별할 수 있습니다.
$\cos \theta = \frac{F \cdot D}{\vert F \vert \vert D \vert} = \frac{F_x D_x + F_y D_y}{\vert F \vert \vert D \vert}$

위 식에서 $\theta$는 플레이어의 정면 벡터 $F$와 타겟 방향 벡터 $D$가 이루는 각도입니다.
플레이어가 볼 수 있는 전체 시야의 각도를 $FOV$ 라고 할 때, 대상이 시야 내에 있으려면 다음 조건을 만족해야 합니다.
$\cos \theta \geq \cos \left(\frac{FOV}{2}\right)$

이 때, 2로 나누는 이유는 시야각이 90도라고 할 때, 일반적으로 시야각을 두 개의 대칭된 영역으로 나누기 때문입니다.
다시 말해, 전체 시야각은 90이지만 정면을 기준으로 양쪽으로 각각 45도를 차지하기 때문에 대상이 시야 내에 있으려면 $\pm 45^\circ$ 범위 안에 있어야 합니다.
이에 시야각을 2로 나눈 값을 기준으로 계산을 한 것입니다.
이 때, 계산한 내적 값이 시야각의 코사인 값 이상이면, 대상은 시야 내에 포함됩니다.

$\cos \theta$는 각도가 작을수록 값이 커지고, 각도가 클수록 값이 작아지는 성질이 있습니다.
즉, $\cos \theta$가 크다는 것은 벡터가 더 정면을 향하고 있다는 의미입니다.

  • 플레이어 위치: $P = (0, 0)$
  • 플레이어 정면 방향 벡터: $F = (1, 0)$ (오른쪽을 바라봄)
  • 시야각: 90도
  • 대상 위치: $T = (2, 1)$

타겟 방향 벡터 계산
$D_1 = T_1 - P = (2 - 0, 1 - 0) = (2, 1)$

내적 계산 및 코사인 값 비교
$ \cos \theta = \frac{(1,0) \cdot (2,1)}{\vert (1,0) \vert \vert (2,1) \vert} = \frac{(1 \times 2 + 0 \times 1)}{\sqrt{1^2 + 0^2} \times \sqrt{2^2 + 1^2}} = \frac{2}{1 \times \sqrt{5}} = \frac{2}{\sqrt{5}} \approx 0.89 $

시야각 90도의 임계값은 $\cos(45^\circ) = \frac{\sqrt{2}}{2} \approx 0.707$입니다.
대상 $T$의 코사인이 값 $0.89$가 $0.707$보다 크므로 시야 내에 있다는 것을 알 수 있습니다.

Date:     Updated:

카테고리:

태그:

Math 카테고리 내 다른 글 보러가기

댓글남기기