Posts 게임 수학 - 벡터의 내적과 외적
Post
Cancel

게임 수학 - 벡터의 내적과 외적

내적


특징

  • 내적은 벡터의 차원에 관계 없이, 동일한 차원의 벡터끼리 가능하다.
  • 내적의 결과는 스칼라 값이다.
  • 벡터 A, B의 내적은 AB에(또는 BA에) 투영시킨 후 두 벡터의 길이를 곱한 것과 같다.
  • 내적은 교환 법칙, 결합 법칙이 성립한다.


주어진 벡터

\[\begin{flalign*} \quad A = (a_{x} \, , \,\, a_{y} \, , \,\, a_{z}) && \end{flalign*}\] \[\begin{flalign*} \quad B = (b_{x} \, , \,\, b_{y} \, , \,\, b_{z}) && \end{flalign*}\]


내적 연산

\[\begin{flalign*} \quad A \cdot B = a_{x} \cdot b_{x} + a_{y} \cdot b_{y} + a_{z} \cdot b_{z} && \end{flalign*}\] \[\begin{flalign*} \quad \,\, A \cdot B = |A| |B| cos\theta && \end{flalign*}\]


내적의 활용


[1] 두 벡터의 각도 관계 판별하기

image

  • 두 벡터의 내적 결과가 0보다 크면 두 벡터가 이루는 각도는 예각이다.
  • 두 벡터의 내적 결과가 0이면 두 벡터가 이루는 각도는 직각이다.
  • 두 벡터의 내적 결과가 0보다 작으면 두 벡터가 이루는 각도는 둔각이다.


[2] 두 벡터의 사잇각 계산하기

image

\[\begin{flalign*} \quad A \cdot B = |A| |B| cos\theta && \end{flalign*}\] \[\begin{flalign*} \quad \therefore \theta = cos^{-1}(\frac{A \cdot B}{|A| |B|}) && \end{flalign*}\]


[3] 다른 벡터에 투영하기

image

\[\begin{flalign*} A' = |A| cos\theta \, \cdot \, \frac{B}{|B|} && \end{flalign*}\] \[\begin{flalign*} \quad = |A||B| cos\theta \, \cdot \, \frac{B}{|B|^{2}} && \end{flalign*}\] \[\begin{flalign*} \quad = \frac{A \cdot\ B}{|B|^{2}} B && \end{flalign*}\]


\[\begin{flalign*} |B|가 \, 1인 \, 경우, && \end{flalign*}\] \[\begin{flalign*} \quad A' = (A \cdot B) \, B && \end{flalign*}\]


[4] 평면에 투영하기

image

V : 벡터
N : 평면의 법선 벡터(크기 1)
V’ : 법선 벡터(N)에 투영된 V 벡터
P : 평면에 투영된 V 벡터


벡터 V를 법선 벡터 N에 투영한다.

image

\[\begin{flalign*} \qquad V' = (V \cdot N) \, N && \end{flalign*}\]


벡터 V에서 V'을 뺀다.

image

\[\begin{flalign*} \qquad P = V - V' && \end{flalign*}\]


하나의 식으로 정리하면 다음과 같다.

\[\begin{flalign*} \qquad P = V - (V \cdot N) \, N && \end{flalign*}\]


외적


특징

  • 벡터의 외적은 3차원 벡터끼리만 가능하다.
  • 외적의 결과는 벡터 값이다.
  • 두 벡터를 외적한 결과는 두 벡터 모두에 수직인 벡터와 같다.
  • 외적은 교환 법칙, 결합 법칙이 성립하지 않는다.
  • 좌표계 종류(왼손, 오른손)에 따라 외적 결과 벡터의 방향이 달라진다.


주어진 벡터

\[\begin{flalign*} \quad A = (a_{x} \, , \,\, a_{y} \, , \,\, a_{z}) && \end{flalign*}\] \[\begin{flalign*} \quad B = (b_{x} \, , \,\, b_{y} \, , \,\, b_{z}) && \end{flalign*}\]


외적 연산

\[\begin{flalign*} \quad A \times B = \begin{vmatrix} i & j & k \\ a_{x} & a_{y} & a_{z} \\ b_{x} & b_{y} & b_{z} \end{vmatrix} \\ && \end{flalign*}\] \[\begin{flalign*} \qquad \qquad = i \begin{vmatrix} a_{y} & a_{z} \\ b_{y} & b_{z} \end{vmatrix} - j \begin{vmatrix} a_{x} & a_{z} \\ b_{x} & b_{z} \end{vmatrix} + k \begin{vmatrix} a_{x} & a_{y} \\ b_{x} & b_{y} \end{vmatrix} \\ && \end{flalign*}\] \[\begin{flalign*} \qquad \quad = (a_{y} \cdot b_{z} - a_{z} \cdot b_{y} \, , \, \, a_{z} \cdot b_{x} - a_{x} \cdot b_{z} \, , \, \, a_{y} \cdot b_{z} - a_{z} \cdot b_{y})&& \end{flalign*}\]


외적의 활용


[1] 두 벡터에 수직인 벡터 계산하기

image

두 벡터의 외적 결과는 두 벡터 모두에 수직인 벡터이며,

순서를 바꾸어 연산할 경우 반대 방향으로 수직인 벡터를 얻을 수 있다.

\[\begin{flalign*} \quad A \times B = -B \times A && \end{flalign*}\]


[2] 외적 결과 벡터의 길이 구하기


두 벡터 A, B를 외적한 벡터의 길이는 다음과 같이 계산할 수 있다.

\[\begin{flalign*} \quad |A×B| = |A| |B| sin\theta && \end{flalign*}\]


[3] 평면의 법선 벡터 구하기

image

세 개의 점을 알고 있을 때,

image

세 개의 점 중 두 개를 지나는 서로 다른 벡터를 외적하여 평면의 법선 벡터를 손쉽게 구할 수 있다.


[4] 벡터의 좌우 관계 판별하기

image

F : 전방(Forward) 벡터
U : 상단(Up) 벡터
V : 좌우 관계를 판별할 벡터


\[\begin{flalign*} \quad k = (F \times V) \cdot U && \end{flalign*}\]
  • k > 0이면 벡터 V는 좌측을 향한다.
  • k = 0이면 벡터 V는 중앙을 향한다. (FU가 이루는 평면에 포함된다.)
  • k < 0이면 벡터 V는 우측을 향한다.


[5] 오브젝트의 로컬 축 벡터 구성하기

image

v : 정규화되지 않은 전방 벡터(주어진 벡터)
Y : 월드 Y 벡터(주어진 벡터)


  • local Z : v 벡터 정규화
  • local X : localZ × worldY
  • local Y : localZ × localX


[6] 삼각형의 내부, 외부 판별하기

image

벡터 AB, BC, CA 중 두 개의 벡터를 외적하여

A, B, C가 이루는 평면의 법선 벡터 N을 구한다.


위의 [3] 방법을 통해 판별하여,

P가 벡터 AB, BC, CA에 대해 각각 모두 좌측에 위치한 경우

P는 삼각형 ABC의 내부에 있다고 판단할 수 있다.


Note

실제로 사용하기에는 성능이 매우 떨어지므로,

아핀 조합에 의한 방정식

\[\begin{flalign*} \quad P = aA + bB + (1 - a - b)C && \end{flalign*}\]

에 대해

a, b, a + b가 모두 [0, 1] 범위 내에 있다면

P는 삼각형 내부에 있는 것으로 판정하는 방법을 사용한다.


추가



[1] 벡터 삼중곱

  • 라그랑주 공식 또는 백캡 규칙(BAC-CAB rule) 이라고도 한다.
  • 외적은 결합법칙이 성립하지 않으므로 A×(B×C)(A×B)×C와 다르다.


\[\begin{flalign*} \quad A \times (B \times C) \,\,\,\, = \, B(A \cdot C) - C(A \cdot B) && \end{flalign*}\] \[\begin{flalign*} \quad \begin{matrix} (A \times B) \times C &=& -C \times (A \times B) \qquad\quad \\ &=& -A(B \cdot C) - B(A \cdot C) \end{matrix} && \end{flalign*}\]


[2] 스칼라 삼중곱

image

  • 스칼라 삼중곱의 절댓값을 통해 위 평행 육면체의 부피를 구할 수 있다.


\[\begin{flalign*} \quad \begin{matrix} V &=& ||B \times C|| \, ||A|| \, cos \phi \\ &=& |A \cdot (B \times C)| \qquad \end{matrix} && \end{flalign*}\]


References


This post is licensed under CC BY 4.0 by the author.