게임 개발

게임 개발자는 왜 행렬을 알아야 하는가

3D 게임의 모든 움직임은 행렬로 만들어진다. 프로젝션, 회전, 공간 변환의 원리를 이해하면 AI 시대에도 셰이더를 제어할 수 있다.

CodingJoa 8분 정도 걸립니다

게임 개발자는 왜 행렬을 알아야 하는가

게임 엔진에 3D 모델을 넣고 위치를 정하고 회전시켜 화면에 띄울 때, 그 뒤에서 무슨 일이 벌어질까. 모든 단계가 행렬(Matrix) 계산이다. 엔드리스 러너 게임에서 카메라가 가까운데도 배경이 끝나지 않아 보이는 이유, 원근감 있는 3D 화면이 만들어지는 원리, 술 취한 듯한 화면 흔들림 효과까지, 모두 행렬을 조작해서 만든다.

AI 코드 생성 도구가 발전한 지금, 개발자들은 “AI가 코드를 짜주면 되는 거 아닌가” 생각할 수 있다. 하지만 실제로 게임 개발 최전선에 있는 사람들은 이렇게 말한다. AI가 만든 코드는 기본 구조의 60%일 뿐이다. 나머지 40%, 특히 셰이더(Shader)처럼 복잡한 부분을 손으로 다듬고 최적화하고 의도대로 작동하는지 검증하려면, 그 아래 있는 수학을 알아야 한다.

게임은 공간을 변환하는 일의 연속

3D 게임의 흐름은 단순하다. 모델이 있고, 게임 세상에 배치되고, 카메라를 통해 보이고, 화면에 표시된다. 이 4단계 모두에서 좌표를 계산해야 하는데, 그 계산 방법이 행렬이다.

처음 모델이 정의될 때는 자신만의 좌표계(로컬 스페이스)를 가진다. 원점을 중심으로 팔다리가 어디 있는지를 정의한다. 게임의 신(Scene)에 이 모델을 배치할 때 “위치는 (10, 5, 3), 회전은 45도, 크기는 2배"라고 지정하면, 이 정보들이 행렬로 변환되어 로컬 좌표를 월드 좌표로 옮긴다. 다음으로 카메라가 어디를 보고 있는지에 따라 다시 변환(뷰 변환)한다. 마지막으로 카메라의 시야각(FOV)와 화면 비율에 맞게 한 번 더 변환(프로젝션)한다.

이 과정이 복잡해 보이지만, 사실 각 단계는 매우 논리적이다. 한 가지 일만 한다.

행렬의 정체: 변환 레시피

수학 시간의 행렬은 그냥 숫자를 사각형 형태로 나열한 것이었을 것이다. 게임 개발에서는 다르다. 행렬은 한 공간의 점들을 다른 공간으로 옮기는 방법을 담은 상자다. 4×4 행렬 하나에 위치, 회전, 크기, 기타 변환이 모두 들어 있다.

구체적으로 4×4 행렬의 구조는 이렇다.

  • 상단 좌측 3×3: 회전과 크기 정보
  • 우측 맨 끝 세 칸: 위치(X, Y, Z) 정보
  • 맨 아래 한 줄: 나머지 변환(보통은 1과 0들)

어떤 점의 좌표에 이 행렬을 곱하면, 그 점이 변환된 새로운 좌표가 나온다. 일반적인 곱셈이 아니라 각 행과 각 열의 곱들을 더하는 내적(Dot Product) 연산이다.

단위 행렬(Identity Matrix)이라는 특별한 행렬이 있다. 주 대각선(왼쪽 위에서 오른쪽 아래로)이 모두 1이고 나머지는 0인 행렬이다. 이 행렬과 어떤 좌표를 곱해도 그 좌표는 변하지 않는다. 게임 엔진에서 오브젝트를 새로 만들었을 때의 초기 상태가 바로 이것이다.

자주 쓰이는 행렬 연산들

게임에서 필요한 행렬 연산을 알아두면, 셰이더 코드를 읽을 때나 AI가 만든 코드를 검증할 때 도움이 된다.

전치(Transpose): 행과 열을 바꾼다. 3행 2열의 값이 2행 3열로 옮겨진다. 행렬을 90도 회전한 것처럼 보이지만, 실제로는 공간 변환에서 특정한 의미를 가진다.

역행렬(Inverse): “변환을 되돌리는” 행렬이다. 어떤 오브젝트를 좌표 (5, 10, 0)으로 옮겼다면, 그 역행렬을 곱하면 원점으로 돌아온다. 수학의 역수(2의 역수는 1/2)와 같은 개념인데, 행렬의 경우 계산이 훨씬 복잡하다.

직교 행렬(Orthogonal Matrix): 게임의 좌표축(X축, Y축, Z축)처럼 이 행렬의 각 축들이 정확히 90도를 이룬다. 직교 행렬의 가장 멋진 성질은 역행렬과 전치 행렬이 같다는 것이다. 계산 복잡도가 줄어들기 때문에 게임 개발에서 매우 효율적이다.

게임 화면이 만들어지는 4단계

여기서 가장 중요한 부분이다. 게임 개발자가 반드시 이해해야 할 4단계의 공간 변환 과정이다.

1단계: 로컬에서 월드로

모델이 처음 만들어질 때, 그 모델만의 좌표계를 가진다. 3D 캐릭터가 서 있다면, 그 캐릭터의 발 위치를 (0, 0, 0)으로 본다는 뜻이다. 이게 로컬 스페이스다. 게임의 신에 이 캐릭터를 배치할 때 게임의 절대 좌표계(월드 스페이스)로 옮긴다. 이 변환이 월드 행렬이다.

2단계: 월드에서 뷰로

게임의 신 전체가 월드 스페이스다. 땅, 하늘, 건물, 캐릭터, 모든 것이 월드 좌표에 있다. 하지만 플레이어가 보는 건 카메라를 통한 뷰다. 카메라가 움직이거나 회전하면, 상대적으로 세상이 움직인다. 카메라를 위로 올리면 세상은 아래로 내려간다. 이게 뷰 변환의 핵심이다. 뷰 행렬은 실제로 역행렬을 사용한다. 왜냐하면 카메라의 움직임을 반대로 해석해야 하기 때문이다.

3단계: 뷰에서 프로젝션으로

여기서 3D가 2D처럼 보이게 되는 원근감이 생긴다. 가까운 것은 크게, 먼 것은 작게 보인다. 게임에서는 카메라의 속성으로 정의된다.

  • FOV(시야각): 좁을수록 망원렌즈처럼 보임
  • Near: 카메라에 가장 가까운 화면 (이보다 가까우면 그려지지 않음)
  • Far: 카메라에서 가장 먼 화면 (이보다 멀면 그려지지 않음)

이 정보들을 행렬로 변환하면 프로젝션 행렬이 된다. 복잡해 보이는 공식들이 있지만, 본질은 간단하다. “이 피라미드 모양의 공간(프러스텀)을 정육면체로 압축해라.”

4단계: 정규화된 기기 좌표(NDC)

마지막 단계에서 모든 좌표는 -1에서 1 사이의 범위로 압축된다. 이게 정규화된 기기 좌표(NDC, Normalized Device Coordinate)다. 해상도가 1920×1080이든 800×600이든, 모든 게임은 -1~1 범위의 좌표를 화면 픽셀로 매핑한다.

실제 게임에서 행렬을 조작하기: 엔드리스 러너

이제 이론이 실제 게임에서 어떻게 쓰이는지 보자.

엔드리스 러너 게임들(Subway Surfers, Temple Run 같은)은 카메라를 매우 가깝게 설정한다. 일반적으로는 카메라가 이렇게 가까우면 멀리 있는 배경(Far plane)이 바로 눈에 띈다. 약 10~20미터 앞에 갑자기 세상이 끝나는 것처럼 보이면 몰입감이 깨진다.

유명한 게임들이 이를 해결하는 방법은 영리하다. 프로젝션 행렬을 직접 조작해서 먼 길을 살짝 구부린다. 시간에 따라 프로젝션 행렬의 특정 값을 변화시켜서, 화면의 위쪽(또는 아래쪽)이 점점 더 휘어지도록 만드는 것이다.

예를 들어, Y축(높이) 방향의 보정값을 시간함수(사인파 같은)에 따라 변화시키면, “울렁울렁한” 술 취한 효과가 나타난다. 엔드리스 러너에서는 이것을 더 섬세하게 조절해서, 카메라로부터 멀어질수록 Y값을 조금씩 내려준다. 결과는 이렇다.

시각적 효과 = 거리 증가 + 화면 구부림
→ 카메라가 가까워도 배경 끝이 티나지 않음
→ 자연스러운 "무한 루프" 같은 느낌

이런 기법은 프로젝션 행렬을 완벽히 이해하지 못하면 절대 구현할 수 없다. 공식만 안다고 되는 게 아니라, “이 행렬의 이 부분을 바꾸면 어떤 효과가 생긴다"는 직관이 필요하다.

AI 시대에도 수학이 필요한 이유

최근 ChatGPT나 코파일럿 같은 AI 코드 생성 도구들이 훌륭하다. 게임 개발에서도 유용하다. 하지만 한계가 명확하다.

AI는 일반적인 게임 로직이나 기본 셰이더는 잘 만든다. 하지만 최적화, 버그 수정, 새로운 요구사항에는 약하다. 특히 셰이더 코드에서 AI가 생성한 결과물은 대부분 “동작은 하지만 의도한 대로는 아닌” 수준이다.

AI가 만든 코드를 검증하고 수정하려면, 그 코드가 그렇게 작동하는지 알아야 한다. 프로젝션 행렬의 어느 부분을 어떻게 수정하면 어떤 결과가 나올지 예측할 수 있어야 한다. 이 능력은 수학 이해에서만 나온다.

게임 수학, 어떻게 배워야 할까

게임 수학 학습에서 흔한 실수는 “공식을 외우려고 한다"는 것이다. 행렬의 곱셈 방법, 벡터의 내적 공식, 프로젝션 행렬의 유도 과정 같은 것들을 다 암기하는 건 시간 낭비다. 실무에서는 엔진이 다 계산해주고, 필요하면 참고 자료를 찾아본다.

대신 중요한 건 이것들이다.

1. 시각화하기: 행렬이 어떤 변환을 하는지 머리 속이나 종이에 그려본다. “프로젝션 행렬이 한 피라미드를 정육면체로 누른다"처럼, 그림으로 이해한다.

2. 단계별로 이해하기: 로컬→월드, 월드→뷰처럼 한 단계씩 명확히 한다. “뷰 변환이 왜 카메라의 역행렬을 쓰는가?“라는 질문에 답할 수 있을 때까지.

3. 직접 해보기: 유니티나 언리얼에서 행렬 값을 콘솔에 출력해보고, 값을 조작해본다. 오브젝트를 회전시킨 후 행렬 값이 어떻게 변하는지 본다.

4. 의문 가지기: “왜 이 값이 1이고 저 값이 0일까?”, “이 행렬을 수정하면 어떤 효과가 나올까?” 같은 질문이 학습을 깊게 만든다.

마치며

게임 개발에서 행렬은 “공간의 조작 도구"다. 겉보기에 복잡하지만, 각 행렬이 하나의 일관된 목적을 가지고 있다는 걸 알면 훨씬 쉬워진다. 3D 게임을 제대로 만들려면, 또는 AI 시대에 코드를 검증하고 개선하려면, 이런 원리를 알아야 한다. 다행히 게임 개발에 필요한 수학은 무한하지 않다. 자주 쓰는 범위만 깊게 이해해도 충분하다.

자주 묻는 질문

Q. 게임 개발을 시작하려면 먼저 게임 수학을 배워야 하나?

게임 엔진의 고수준 기능만으로도 많은 게임을 만들 수 있다. 하지만 원하는 시각적 효과를 얻지 못하거나 성능을 최적화해야 할 때 수학 이해가 필수가 된다. 처음부터 다 배울 필요는 없고, 필요할 때마다 학습하는 방식도 좋다.

Q. 프로젝션 행렬의 유도 과정이 너무 복잡하다. 다 이해해야 하나?

공식의 수학적 유도 과정을 외울 필요는 없다. 중요한 건 “프로젝션 행렬이 3D 공간을 2D 화면으로 압축한다"는 개념이다. 구체적인 계산은 엔진이 해준다.

Q. 게임 엔진이 행렬 기능을 다 제공하는데 직접 조작해야 하나?

기본 기능만으로도 일반적인 게임을 만들 수 있다. 하지만 엔드리스 러너의 곡선 효과처럼 특별한 시각적 결과를 원할 때는 행렬을 직접 수정해야 한다.

Q. AI 코드 생성 도구가 있는데 수학을 공부할 필요가 있나?

AI가 생성한 코드는 기본 구조만 제공한다. 그것을 검증하고, 버그를 수정하고, 성능을 최적화하려면 원리 이해가 필수다. 특히 셰이더처럼 복잡한 부분에서는 더욱 그렇다.

Q. 벡터와 행렬 중에 어느 것부터 배워야 하나?

벡터가 먼저다. 벡터는 “위치, 방향, 속도"를 나타내고, 행렬은 벡터들을 변환한다. 벡터의 내적, 외적 같은 개념을 먼저 이해한 후 행렬 연산이 훨씬 쉬워진다.

참고 자료

이 글 공유하기 X Facebook 네이버

이 글의 내용은 작성 시점에 직접 실행하고 확인한 결과와 글쓴이 개인의 판단을 담은 기록입니다. 도구의 버전·가격·동작은 시간이 지나면 달라질 수 있으니, 따라 하실 때는 공식 문서를 함께 확인해주세요. 자세한 내용은 이용약관에 정리해두었습니다.