행렬의 활용
게임에서는
이동, 회전, 크기를 제어할 때 행렬식을 이용하고
셰이더에서 많이 사용되며 그래픽스 랜더링 파이프라인에서 일어나는 모든 변환들이 행렬로 이루어지고 계산된다
행렬의 이동 (Translation)
m03, m13, m23이 위치 값(x, y, z)을 가진다
기존 위치가 v이고 그 위치에서 t만큼 이동할 때,
위와 같은 계산 과정을 거치며 위치 변환이 이뤄진다
행렬의 확대, 축소 (Scaling)
m00, m11, m22 요소를 이용해서 scale 변환이 이뤄진다
기존 스케일 행렬이 v이고 원하는 s만큼 scale 변환을 할 때,
위와 같은 계산 과정을 거친다
행렬의 회전 (Rotation)
x축, y축, z 축에 따라 해당하는 값들이 변경되어
위와 같은 공식을 통해 회전 변환이 이뤄진다
y축으로 45도 회전을 한다면,
위의 공식과 기존 행렬 v를 곱하여 회전 변환이 이뤄진다
동차 좌표계(homogeneous coordinates system)
동차 좌표계는 한 차원의 좌표에서 하나의 좌표를 추가한 것을 의미한다
3차원 공간에서의 점 (x, y, z)을 동차 좌표계에서 (x, y, z, 1)로 표현한다
각 entry의 요소들은
위에서도 계속 보았지만 아래와 같다
이처럼 최소한의 정보를 담을 수 있는 행렬 크기로 4x4 행렬을 사용한다
마지막 행이 굳이 추가되어서
3x4크기가 아닌 4x4의 크기를 사용하는 이유는
T * R * S 의 연산을
위에서 계산해온 것처럼 매번 하나의 정점(x, y, z) 마다 연산을 하는 것보다
행렬의 결합법칙을 이용해 한번에 효율적으로 행렬 곱을 처리하기 위해 사용한다
변환 행렬 (TRS vs. SRT)
T(Translation), R(Rotation), S(Scaling)의 연산을 어떠한 순서대로 변환하느냐에 따라 결과물이 달라진다
DirectX에서는
S(Scaling) * R(Rotation) * T(Translation) 의 연산 순서를 사용하고
OpenGL, 언리얼, 유니티에서는
T(Translation) * R(Rotation) * S(Scaling) 의 연산 순서를 사용한다
R(Rotation) 과정에서 축 변환 순서 또한 다르다
DirectX와 유니티에서는 Z, Y, X 순서로 변환하고
OpenGL과 언리얼에서는 X, Y, Z 순서로 변환한다
역행렬(Inverse Matrix)
어떤 행렬에 곱을 했을 때, 단위행렬이 결과로 나오는 행렬을 역행렬이라고 한다
정방행렬(정사각행렬), 직교행렬이라는 특징을 지니고 있다
역행렬은 나누기와 같은 개념으로 볼 수 있다
예를 들어,
"BA = C" 라는 상황이 주어졌고
A라는 행렬을 우리가 알고 있다면
A의 역행렬을 통해 B의 값을 추론해낼 수 있다
이처럼 인버스를 통해 다양한 값들을 추론 가능하다
//직교행렬?
직교행렬을 이해하기 앞서 전치행렬에 대해서 알아야한다
![](https://blog.kakaocdn.net/dn/yyxwT/btsFjLuRtbm/QFucKk7P6fL5bh8KPzC6SK/img.jpg)
전치행렬(transpose matrix)은
위의 그림처럼
주어진 행렬의 행과 열을 서로 바꾼 행렬을 말한다
![](https://blog.kakaocdn.net/dn/q8z5U/btsFf3jrHTg/lWVozW5JxWgW0Y5dTzMHF0/img.png)
어떠한 행렬(A)의 전치행렬과 역행렬이 동일할때,
직교행렬이라고 한다
직교행렬은 열벡터들이 서로 직교(orthogonal, 수직)하고,
그 열벡터들의 크기가 모두 1인 행렬을 말한다
'게임 수학 & 물리 > 게임 수학' 카테고리의 다른 글
[게임 수학] 행렬(1) (1) | 2024.02.27 |
---|---|
[게임 수학] 벡터의 외적(2) (1) | 2024.02.26 |
[게임 수학] 벡터의 외적 (1) (1) | 2024.02.25 |
[게임 수학] 벡터의 내적 (2) (0) | 2023.10.28 |
[게임 수학] 벡터의 내적 (1) (1) | 2023.10.28 |