- 게임 콘텐츠가 만들어지는 과정 이해
1. 로컬 공간 : 게임에서 사용하는 각 물체를 기획하고 개별 물체의 공간을 모델링으로 표현한다.
- 로컬 공간에서 모델링한 결과물은 삼각형의 정보를 모아둔 데이터인 메시(Mesh) 데이터로 변환되어 게임 엔진에 들어간다. 게임 엔진에서는 메시 데이터를 세 개의 정점으로 구성된 삼각형으로 분해된다.
2. 월드 공간 : 게임 제작자들은 이렇게 구성된 물체들이 모인 게임의 공간, 게임 스테이지를 구축한다.
3. 카메라 공간 : 스테이지 구성이 완료되면 플레이어를 월드에 배치하고, 캐릭터에 배치된 카메라를 사용해서 월드를 탐험하게 된다. 이때 카메라에 보여지는 영역에 속한 물체만 걸러내는 작업이 있다.
이를 프러스텀 컬링(Frustum Culling)이라고 한다. 이는 게임이 60fps를 달성할 수 있도록 최적화하기 위해 구현하는 기본적인 기법이다.
이렇게 카메라에 보여질 물체를 걸러주고 그 물체의 메시 데이터를 분석해서 그래픽 카드에 넘겨주면 최종적인 게임 화면이 완성된다.
게임이 시작되면 프레임마다 월드 공간이 사용자 입력과 지정 로직에 따라 시뮬레이션 되고(게임 로직), 이 프레임이 수행할 시뮬레이션이 완성되면 카메라에 보여지는 물체를 걸러내서 렌더링을 진행하게 된다(렌더링 로직).
1. 게임 로직 : 물체의 배치 설정 (=벡터의 수학. 특수한 경우를 제외하고는 점에 대한 수학을 쓸 일이 별로 없다.)
2. 렌더링 로직 : 화면에 그릴 데이터 설정 (= 공간의 수학과 점의 수학)
게임에서 물체가 이동하는 것(게임 로직)은 물체를 구성하는 점이 이동하는 것이 아니라 물체가 담긴 공간이 이동하는 것이다. 따라서 점을 다루는 것이 아니라, 평행이동한 공간의 원점과 그 공간을 구성하는 중심축의 변환에 대해서만 신경쓰면 된다.
이처럼 공간의 변환을 설정하는 것을 트랜스폼(Transform)이라고 한다.
트랜스폼(Transform)이란?
- 크기, 회전, 위치를 순서대로 조합한 변환
트랜스폼의 최종 정보는 내부적으로는 행렬로 구성되어 있지만, 게임 로직에서는 행렬의 정보를 사용하지 않고 크기, 위치, 회전에 대한 정보만 관리하면 이 다음에 진행하는 렌더링 로직에서는 이를 기반으로 행렬을 구성하고 고속으로 필요한 변환을 한번에 처리한다.
벡터에 대한 수학이란 개별 물체가 가진 크기, 위치, 회전을 계산하는 수학이라고 할 수 있다.
대부분의 게임엔진을 사용해 게임을 제작하는 과정은 이 3가지 데이터를 정하는 경우가 대부분이므로 실질적인 게임 개발에서는 이 벡터에 대한 수학을 주로 사용하게 된다.
보통 게임에서 벡터를 사용한다고 하면 기본 물리 공식을 사용해서 점프, 포물선 등을 구현하는 것을 떠올릴 수 있지만, 그 전에 벡터를 사용하기 위해서는 기본적으로 벡터의 연산을 통해 벡터와 스칼라가 상호 순환하는 시스템의 원리에 대해 이해해야 한다.
- 벡터의 연산
벡터의 연산 종류는 다음과 같다.
1. 벡터와 벡터의 덧셈 (기본)
2. 벡터와 스칼라의 곱셈 (기본)
3. 벡터의 내적 (응용)
4. 벡터의 외적 (응용)
스칼라(Scalar)란?
- 사칙 연산이 가능한 수 집합의 원소
- 우리가 일상생활에서 사용하는 실수가 바로 스칼라라고 할 수 있다.
- 벡터의 기본 연산
1. 벡터의 덧셈
v1 = (x1, y1), v2 = (x2, y2)
v1 + v2 = (x1 + x2, y1 + y2)
(1,2) + (3,1) = (4, 3)
벡터의 덧셈은 각 축의 크기만큼 평행 이동한 결과를 도출한다.
2. 벡터와 스칼라의 곱셈
v = (x, y)
av = (ax, ay)
벡터와 스칼라의 곱셈은 벡터가 가지고 있는 고유한 성질(=평면의 기울기)를 유지한 상태에서 원점으로부터의 크기를 조절하는 역할을 한다.
* 선형 조합(Linear Combination)
a1v1 + a2v2 + a3v3 + ... + anvn = v
평면의 경우, 평행하지 않은 두 기저벡터에 대해 위의 두 연산을 조합한 선형 조합을 사용하면 평면에 있는 모든 벡터를 생성할 수 있다. 즉, 어떤 벡터를 생성해낼 수 있는 시스템을 구축할 수 있게 된다.
따라서 이 두 연산을 벡터의 기본 연산이라고 한다.
이 조합에서 사용되는 가장 기본적인 벡터는 X축에 해당하는 (1, 0)과 Y축에 해당하는 (0, 1)이다.
이 둘을 조합하면 평면 공간에 있는 모든 벡터를 생성할 수 있게 된다.
따라서 이 두 벡터를 기저(Basis)에서 가장 기본적인 기저 벡터인 표준기저벡터(Standard Basis Vector)라고 한다.
그러나 이를 응용해 뭔가를 표현하기에는 부족하다.
따라서 벡터를 다양하게 응용할 수 있는 별도의 연산을 사용하는데, 그것이 바로 벡터의 내적과 외적이다.
- 벡터의 내적과 외적
벡터의 내적과 외적은 셰이더와 게임 로직을 아우르는 게임 제작의 과정의 전반에서, 벡터를 응용하는데 사용하는 거의 대부분의 공식에서 활용되는 유용한 연산이다.
1. 벡터의 내적
v1 = (x1, y1, z1), v2 = (x2, y2, z2)
v1 · v2 = x1x2 + y1y2 + z1z2
3차원 벡터 내적 연산을 사용하면 각 축의 요소를 곱한 다음 이들을 각각 더해주면 된다.
이런 내적 공식은 컴퓨터가 굉장히 빨리 계산할 수 있고, 많은 곳에서 활용할 수 있다.
내적을 사용하면 다음과 같은 일을 할 수 있다.
- 내적의 활용법
1. 두 물체가 서로 직교(직선과 직선 사이에 90도 각도를 이룸)하고 있는지 판별
2. 물체가 나(타겟)을 기준으로 앞쪽에 있는지 뒷쪽에 있는지 판별
3. 어떤 시야각이 주어졌을 때 이 시야각 영역에 물체가 안에 들어와있는지 밖에 있는지 판별
4. 어떤 벡터를 다른 벡터에 투영시켜 평면을 이루고, 그 평면이 모여 하나의 절두체를 구성하게 함
내적의 또 다른 중요한 용도는 어떤 벡터를 다른 벡터에 투영시킬 때이다.
이 내적의 투영 공식으로부터 평면의 방정식이 유도되며 각 평면이 모여 하나의 절두체를 이루게 된다.
절두체란?
- 카메라에 보여지는 영역
이 절두체를 기준으로 카메라가 보는 영역 안에 있는 물체만 걸러낼 수 있는 수학 공식과 알고리즘이 만들어진다.
2. 벡터의 외적
v1 = (x1, y1, z1), v2 = (x2, y2, z2)
v1 X v2 = (y1z2-y2z1, z1x2-z2x1, x1y2-x2y1)
- 내적과의 차이점으로 알아보는 벡터의 외적 특징
1. 벡터의 내적 연산은 어떤 차원에서든지 다 계산이 가능하지만, 벡터의 외적 연산은 3차원에서만 가능
2. 내적은 직교성을 판별하는데 사용하지만 외적은 평행성을 판별하는데 사용
3. 내적은 앞/뒤를 판별하는데 사용하지만 외적은 좌/우를 판별하는데 사용
= 벡터의 외적은 내적에서 부족한 부분을 보충해주는 상호 보완 성질을 가지고 있다.
따라서 이 둘을 조합하면 다양한 문제를 해결할 수 있다.
벡터의 외적을 응용하면 두 개의 벡터가 만들어내는 벡터에 수직인 벡터를 만들어낼 수 있다.
평행하지 않은 두 벡터의 조합은 평면을 만든다. 여기에 수직인 벡터, 즉 평면의 방향을 외적을 통해 파악할 수 있다.
이러한 과정을 거치면 3차원 공간을 구성하는 3가지 축을 외적을 사용해 계산할 수 있게 된다. (입사 시험 단골 문제)
'수학 > [강의] 게임 수학의 이해' 카테고리의 다른 글
회전의 수학 : 사원수 (0) | 2023.07.24 |
---|---|
회전의 수학 : 삼각함수와 회전변환 (0) | 2023.07.24 |
물체의 수학 : 삼각형과 정점 (점, 면에 대한 수학) (0) | 2023.07.24 |
물체의 수학 : 이동 변환 구현 원리 (0) | 2023.07.24 |
공간의 수학 : 개요 (0) | 2023.07.21 |