[DX] 행렬 기초

vector·2025년 11월 4일

DirectX11 — Matrix(행렬) 완벽 이해하기

DirectX11에서 3D 그래픽을 다루려면 가장 먼저 이해해야 하는 개념이 바로 행렬(Matrix)이다.
행렬은 물체의 위치, 회전, 크기를 수학적으로 표현하여 3D 공간 속 객체를 조작할 수 있게 해준다.

1. 행렬(Matrix)이란?

행렬(Matrix)은 숫자들을 사각형 형태로 배치한 표입니다.
보통 행(Row)과 열(Column)로 구성되며, 다음과 같이 표현됩니다:

| a11  a12  a13 |
| a21  a22  a23 |
| a31  a32  a33 |

3행 3열 행렬 → 3x3 Matrix
4행 4열 행렬 → 4x4 Matrix (DirectX에서 주로 사용)

DirectX에서는 3D 변환을 위해 4x4 행렬을 기본으로 사용합니다.

2. 행렬의 기본 연산

상수 곱하기 : 행렬 전체에 같은 수를 곱함 / 모든 원소에 상수 값을 곱함
덧셈 / 뺄셈 : 같은 크기의 행렬끼리만 가능 / 각 원소끼리 더하거나 뺌
곱셈 (행렬 곱) : 한 행렬의 행(row) 과 다른 행렬의 열(column) 을 내적하여 계산 / 교환법칙 ❌, 결합법칙 ⭕

(A × B) ≠ (B × A)
(A × B) × C = A × (B × C)

💡 DirectX에서 중요한 포인트:
행렬 곱의 순서가 매우 중요합니다!
World View Projection 순으로 곱해야 올바른 결과가 나옵니다.

3. 주요 행렬 종류

DirectX11에서 자주 사용하는 4가지 주요 행렬을 알아봅시다.

(1) 항등 행렬 (Identity Matrix)

모든 변환을 하지 않는 기본 행렬입니다.

| 1 0 0 0 |
| 0 1 0 0 |
| 0 0 1 0 |
| 0 0 0 1 |

어떤 벡터에 항등행렬을 곱해도 변하지 않음
즉, “아무런 변환도 하지 않는 상태”


(2) 스케일 행렬 (Scale Matrix)

물체의 크기를 조절합니다.

| Sx  0   0   0 |
| 0   Sy  0   0 |
| 0   0   Sz  0 |
| 0   0   0   1 |
ex)
XMMATRIX scale = XMMatrixScaling(Sx, Sy, Sz);

(3) 회전 행렬 (Rotation Matrix)

물체를 특정 축을 기준으로 회전시킵니다.

예시: X축 회전 행렬

| 1      0        0     0 |
| 0     cosθ     sinθ   0 |
| 0    -sinθ     cosθ   0 |
| 0      0        0     1 |
ex)
XMMATRIX rotX = XMMatrixRotationX(angle);

(4) 이동 행렬 (Translation Matrix)

물체를 특정 좌표로 이동시킵니다.

| 1  0  0  Tx |
| 0  1  0  Ty |
| 0  0  1  Tz |
| 0  0  0  1  |
ex)
XMMATRIX translation = XMMatrixTranslation(Tx, Ty, Tz);

4. 역행렬 (Inverse Matrix)

역행렬은 “어떤 변환을 되돌리는 행렬”입니다.
즉, 행렬 × 역행렬 = 항등행렬 이 됩니다.

A × A⁻¹ = I

예를 들어, 물체를 5만큼 이동시켰다면,
역행렬은 다시 -5만큼 이동시켜 원위치로 되돌립니다.

ex)
XMMATRIX inv = XMMatrixInverse(nullptr, matrix);

5. 전치 행렬 (Transpose Matrix)

전치 행렬은 행과 열을 서로 바꾼 행렬입니다.

| a b |ᵀ = | a c |
| c d |    | b d |

DirectX에서는 주로 HLSL과 C++ 간 데이터 교환 시 사용합니다.

ex)
XMMATRIX transposed = XMMatrixTranspose(matrix);

⚠️ HLSL은 기본적으로 row-major(행 우선) 구조를 사용하므로,
C++에서 넘길 때 전치를 해줘야 올바르게 계산됩니다.

6. 직교 행렬 (Orthogonal Matrix)

직교 행렬은 행과 열이 서로 직교(90°) 하는 행렬입니다.
즉, 회전만 포함되고 스케일이 없는 변환일 때 자주 등장합니다.

A⁻¹ = Aᵀ

즉, 역행렬이 전치 행렬과 동일합니다.
회전 행렬은 대표적인 직교 행렬입니다.

7. 벡터와 행렬

행렬은 벡터를 변환할 때 사용됩니다.
예를 들어, 한 점 (x, y, z)를 이동시키려면 다음처럼 계산합니다.

DirectX 코드로 표현하면 👇

ex)
XMVECTOR pos = XMVectorSet(x, y, z, 1.0f);
XMVECTOR result = XMVector3TransformCoord(pos, worldViewProj);

8. DirectX11에서의 변환 순서

3D 공간의 좌표는 다음 순서로 변환됩니다:

[Model Space] × World Matrix → [World Space]
[World Space] × View Matrix  → [Camera Space]
[Camera Space] × Projection Matrix → [Screen Space]

즉,

ex)
XMMATRIX worldViewProj = world * view * projection;

✅ DirectX11은 Left-Handed (왼손좌표계) 를 사용
✅ XMMatrixLookAtLH(), XMMatrixPerspectiveFovLH() 등의 함수명에서 “LH”가 이를 의미합니다

profile
게임 클라이언트 프로그래머 준비중 (공부 및 기록용)

0개의 댓글