게임 수학 시리즈 – 외적이 중요한 이유

이전 글에서는 내적(Dot Product)이 게임 안에서 왜 중요한지를 정리해보았습니다.

특히 두 벡터가 얼마나 같은 방향을 바라보고 있는지를 계산하기 위해 내적이 사용된다는 점과, AI 시야 판정과 조명 계산 같은 다양한 시스템에서 실제로 활용된다는 점도 함께 살펴보았습니다.

이번에는 게임 수학에서 또 하나의 중요한 개념인 외적(Cross Product)을 정리해보려고 합니다.

내적이 “방향이 얼마나 비슷한가”를 계산하는 연산이었다면, 외적은 “어느 방향으로 회전하는가”와 연관되어 있습니다.

특히 3D 게임 개발에서는 외적이 굉장히 자주 등장합니다.

카메라 방향 계산과 법선 벡터 생성, 회전 방향 판정 같은 다양한 시스템들이 모두 외적 기반으로 동작하기 때문입니다.


외적(Cross Product)은 새로운 벡터를 만든다

내적은 계산 결과가 하나의 숫자(Scalar)로 나오게 됩니다.

반면 외적은 계산 결과로 새로운 벡터(Vector)를 만들어냅니다.

예를 들어 아래처럼 두 벡터가 있다고 가정해보겠습니다.

Vector3 a = { 1.0f, 0.0f, 0.0f };
Vector3 b = { 0.0f, 1.0f, 0.0f };

그리고 외적을 계산하면 아래처럼 새로운 벡터를 얻을 수 있습니다.

Vector3 result = Cross(a, b);

이 결과 벡터는 단순 방향 벡터가 아니라, a와 b 두 벡터 모두에 수직인 방향을 가지게 됩니다.

DirectX 왼손 좌표계 기준으로 외적(Cross Product) 방향을 설명하는 게임 수학 이미지
DirectX의 왼손 좌표계에서는 외적(Cross Product) 결과 방향 역시 왼손 법칙(Left Hand Rule)을 기준으로 결정됩니다. 외적 결과 벡터는 두 입력 벡터 모두에 수직인 방향을 가지게 됩니다.

즉, 외적은 두 벡터를 기준으로 새로운 수직 방향 벡터를 계산하는 연산이라고 볼 수 있습니다.


외적 방향은 좌표계에 따라 달라진다

외적에서 가장 중요한 부분 중 하나는 결과 벡터의 방향입니다.

앞서 외적의 결과로 “수직 벡터가 생성된다”고 설명 드렸습니다.

그런데 이때 필수로 고려해야하는 사항이 있습니다.

벡터의 외적 연산의 결과는 벡터 순서에 따라 완전히 달라지게 됩니다.

예를 들어 아래처럼 계산한다고 가정해보겠습니다.

Cross(a, b)

 

왼손 좌표계와 오른손 좌표계에서 외적(Cross Product) 방향 차이를 설명하는 게임 수학 이미지
외적(Cross Product)의 결과 방향은 좌표계와 벡터 순서에 따라 달라집니다.

이 경우 결과 방향은 사용하는 좌표계 기준에 따라 결정됩니다.

수학이나 OpenGL 계열에서는 일반적으로 오른손 좌표계(Right-Handed Coordinate System)를 사용합니다.

따라서 외적 결과 역시 오른손 법칙(Right Hand Rule)을 기준으로 설명하는 경우가 많습니다.

오른손의 검지를 첫 번째 벡터 방향,
중지를 두 번째 벡터 방향으로 향하게 만들면,
엄지가 외적 결과 방향을 가리키게 됩니다.

반면 DirectX는 기본적으로 왼손 좌표계(Left-Handed Coordinate System)를 사용합니다.

따라서 DirectX 기준으로 공간을 이해할 때는 왼손 법칙(Left Hand Rule) 기준으로 생각하는 편이 훨씬 자연스럽습니다.

왼손의 검지를 첫 번째 벡터 방향,
중지를 두 번째 벡터 방향으로 향하게 만들면,
엄지가 외적 결과 방향을 가리키게 됩니다.

그리고 아래처럼 벡터 순서를 바꾸면 결과 방향 역시 반대로 바뀌게 됩니다.

Cross(b, a)

따라서 외적은 좌표계와 회전 방향 개념까지 함께 연결되는 중요한 연산이라고 볼 수 있습니다.

그리고 이런 특징 때문에 외적은 회전 방향 계산과 카메라 좌표계 구성, 법선 벡터 계산 같은 다양한 시스템에서 계속 사용됩니다.


법선 벡터(Normal Vector) 계산에도 활용

게임 그래픽스에서는 표면이 어느 방향을 바라보고 있는지를 계산해야 하는 경우가 많습니다.

특히 조명 계산에서는 표면 방향 정보가 굉장히 중요합니다.

예를 들어 삼각형 표면이 있다고 가정해보겠습니다.

이 경우 삼각형 위의 두 방향 벡터를 계산한 뒤,
외적을 수행하면 표면에 수직인 방향 벡터를 얻을 수 있습니다.

예를 들어 아래처럼 사용할 수 있습니다.

Vector3 edge1 = p1 - p0;
Vector3 edge2 = p2 - p0;

Vector3 normal = Cross(edge1, edge2);

그리고 이렇게 계산된 normal 벡터가 바로 법선 벡터(Normal Vector)가 됩니다.

외적(Cross Product)을 이용한 법선 벡터(Normal Vector) 계산을 설명하는 게임 수학 이미지
삼각형 표면의 두 변(edge1, edge2)에 외적(Cross Product)을 수행하면 표면에 수직인 방향 벡터인 법선 벡터(Normal Vector)를 계산할 수 있습니다.

게임 엔진 안에서는 대부분의 조명 계산이 법선 벡터 기반으로 처리됩니다.

법선 벡터를 계산할 때 외적을 사용하는 만큼, 외적은 렌더링 시스템 전체에서도 굉장히 중요한 역할을 담당한다고 볼 수 있습니다.


카메라 방향 계산에서도 외적을 사용

3D 카메라 시스템 역시 외적(Cross Product)을 자주 사용합니다.

특히 FPS 카메라나 자유 시점 카메라에서는 카메라의 좌표계를 생성하기 위해 카메라 기준 방향 벡터들을 계속 계산해야 합니다.

카메라가 현재 어디를 바라보고 있는지, 그리고 카메라 기준 오른쪽 방향이 어디인지를 계산해야 하기 때문입니다.

보통 3D 카메라에서는 바라보는 방향인 Forward 벡터, 오른쪽 방향인 Right 벡터, 위쪽 방향인 Up 벡터를 기준으로 좌표계를 구성합니다.

그리고 이 벡터들은 서로 수직 관계를 유지해야 합니다.

예를 들어 카메라가 바라보는 방향 벡터(forward)와 위 방향 벡터(up)가 있다고 가정해보겠습니다.

이 상태에서 외적을 수행하면 카메라 기준 오른쪽 방향 벡터를 계산할 수 있습니다.

Vector3 right = Cross(forward, up);

 

외적(Cross Product)을 이용한 3D 카메라 방향 벡터 계산을 설명하는 게임 수학 이미지
3D 카메라는 Forward, Right, Up 벡터를 기준으로 좌표계를 구성합니다. 외적(Cross Product)을 이용하면 카메라의 Right 방향 벡터를 안정적으로 계산할 수 있습니다.

 

즉, 외적은 단순히 새로운 벡터를 만드는 연산이 아니라,
3D 공간 안에서 카메라 좌표계를 안정적으로 구성하기 위한 핵심 연산이라고 볼 수 있습니다.

그리고 이렇게 계산된 Right 벡터는 카메라 좌우 이동, 카메라 회전, 시점 변환, View Matrix 계산 등 다양한 곳에 활용됩니다.

결국 3D 카메라 역시 외적 기반 벡터 계산 위에서 동작한다고 볼 수 있습니다.


외적은 회전과 공간 계산의 핵심

내적(Dot Product)이 두 방향이 얼마나 비슷한지를 계산하는 연산이었다면,
외적(Cross Product)은 두 벡터 사이의 수직 관계와 회전 방향을 계산하는 데 훨씬 더 가까운 연산입니다.

그리고 이런 계산은 게임 엔진 안에서 굉장히 자주 등장합니다.

예를 들어 그래픽스에서 표면 방향을 계산하기 위해 법선 벡터(Normal Vector)를 계속 생성해야 합니다.

카메라 시스템 역시 Forward, Right, Up 벡터를 기반으로 좌표계를 유지해야 하기 때문에 외적 계산이 반복적으로 사용됩니다.

또한 물리 시스템에서는 충돌 방향과 회전 방향을 계산해야 하는 경우가 많으며,
캐릭터 이동이나 회전 처리에서도 기준 방향의 좌우 관계를 계산해야 하는 상황이 자주 발생합니다.

즉, 외적은 3D 공간 안에서 방향과 회전, 좌표계를 안정적으로 유지하기 위한 핵심 연산에 가깝습니다.

특히 게임 엔진 내부에서는 공간 자체를 벡터 기반으로 계산하기 때문에,
외적 역시 렌더링과 카메라, 물리 처리 같은 다양한 시스템에서 계속 사용됩니다.

따라서 외적은 3D 게임 개발을 이해하기 위해 반드시 익숙해져야 하는 핵심 벡터 연산 중 하나라고 볼 수 있습니다.


마무리

외적(Cross Product)은 두 벡터를 기준으로 새로운 수직 방향 벡터를 계산하는 연산입니다.

그리고 게임 개발에서는 회전 방향과 법선 벡터,
카메라 좌표계 계산 같은 다양한 시스템에서 계속 사용됩니다.

특히 3D 공간에서는 방향 관계와 좌표계를 안정적으로 계산해야 하는 상황이 굉장히 많기 때문에,
외적 역시 게임 엔진 전체에서 매우 중요한 역할을 담당하게 됩니다.

다음 글에서는 행렬(Matrix)이 왜 필요한지,
그리고 게임 엔진 안에서 이동과 회전,
카메라 변환이 어떻게 처리되는지를 이어서 정리해보겠습니다.


👉 게임 엔진 구조를 더 깊이 이해하고 싶다면

아래 강의를 통해 직접 구현해보는 것을 추천드립니다.

C++로 만드는 게임 엔진 프레임워크 강의

👉 C++로 만드는 게임 엔진 프레임워크 강의 바로가기

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다