벡터 공간

벡터 공간(Vector Space)는 벡터들이 모여 있는 집합과 그 위에서 정의된 연산(덧셈, 스칼라 곱)이 특정 성질을 만족하는 수학적 공간을 말합니다.
선형대수학에서 가장 기본적이고, 중요한 구조 중 하나입니다.

2차원 물체의 2차원 이동을 구현하기 위해서는 3차원 공간이 필요합니다.
이 3차원 공간에서 2차원은 물체를 구현하고, 나머지 1차원으로 이동을 구현합니다.

만약 3차원의 물체를 이동하기 위해서는 똑같이 4차원 공간이 필요합니다.
이 4차원 공간에서 위의 예시와 같이 3차원은 물체를 구현하고, 나머지 1차원으로 이동을 구현합니다.

아핀 공간

게임에서는 단순한 벡터 공간만 사용하는 것이 아니라, 아핀 공간(Affine Space)를 활용하기도 합니다.

아핀 공간은 점(Point)와 벡터(Vector)를 구분하면서도 함께 다룰 수 있는 물체를 표현하는 공간을 의미합니다.

점과 벡터를 구분하는 기본 연산 규칙은 다음과 같습니다.

  • 1 + 0 = 1(점 + 벡터 = 점)
  • 1 - 1 = 0(점 - 점 = 벡터)
  • 1 + 1 = ?(점 + 점 = ???)
  • 0 + 0 = 0(벡터 + 벡터 = 벡터)
  • 0 - 0 = 0(벡터 - 벡터 = 벡터)

점 + 점은 위치를 의미하는 객체를 더한다라는 개념이 수학적으로 애매하기 때문에, 아핀 공간에서 직접적으로 정의되지 않습니다.
이 점을 합성하기 위해 가중치를 주는 선형 조합을 사용하며, 이것을 아핀 조합(Affine Combination, 아핀 결합)이라고 부릅니다.

게임 개발에서는 다음과 같이 활용됩니다.

  • 좌표 변환: 월드 좌표, 로컬 좌표, 뷰 좌표 간 변환
  • 카메라 변환: 카메라 위치와 방향에 맞춰 장면을 변환
  • 모델 변환: 게임 오브젝트를 회전, 이동, 크기 조정

아핀 공간과 동차 좌표를 통해 점과 벡터를 통일된 수학적 방식으로 처리하고, 렌더링 파이프라인에서 필요한 변환을 효율적으로 수행할 수 있습니다.

동차 좌표

컴퓨터 그래픽스에서는 이러한 아핀 공간을 다루기 위해 동차 좌표(Homogeneous Coordinates)를 사용합니다.
3차원의 점 (x, y, z)은 동차 좌표계에서 (x, y, z, 1)로 표현되고, 순수한 벡터는 (x, y, z, 0)으로 표현됩니다.

마지막 차원의 값이 1인 경우 점(Point)을 의미하며, 값이 0인 경우 벡터(Vector)를 의미합니다.

아핀 공간에서 이동, 회전, 확대 및 축소 같은 변환을 모두 하나의 4x4 행렬 연산으로 처리할 수 있습니다.
즉, 아핀 공간은 게임에서 점과 벡터를 수학적으로 구분하고 다룰 수 있도록 해줍니다.

각 변환에 대한 예시는 다음과 같습니다.

  • 이동(Translation): 벡터를 점에 더한다.
  • 회전(Rotation): 점이나 벡터를 원점 기준으로 회전한다.
  • 확대/축소(Scaling): 점이나 벡터의 기리를 조정한다.

아핀 조합

아핀 조합은 물체를 구성하는데 기본이 되고, 중요한 역할을 수행합니다.

예를 들어, 두 점 $P_1$, $P_2$를 더하고자 한다면 다음과 같습니다.

$aP_1 + bP_2$
$= a(x_1, y_1, 1) + b(x_2, y_2, 1)$
$= (ax_1, ay_1, a) + (bx_2, by_2, b)$
$= (ax_1 + bx_2, ay_1 + by_2, a + b)$

결과적으로 두 점을 더한 결과는 $a + b$가 됩니다.
이때, $a + b = 1$라고 가정한다면, 두 점을 더했을 때 항상 점이 된다는 것을 알 수 있습니다.

아핀 공간에서 점으로 해석하려면 $a + b = 1$이라는 제약이 필요합니다.
그런데 항상 $aP_1 + bP_2$ 이렇게 작성하면 위의 제약을 항상 확인해야합니다.
그래서 $b = 1 - a$로 치환해서 쓰고, 이것은 자동으로 $a + b = 1$을 보장하게 됩니다.
그래서 기존 제약을 정규화(파라미터화)하여 $aP_1 + (1 - a)P_2$ 이렇게 작성하면 결과가 점이 됩니다.

이 아핀 조합의 이 공식은 점과 점을 더했을 때, 점을 보장하는 공식입니다.
그래서 두 점을 조합해서 새로운 점을 만드는 공식입니다.

이 새로운 점은 $P = aP_1 + (1 - a)P_2$를 기준으로 계수 $a$의 범위를 따라 두 점을 잇는 무한대의 선 상에 위치하게 됩니다.
이렇게 두 점을 조합해 만들어지는 선을 직선(Line)이라고 합니다.

여기서 만약 계수 $a$의 값이 0일 경우 $P_2 = 0 \cdot P_1 + (1 - 0)P_2$와 같은 식이 되고, 점 $P_2$를 가리키게 됩니다.
$a$의 값이 1일 경우 $P_1 = 1 \cdot P_1 + (1 - 1)P_2$와 같은 식이 되고, 점 $P_1$을 가리키게 됩니다.
그래서 0 이상의 값을 사용하는 경우 $P_2$에서 $P_1$으로 향하는 무한대의 직선이 만들어지게 됩니다.
이것을 반직선(Ray)이라고합니다.

해당 반직선은 게임에서 다음과 같은 용도로 사용됩니다.

  • 레이캐스팅(RayCasting): 시선 방향에 장애물이나 목표물이 있는지 감지하는 기능
  • 레이트레이싱(RayTracing): 모니터 화면에서 거꾸리 빛의 방향을 추적해 렌더링 하는 기법

점 $P_1$과 $P_2$의 $a$의 계수를 0에서 1로 제한하게 되면, 해당 점과 점까지의 선이 만들어지게 됩니다.
이것을 선분(Line Segment)이라고 합니다.

면의 경우 점을 3개를 조합하여 구성합니다.

$P = aP_1 + bP_2 + (1 - a - b)P_3$ 이와 같은 식으로 각 점에 계수를 붙이고, 끝에 값은 항상 1이 되도록 해줍니다.
이렇게, 항상 점을 보장받을 수 있도록 해주어 점 3개를 조합해 삼각형을 구성할 수 있습니다.

여기서 모든 계수의 값을 0 부터 1로 값을 제한하게 되면, 3개의 점에 대한 영역의 중앙에 위치한 점을 생성할 수 있습니다.
이 영역이 삼각형의 영역이 됩니다.

이러한 삼각형이 모여 물체를 생성하고, 면을 그려주게 되면 게임 그래픽의 기본 원리가 됩니다.
여기서 이 삼각형의 정보와 정점, 인덱스, 법선, 텍스처 좌표 등의 다양한 데이터를 가진 구조체를 메쉬라고 합니다.

물체를 그릴 때 점을 이용하지 않고, 삼각형으로 면을 만들어 그리는 이유는 점을 확대하는 것과 삼각형으로 그려질 영역을 설정하여 그리는 것에 차이가 있기 때문입니다.

만약 점으로 그린 후 물체를 확대하게 되면 점과의 거리가 멀어져 밀도가 떨어져보이게 됩니다.

만약 면으로 그린다면, 삼각형으로 그려질 영역에 속한 픽셀의 개수를 구해 각각 칠해준다면 점보다 더 정밀하게 그려줄 수 있기 때문입니다.
이렇게 삼각형이 가진 영역을 픽셀로 변환하는 작업을 픽셀화(Rasterization)라고 합니다.

$P = aP_1 + bP_2 + (1 - a - b)P_3$ 이 식의 계수를 이용해 3개의 점 중 특정 위치의 점이 어디에 가까운지 알 수 있습니다.
만약 계수가 $\frac {1}{3}$일 경우 삼각형의 정 중앙에 위치하게 됩니다.
이것을 무게중심좌표(Barycentric Coordinate)라고 합니다.

이동 벡터

벡터 공간의 다른 부분 공간을 이동을 위한 공간에 속한 벡터로 사용하는 것을 벡터(Vector) 또는 이동 벡터라고 부릅니다.

이동 벡터는 크기와 방향을 가진 대상을 의미하는 물리적 벡터에 해당됩니다.

선형 변환과 행렬

벡터에 변환(이동, 회전, 확대 및 축소 등)을 적용할 때 선형 변환 개념이 중요합니다.
이러한 변환은 보통 행렬을 통해 표현되고 연산됩니다.

게임 내에서 벡터를 다양한 좌표계로 변환하거나 이동시키는 데 행렬이 사용됩니다.

절두체와 카메라 시야

게임 엔진 내에서는 보이는 영역을 정해서 그 안의 물체만 렌더링하는데, 이를 위해 절두체(Frustum, 시야 범위) 등의 수학적 개념을 활용합니다.
절두체는 여러 평면(앞뒤, 상하, 좌우)으로 경계를 정하여 카메라가 보는 영역을 정의합니다.

Date:     Updated:

카테고리:

태그:

Math 카테고리 내 다른 글 보러가기

댓글남기기