
DirectX11에서 3D 그래픽을 다루려면 가장 먼저 이해해야 하는 개념이 바로 행렬(Matrix)이다.
행렬은 물체의 위치, 회전, 크기를 수학적으로 표현하여 3D 공간 속 객체를 조작할 수 있게 해준다.
행렬(Matrix)은 숫자들을 사각형 형태로 배치한 표입니다.
보통 행(Row)과 열(Column)로 구성되며, 다음과 같이 표현됩니다:
| a11 a12 a13 |
| a21 a22 a23 |
| a31 a32 a33 |
3행 3열 행렬 → 3x3 Matrix
4행 4열 행렬 → 4x4 Matrix (DirectX에서 주로 사용)
DirectX에서는 3D 변환을 위해 4x4 행렬을 기본으로 사용합니다.
상수 곱하기 : 행렬 전체에 같은 수를 곱함 / 모든 원소에 상수 값을 곱함
덧셈 / 뺄셈 : 같은 크기의 행렬끼리만 가능 / 각 원소끼리 더하거나 뺌
곱셈 (행렬 곱) : 한 행렬의 행(row) 과 다른 행렬의 열(column) 을 내적하여 계산 / 교환법칙 ❌, 결합법칙 ⭕
(A × B) ≠ (B × A)
(A × B) × C = A × (B × C)
💡 DirectX에서 중요한 포인트:
행렬 곱의 순서가 매우 중요합니다!
World View Projection 순으로 곱해야 올바른 결과가 나옵니다.
DirectX11에서 자주 사용하는 4가지 주요 행렬을 알아봅시다.
모든 변환을 하지 않는 기본 행렬입니다.
| 1 0 0 0 |
| 0 1 0 0 |
| 0 0 1 0 |
| 0 0 0 1 |
어떤 벡터에 항등행렬을 곱해도 변하지 않음
즉, “아무런 변환도 하지 않는 상태”
물체의 크기를 조절합니다.
| Sx 0 0 0 |
| 0 Sy 0 0 |
| 0 0 Sz 0 |
| 0 0 0 1 |
ex)
XMMATRIX scale = XMMatrixScaling(Sx, Sy, Sz);
물체를 특정 축을 기준으로 회전시킵니다.
예시: X축 회전 행렬
| 1 0 0 0 |
| 0 cosθ sinθ 0 |
| 0 -sinθ cosθ 0 |
| 0 0 0 1 |
ex)
XMMATRIX rotX = XMMatrixRotationX(angle);
물체를 특정 좌표로 이동시킵니다.
| 1 0 0 Tx |
| 0 1 0 Ty |
| 0 0 1 Tz |
| 0 0 0 1 |
ex)
XMMATRIX translation = XMMatrixTranslation(Tx, Ty, Tz);
역행렬은 “어떤 변환을 되돌리는 행렬”입니다.
즉, 행렬 × 역행렬 = 항등행렬 이 됩니다.
A × A⁻¹ = I

예를 들어, 물체를 5만큼 이동시켰다면,
역행렬은 다시 -5만큼 이동시켜 원위치로 되돌립니다.
ex)
XMMATRIX inv = XMMatrixInverse(nullptr, matrix);
전치 행렬은 행과 열을 서로 바꾼 행렬입니다.
| a b |ᵀ = | a c |
| c d | | b d |

DirectX에서는 주로 HLSL과 C++ 간 데이터 교환 시 사용합니다.
ex)
XMMATRIX transposed = XMMatrixTranspose(matrix);
⚠️ HLSL은 기본적으로 row-major(행 우선) 구조를 사용하므로,
C++에서 넘길 때 전치를 해줘야 올바르게 계산됩니다.
직교 행렬은 행과 열이 서로 직교(90°) 하는 행렬입니다.
즉, 회전만 포함되고 스케일이 없는 변환일 때 자주 등장합니다.
A⁻¹ = Aᵀ
즉, 역행렬이 전치 행렬과 동일합니다.
회전 행렬은 대표적인 직교 행렬입니다.
행렬은 벡터를 변환할 때 사용됩니다.
예를 들어, 한 점 (x, y, z)를 이동시키려면 다음처럼 계산합니다.


DirectX 코드로 표현하면 👇
ex)
XMVECTOR pos = XMVectorSet(x, y, z, 1.0f);
XMVECTOR result = XMVector3TransformCoord(pos, worldViewProj);
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”가 이를 의미합니다