Direct 2D에서는 변환 연산을 위해 행렬을 활용하는데
행벡터를 기준으로 나타난다.
옛... 날에 행렬계산으로 이동, 회전, 스케일 연산 등을 배웠었는데
그때는 열벡터를 기준으로 연산을 했었기 때문에
Direct 2D를 공부하기 전에 얄팍하지만 정리를 해본다.

📌 행렬 곱셈 특징
- 행렬의 곱셈은 앞의 열의 수와 뒤의 행의 원소 수가 같아야 한다.
- 행열의 곱셈은 교환법칙이 성립하지 않는다 ( 곱셈의 순서에 따라 결과가 다르다)
- 결합법칙 성립한다 (AB)C = A(BC) 반복 사용하는 행렬을 미리 연산하면 계산량을 줄일 수 있다.
📌 행렬곱을 통한 변환 순서
Scale → Rotation → Translation
- Scale 먼저 해야 크기 조정이 원점(0,0)을 기준으로 이루어짐
- 그 다음 Rotation 을 해야 원점 기준으로 회전됨
- 마지막으로 Translation 을 하여 원하는 위치로 이동함
XMMATRIX scale = XMMatrixScaling(sx, sy, 1.0f);
XMMATRIX rotation = XMMatrixRotationZ(angle);
XMMATRIX translation = XMMatrixTranslation(tx, ty, 0.0f);
XMMATRIX world = scale * rotation * translation;
📌 행렬곱 계산
// 수학적 변환행렬 표헌법
| M11 M12 dx | -> x축 방향벡터, 평행이동
| M21 M22 dy | -> y축 방향벡터, 평행이동
| 0 0 1 | -> 동차좌표
// 수학적으로 행렬 곱을 하려면?
// 1. 이동
// 변환행렬은 - dx, dy에 평행 이동 값을 넣으면 된다.
| 1 0 dx |
| 0 1 dy |
| 0 0 1 |
// Vector2 (2,2)를 x축방향으로 3, y축 방향으로 5 이동시키기
// 동차좌표를 적용한 행렬과 벡터를 곱하고, 다시 2차원 좌표로 변환한다. 벡터의 최종 좌표는 (5, 3)이다.
| 1 0 3 | | 2 | | 1*2 + 0*2 + 3*1 | | 5 | | 5 |
| 0 1 1 | × | 2 | = | 0*2 + 1*2 + 1*1 | = | 3 | => | 3 |
| 0 0 1 | | 1 | = | 0*1 + 0*1 + 1*1 | | 1 |
// 2. 회전
// 변환행렬은 각도 θ에 따라 cosθ, sinθ를 이용해 만든다.
| cosθ -sinθ 0 |
| sinθ cosθ 0 |
| 0 0 1 |
// Vector2 (2,2)를 90도 (π/2 라디안) 반시계 방향 회전시키기
// cos90°=0, sin90°=1
// 동차좌표 행렬과 벡터 곱, 다시 2차원 좌표로 변환한다. 벡터의 최종 좌표는 (-2, 2)이다.
| 0 -1 0 | | 2 | | 0*2 + (-1)*2 + 0*1 | | -2 | | -2 |
| 1 0 0 | × | 2 | = | 1*2 + 0*2 + 0*1 | = | 2 | => | 2 |
| 0 0 1 | | 1 | | 0*2 + 0*2 + 1*1 | | 1 |
// 3. 스케일
// 변환행렬은 x축 방향 스케일 sx, y축 방향 스케일 sy를 넣으면 된다.
| sx 0 0 |
| 0 sy 0 |
| 0 0 1 |
// Vector2 (2,2)를 x축 3배, y축 2배 확대시키기
// 동차좌표 행렬과 벡터 곱, 다시 2차원 좌표로 변환한다. 벡터의 최종 좌표는 (6, 4)이다.
| 3 0 0 | | 2 | | 3*2 + 0*2 + 0*1 | | 6 | | 6 |
| 0 2 0 | × | 2 | = | 0*2 + 2*2 + 0*1 | = | 4 | => | 4 |
| 0 0 1 | | 1 | | 0*2 + 0*2 + 1*1 | | 1 |
Matrix Calculator
Free matrix calculator - solve matrix operations and functions step-by-step
www.symbolab.com
wooj22 - Overview
🎮 Game Programmer. wooj22 has 22 repositories available. Follow their code on GitHub.
github.com
양우정
www.youtube.com
'Programming > 컴퓨터그래픽스 (DX 11)' 카테고리의 다른 글
| [DirectX 11] 상수버퍼(Constant Buffer) CPU 구조체와 HLSL 구조체 정렬 맞추기 (0) | 2025.09.16 |
|---|---|
| [DirectX 11] DirectXMath vs SimpleMath 어떤 자료형을 사용해야할까? (0) | 2025.09.15 |
| [Lighting] 난반사(Diffuse Reflection)와 램버튼 법칙(Lambert's cosine law) (0) | 2025.09.15 |
| [DirectX 11] D3D11 렌더 타겟 뷰(RTV)와 SwapChain 개념 (0) | 2025.09.10 |
| [DirectX 11] 2D 변환 행렬 (0) | 2025.06.11 |