수학 - 내적, 외적

김영웅·2025년 2월 18일

내적

내적의 정의는 다음과 같다.

A⋅B=∣A∣×∣B∣×cosθA⋅B=∣A∣×∣B∣×cos\theta

여기서 ∣A∣∣A∣와 ∣B∣∣B∣는 벡터의 길이/크기를 의미한다.

피타고라스의 정리를 이용해 벡터의 길이/크기를 구할 수 있다.

a2+b2=c2a^2 + b^2 = c^2

벡터를 하나의 직각삼각형으로 보았을 때 x는 밑변이고 y는 높이일테니 c는 빗변
즉, 길이를 의미한다.

∣A∣=Ax2+Ay2|A| = \sqrt{A_x^2 + A_y^2}


θ\theta 는 두 벡터 사이의 각도를 말한다.

θ=0∘\theta = 0^\circ 라면 두 벡터는 완전히 방향이 같다.
θ=90∘\theta = 90^\circ 라면 두 벡터는 수직을 이루어 직교한다.
θ=180∘\theta = 180^\circ 라면 두 벡터는 반대 방향을 향하고있다.

이를 -1에서 1까지 값이 나오는 cosθcos\theta 에 관련하게 나타내면 다음과 같은 값들이 나온다.

각도cosθcos\theta 값의미
0∘0^\circ1완전히 같은 방향
0∘0^\circ < θ\theta < 90∘90^\circ0 < cosθcos\theta < 1유사한 방향
90∘90^\circ0직교
90∘90^\circ < θ\theta < 180∘180^\circ-1 < cosθcos\theta < 0반대 방향에 가까움
180∘180^\circ-1완전히 반대 방향

이 내용을 지금까지 왜 알아 봤냐면
내적을 기하학적인 의미로 구하면 다음과 같다.

A⋅B=Ax​Bx​+Ay​By​A⋅B=Ax​Bx​+Ay​By​

이로인해 간단한 계산으로 우린 cosθcos\theta 의 값을 구할 수 있다.

각 벡터의 길이를 1로 만드는 normalize를 거치고 내적을 계산하면
A⋅B=1×1×cosθ=cosθA⋅B=1×1×cos\theta = cos\theta
가 되버리기 때문이다



내적이 게임에서 시야 판별, 방향 판정, 충돌 감지, 타격 판정, 카메라 시스템 등 다양한 곳에서 사용된다.
아래에서 플레이어와 대상 물체 간의 전후방 판별, 시야각 내 판별에 대해 알아보자


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

내적을 활용하면 대상이 플레이어의 앞쪽인지, 뒤쪽인지 쉽게 판별할 수 있다.
일단 2D가 쉬우므로 아래와 같이 벡터를 가정해보자

  • 플레이어 위치 : PP
  • 플레이어의 정면(시선) 방향(Forward Vector) : F=(Fx,Fy)F = (F_x, F_y)
  • 대상의 위치 : T(xt,yt)T(x_t, y_t)

1. 대상이 전방에 있을 때 ( θ=0∘\theta = 0^\circ )

아래와 같이 값을 가정한다.

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

내적 계산
F⋅D=(1,0)⋅(3,0)=(1×3)+(0×0)=3F⋅D=(1,0)⋅(3,0)=(1×3)+(0×0)=3

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


2. 대상이 후방에 있을 때 ( θ=180∘\theta = 180^\circ )

아래와 같이 값을 가정한다.

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

내적 계산
F⋅D=(1,0)⋅(−3,0)=(1×−3)+(0×0)=−3F⋅D=(1,0)⋅(−3,0)=(1×−3)+(0×0)=−3

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


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

아래와 같이 값을 가정한다.

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

내적 계산
F⋅D=(1,0)⋅(0,3)=(1×0)+(0×3)=0F⋅D=(1,0)⋅(0,3)=(1×0)+(0×3)=0

내적 값이 0으로 나온다.
앞서 정의에서 확인하였듯이 내적 값이 0이면 대상은 측면에 위치한다.
이때 왼쪽인지 오른쪽인지에 대한 판별은 외적(Cross Produc)이라는 개념으로 가능하다.


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

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

위와 똑같이 벡터를 정의해보자

  • 플레이어 위치 : P(xp,yp)P(x_p, y_p)
  • 플레이어의 정면(시선) 방향(Forward Vector) : F=(Fx,Fy)F = (F_x, F_y)
  • 대상의 위치 : T(xt,yt)T(x_t, y_t)
  • 플레이어 -> 대상 위치로 향하는 벡터 : D=T−P=(xt−xp,yt−yp)D = T - P = (x_t - x_p, y_t - y_p)

시야각 내 판별 공식

두 벡터의 내적과 코사인 값을 이용하여 시야각을 판별할 수 있다

cos⁡θ=F⋅D∣F∣∣D∣=FxDx+FyDy∣F∣∣D∣\cos\theta = \frac{F \cdot D}{|F| |D|} = \frac{F_x D_x + F_y D_y}{|F| |D|}

위 식에서 θθ 는 플레이어의 정면 벡터 FF 와 타겟 방향 벡터 DD 가 이루는 각도이다.

왜냐하면
A⋅B=∣A∣×∣B∣×cosθA⋅B=∣A∣×∣B∣×cos\theta
이기 때문에 ∣A∣∣A∣와 ∣B∣∣B∣ 가 1이라면 내적의 결과는 cosθcos\theta가 되기 때문이다.

플레이어가 볼 수 있는 전체 시야의 각도를 FOVFOV 라고 할 때, 대상이 시야 내에 있으려면 다음 조건을 만족해야 한다.
cos⁡θ≥cos⁡(FOV2)\cos\theta \geq \cos\left(\frac{\text{FOV}}{2}\right)
이 때, 2로 나누는 이유는 시야각이 90도라고 할 때, 일반적으로 시야각을 두 개의 대칭된 영역으로 즉, 45도 45도로 양쪽으로 나누기 때문이다.

이렇게 계산한 내적 값이 시야각의 코사인 값 이상이면, 대상은 시야 내에 포함된 것 이다.
아래에서 알 수 있듯이 cosθcosθ는 각도가 작을수록 값이 커지고, 각도가 클수록 값이 작아지는 성질이 있기 떄문이다.

θ\thetacosθcos\theta
0∘0^\circ1
30∘30^\circ0.866
45∘45^\circ0.707
60∘60^\circ0.5
90∘90^\circ0

외적

2차원에서의 외적의 정의는 다음과 같다.

A×B=AxBy−AyBxA \times B = A_x B_y - A_y B_x

이 값은 두 벡터가 반시계 방향인지(양수), 시계 방향인지(음수), 아니면 동일한 선상에 있는지를 판별하는 데 사용할 수 있다.


하지만 3차원에서의 외적의 정의는 더 복잡해진다.

A×B=[AyBz−AzByAzBx−AxBzAxBy−AyBx]A \times B = \begin{bmatrix} A_y B_z - A_z B_y \\ A_z B_x - A_x B_z \\ A_x B_y - A_y B_x \end{bmatrix}

두 벡터의 외적 결과는 입력 벡터와 동시에 수직(Orthogonal)한 새로운 벡터가 된다.

외적은 기하학적으로 두 벡터가 이루는 평면에 수직인 벡터, 법선 벡터를 찾는 과정이다.
이를 통해 벡터들의 방향 관계를 판별할 수 있다.

  • 2차원 공간 (평면)
    • 외적 결과가 양수면 벡터 BB 가 벡터 AA 를 기준으로 반시계 방향에 있음
    • 외적 결과가 음수면 벡터 BB 가 벡터 AA 를 기준으로 시계 방향에 있음
    • 외적 결과가 0이면 두 벡터가 동일한 선상에 있음 (일직선)
  • 3차원 공간
    • 외적의 결과는 두 벡터에 수직한 새로운 벡터를 형성함
    • 이 벡터는 오른손 법칙(Right-Hand Rule)에 따라 방향이 결정됨

오른손 법칙(Right-Hand Rule)

외적의 방향을 결정할 때 오른손 법칙을 사용한다
A×BA \times B 는 오른손의 엄지가 가리키는 방향을 따른다.

언리얼 엔진은 왼손 좌표계를 사용한다.
그러나 외적(Cross Product) 계산은 수학적으로 오른손 법칙(Right-Hand Rule)을 따르는 표준 수식을 사용한다

profile
게임 프로그래머

0개의 댓글