[게임수학] 9-1. 외적(Cross product)

2025. 11. 11. 19:08·게임수학
728x90

→ 이 글은 「이득우의 게임 수학」을 바탕으로 작성했습니다.

■ 벡터의 외적(Cross product)

벡터의 외적(Cross product)은 내적과 달리 오로지 3차원 공간의 벡터에만 사용 가능한 연산이다.

벡터의 외적은 $\times$기호를 사용하며, 두 3차원 벡터 $\vec u, \vec v$의 외적 결과는 아래와 같다.

$$ \vec u = (u_x, u_y, u_z) \ \ \ \vec v = (v_x, v_y, v_z) \\ \vec u \times \vec v = (u_yv_z - v_yu_z, u_zv_x -v_xu_z,u_xv_y -v_xu_y) $$

[두 벡터의 외적 결과]

  • 두 3차원 벡터의 외적 결과는 언제나 3차원 벡터이다.
  • 계산식 패턴은 $x$성분의 결과를 만들기 위해 관련없는 나머지 두 성분 $y,z$를 결합해 만든다.
  내적 외적
계산 결과 스칼라 벡터
교환 법칙 성립함 성립하지 않음
결합 법칙 성립하지 않음 성립하지 않음
분배 법칙 성립함 성립함

[벡터의 내적과 외적의 차이]

$$ \vec u \times \vec v \ne \vec v \times \vec u \\ \vec u \times \vec v = -\vec v \times \vec u $$

외적은 뺄셈을 사용하기 때문에 교환법칙이 성립하진 않지만, 두 순서를 바꿔 계산하면 반대 방향의 벡터가 나온다.

 

$$ \vec u\times(\vec v \times \vec w) \ne (\vec u\times\vec v) \times \vec w \\ \vec u\times(\vec v +\vec w) = \vec u \times \vec v + \vec u \times \vec w $$

또한 외적은 결합법칙이 성립하지 않지만, 덧셈에 대한 분배 법칙은 성립한다.

 

내적은 같은 위치의 요소만 사용하고, 외적은 다른 위치의 요소만 사용하기 때문에 각 연산이 가지는 부족한 부분을 상호보완하는 기능으로 활용된다.

 

■ 외적의 성질

1. 평행성 판별

동일한 벡터를 내적하면 벡터 크기를 제곱한 결과가 나오는데, 동일한 벡터를 “외적”하는 경우는 어떤 결과가 나오는지 확인해 보자.

$$ \vec{u} \times \vec{u}= (u_y u_z - u_y u_z,\; u_z u_x - u_z u_x,\; u_x u_y - u_x u_y)= (0,\; 0,\; 0) $$

[동일한 벡터의 외적]

임의의 벡터$\vec u = (u_x, u_y, u_z)$로 설정하고 동일한 벡터를 외적 하면 그 결과는 항상 영벡터가 나온다.

 

$$ \vec{u} \times -\vec{u}= (-u_y u_z + u_y u_z,\; -u_z u_x + u_z u_x,\; -u_x u_y + u_x u_y)= (0,\; 0,\; 0) $$

[반대 방향의 외적]

$\vec u$와 반대 방향을 가진 벡터 $-\vec u$의 결과 역시 그 결과는 항상 영벡터가 나온다.

 

$$ \vec{u} \times \vec{v}= (k u_y u_z - k u_y u_z,\; k u_z u_x - k u_z u_x,\; k u_x u_y - k u_x u_y) $$

[크기가 다른 평행반 벡터의 외적]

$\vec u$와 평행하지만 크기가 다른 벡터 $\vec v = k\cdot\vec u$를 외적 한 결과도 역시 영벡터가 나온다.

  • 이러한 외적의 성질로 인해 내적과 반대로 두 벡터의 평행성을 판별하는 데 사용된다.

[벡터의 성분 분리]

외적의 성질을 알아보기 위해 $\vec u$를 $\vec v$에 수평인 벡터$(\vec{u}{\parallel})$와 $\vec v$에 수직인 벡터$(\vec{u}{\perp})$로 분리해 보자.

 

그렇다면 벡터 $\vec u$는 $\vec{u} = \vec{u}{\parallel} + \vec{u}{\perp}$로 표현할 수 있다. 이제 이 상태에서 두 벡터를 외적 해보자.

$$ \vec v\times \vec u = \vec v\times(\vec{u}{\parallel} + \vec{u}{\perp}) \\ = \vec v\times\vec{u}{\parallel} + \vec v\times \vec{u}{\perp} $$

여기서 벡터 $\vec v$와 평행한 벡터 $\vec{u}_{\parallel}$의 외적 결과는 항상 영벡터가 되므로, 위 식은 아래와 같이 간단하게 정리된다.

$$ \vec v\times \vec u = \vec v \times \vec{u}_{\perp} $$

  • 따라서 외적은 어떤 벡터에 직교하는 벡터 성분만 사용되는 성질이 존재한다.

🤔 어떤 벡터 $\vec u$가 임의의 벡터 $\vec v$에 수직인 성분, 수평인 성분으로 이루어질 수 있는 이유는 뭔가요?

$$ \vec{u} = \vec{u}{\parallel} + \vec{u}{\perp} $$

  • $\vec{u}_{\parallel}$ : 벡터 $\vec v$에 평행한 성분.
  • $\vec{u}_{\perp}$ : 벡터 $\vec v$에 수직인 성분.

3차원 공간에서 임의의 벡터는 다른 한 벡터를 기준으로 한 평면 위에서 항상 “평행 방향 + 수직 방향”의 조합으로 표현되기 때문이다.

  • 더 자세한 내용은 해당 참고 : https://hate-errorlog.tistory.com/36
 

[게임수학] 6-2. 투영 벡터, Vector3.ProjectOnPlane()

→ 이 글은 「이득우의 게임 수학」을 바탕으로 작성했습니다.■ 투영 벡터벡터의 투영이란, 투영할 벡터$(\vec v)$ 가 기준 벡터$(\vec u)$ 방향으로 얼마나 기여하는지를 나타내는 벡터를 구하는

hate-errorlog.tistory.com


[크기는 같지만 사잇각이 다른 두 벡터의 수직 성분 크기 비교]

두 개의 벡터$(\vec v, \vec u)$가 있을 때, 벡터$\vec u$를 $\vec v$에 대해 직교(수직) 방향으로 분해한 성분$(\vec{u}_{\perp})$의 크기는 두 벡터가 이루는 사잇각$\theta$에 비례한다.

 

이는 삼각함수 관계에서,

$$ \sin\theta = \frac{수직\ 성분의\ 길이}{|\vec u|} $$

로 정의되는데, 이는 곧 외적의 크기가 $\sin$함수에 비례한다는 의미이다. 이를 확인해 보기 위해 아래 3가지 식을 전개하여 확인해 보자.

🤔 수직 성분의 제곱. $(|\vec u \times \vec v|)^2$

$$ \begin{align*} \|\vec{u} \times \vec{v}\|^2 &= (\vec{u} \times \vec{v}) \cdot (\vec{u} \times \vec{v}) \\ &= (u_y v_z - u_z v_y)^2 + (u_z v_x - u_x v_z)^2 + (u_x v_y - u_y v_x)^2 \\ &= u_y^2 v_z^2 - 2u_y u_z v_y v_z + u_z^2 v_y^2u_z^2 v_x^2 - 2u_z u_x v_z v_x + u_x^2 v_z^2 \\ &\quad + u_x^2 v_y^2 - 2u_x u_y v_x v_y + u_y^2 v_x^2 \end{align*} $$

 

🤔 평행 성분의 제곱. $(|\vec u||\vec v|)^2$

$$ \begin{align*}(|\vec{u}||\vec{v}|)^2 &= \left( \sqrt{u_x^2 + u_y^2 + u_z^2} \sqrt{v_x^2 + v_y^2 + v_z^2} \right)^2 \\&= (u_x^2 + u_y^2 + u_z^2)(v_x^2 + v_y^2 + v_z^2) \\&= u_x^2 v_x^2 + u_x^2 v_y^2 + u_x^2 v_z^2 + u_y^2 v_x^2 + u_y^2 v_y^2 + u_y^2 v_z^2 + u_z^2 v_x^2 + u_z^2 v_y^2 + u_z^2 v_z^2\end{align*} $$

 

 

🤔 전체 성분의 제곱. $(\vec u\cdot \vec v)^2$

 

$$ \begin{align*}(\vec{u} \cdot \vec{v})^2 &= (u_x v_x + u_y v_y + u_z v_z)^2 \\&= u_x^2 v_x^2 + u_y^2 v_y^2 + u_z^2 v_z^2    + 2u_x u_y v_x v_y + 2u_x u_z v_x v_z + 2u_y u_z v_y v_z\end{align*} $$

위 3개의 식 결과를 비교하면, 다음과 같은 관계를 가지는 것을 알 수 있다.

 

$$ |\vec u \times \vec v|^2 = (|\vec u||\vec v|)^2 - (\vec u \cdot \vec v)^2 $$

[식 - 1]

어디서 많이 본 수식 아닌가? 이 수식의 형태를 쫌만 바꿔보면,

$$ (\vec u \cdot \vec v)^2 = (|\vec u||\vec v|)^2 + (|\vec u \times \vec v|^2) $$

즉, 전체 성분의 제곱 = 수평 성분의 제곱 + 수직 성분의 제곱인 피타고라스 정리의 벡터 버전이 만들어진다.

 

위 [식 - 1]의 내적$\vec u\cdot \vec v$를 코사인 공식으로 바꿔 전개해 보면 아래와 같이 된다.

「벡터 외적의 크기」
[두 벡터가 이루는 평행사변형의 넓이]

이로써 벡터 외적의 크기는 $\sin$ 함수에 비례함을 알 수 있다. 그리고 외적으로 생성된 벡터의 크기는 위와 같이 두 벡터가 만드는 평행사변형의 넓이로 나타낼 수 있다.

  • 행렬식이 만들어내는 넓이와 동일.

❓외적과 내적의 차이

구분 내적 외적
결과 스칼라(숫자) 벡터(3차원)
의미 두 벡터가 얼마나 같은 방향인지 (평행 성분) 두 벡터가 얼마나 수직으로 벌어져 있는지 (직교 성분)
삼각함수 $\cos\theta$ $\sin\theta$

 

2. 법선 벡터

$$ \vec{u} \times \vec{v}= \left(u_y v_z - v_y u_z,\;u_z v_x - v_z u_x,\;u_x v_y - v_x u_y\right) $$

두 벡터의 외적 결과에, $\vec u$와 $\vec v$를 내적 하면 다음과 같은 결과가 나온다.

두 벡터에 대한 내적 결과가 모두 0이니, 외적의 결과는 두 벡터에 모두 직교한다는 것을 알 수 있다.

  • 따라서 두 벡터가 만들어내는 평면이 “향하는 방향”에 대한 벡터를 만들어내는 것으로 해석할 수 있다.

[법선 벡터를 생성하는 외적(오른손 법칙)]

점 3개$(P_1, P_2, P_3)$를 결합해 만든 평면에서 $P_2 - P_1 = \vec u, \ P_3 - P_1 = \vec v$ 이 두 벡터를 외적 하면, 세 점이 만들어내는 평면에 직교하는 벡터가 생성된다.

  • 이는 평면이 향하는 방향을 나타내며 이 벡터를 법선 벡터, 또는 노말 벡터라고 한다.
  • 외적은 교환법칙이 성립하지 않아, 왼손/오른손 법칙에 따라 외적의 연산 순서에 신경 써야 한다.

 

3. 좌우 판별

[외적을 통한 좌우 판별]

플레이어의 시선 방향$(\vec f)$에서, 좌측에 있는 물체로 향하는 벡터$(\vec v)$를 외적 하면, 왼손 법칙에 따라 평면의 아래쪽을 향한다.

반대로 물체가 시선 방향의 우측에 있다면, 평면의 위쪽을 향한다.

  • 이러한 외적의 특징을 사용하여 물체가 시선 방향을 기준으로 좌측에 있는지, 오른쪽에 있는지를 판별할 수 있다.

다만, 외적의 결과는 벡터이므로 참과 거짓을 구별할 수 있도록 내적을 사용하여 스칼라로 변환하면 된다.

  • 내적에 사용되는 벡터는 월드의 y축 사용. (Vector3.Up)
물체의 위치 판별식 값
물체가 시선 방향에서 왼쪽에 있는 경우 $(\vec f \times \vec v) \cdot \vec y <0$
물체가 시선 방향에서 우측에 있는 경우 $(\vec f \times \vec v) \cdot \vec y >0$
public class CrossPorduct : MonoBehaviour
{
    [SerializeField] private RotateAround target;

    private void Update()
    {
        var forward = transform.forward;
        var dir = (target.transform.position - transform.position).normalized;

        var cross = Vector3.Cross(forward, dir);
        var dot = Vector3.Dot(cross, Vector3.up);
        
        if (dot > 0)
        {
            // 우측에 존재
        }
        else
        {
		    // 좌측에 존재
        }

    }
}

[외적을 사용하여 좌/우를 판별하는 코드]

[내적(a)와 외적(b)의 부호 영역]

$\sin$함수에 비례하는 외적의 성질에 기인한다고 할 수 있다. 반면 내적은 $\cos$함수에 비례하기 때문에 앞뒤 방향 판별에 사용된다.

728x90

'게임수학' 카테고리의 다른 글

[게임수학] 9-3. 외적(3) - 삼중곱  (0) 2025.11.11
[게임수학] 9-2. 외적(2) - 카메라의 회전 행렬, 로드리게스 공식  (0) 2025.11.11
[게임수학] 8-2. 오일러 각의 단점(짐벌락, 회전 보간)  (0) 2025.10.14
[게임수학] 8-1. 오일러 각(Euler's angle)  (0) 2025.10.14
[게임수학] 7. 게임 엔진  (0) 2025.09.24
'게임수학' 카테고리의 다른 글
  • [게임수학] 9-3. 외적(3) - 삼중곱
  • [게임수학] 9-2. 외적(2) - 카메라의 회전 행렬, 로드리게스 공식
  • [게임수학] 8-2. 오일러 각의 단점(짐벌락, 회전 보간)
  • [게임수학] 8-1. 오일러 각(Euler's angle)
브라더스톤
브라더스톤
유티니, C#과 관련한 여러 정보를 끄적여둔 블로그입니다. Email : dkavmdk98@gmail.com
  • 브라더스톤
    젊은 프로그래머의 슬픔
    브라더스톤
  • 전체
    오늘
    어제
    • 개발 노트 (49)
      • Unity,C# (30)
        • Unity 정보 (7)
        • 알고리즘 (11)
        • 자료구조 (3)
        • 절차적생성(PCG) (9)
      • 게임수학 (14)
      • C++ (5)
        • 자료구조 (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    BSP
    Quaternion.AngleAxis
    최단경로찾기
    CustomWindow
    정렬알고리즘
    pcg
    transform.RotateAround
    커스텀 윈도우
    C#
    PerlinNoise
    자료구조
    알고리즘
    스택
    절차적지형생성
    이진공간분할
    UI Toolkit
    게임수학
    외적
    절차적던전생성
    unity
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
브라더스톤
[게임수학] 9-1. 외적(Cross product)
상단으로

티스토리툴바