일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- vertex
- CommandList
- 전처리문
- DirectX12
- RenderTargetView
- GPU
- 다이렉트X 튜토리얼
- Direct Init
- Direct3D Init
- c
- CPU
- 다중표본화
- swapchain
- Input Assembler
- engine
- DESC
- 세팅
- C언어
- View
- UE4
- 동기화
- 다이렉트X
- 게임수학
- DirectXTK
- 프로그래밍
- 다이렉트 초기화
- 코딩
- C++
- DirectX
- Direct3D
- Today
- Total
비타Cpp
비례(Scaling) 행렬 본문
비례(Scaling) 변환은 물체의 크기를 바꾸는 효과를 낸다.
다음은 비례 변환의 정의다.
S(x, y, z) = (sxx, syy, szz)
이 변환은 좌표계를 기준으로 하여 벡터를 x축으로 sx 단위, y축으로 sy 단위, 그리고 z 축으로 sz단위만큼 비례한다.
그럼 이 S가 실제로 하나의 선형 변환임을 증명해보자.
$$S(u+v) = (s_x(u_x + v_x),\ s_y(u_y + v_y),\ s_z(u_z + v_z))\\ =(s_xu_x + s_xv_x,\ s_yu_y + s_yv_y,\ s_zu_z + s_zv_z)\\ = (s_xu_x,\ s_yu_y,\ s_zu_z) + (s_xv_x,\ s_yv_y,\ s_zv_z) \\ =S(u) + S(v)$$
$$S(ku) = (s_xku_x,\ s_yku_y,\ s_zku_z)\\ =k(s_xu_x,\ s_yu_y,\ s_zu_z)\\ =kS(u)$$
이렇듯 S는 두 성질을 만족하므로 선형 변환이다. 그러므로 행렬 표현이 존재한다. 행렬 표현을 구하려면 S를 표준 기저 벡터들 각각에 적용하고, 결과로 나오는 벡터들을 행들로 하는 행렬을 만들면 된다.
$$S(i)=(s_x\cdot1,\ s_y\cdot0,\ s_z\cdot0 )=(s_x,\ 0,\ 0)\\ S(j)=(s_x\cdot0,\ s_y\cdot1,\ s_z\cdot0 )=(0,\ s_y,\ 0)\\ S(k)=(s_x\cdot0,\ s_y\cdot0,\ s_z\cdot1 )=(0,\ 0,\ s_z)$$
따라서 비례 행렬(Scaling Matrix)은
$$S =\begin{bmatrix}s_x & 0 & 0 \\ 0 & s_y & 0 \\0 & 0 & s_z \end{bmatrix}$$
이다.
예제로 최솟점(-4, -4, 0)과 최댓점(4, 4, 0)으로된 사각형을 z 축은 그대로 두고 x축으로 0.5만큼, y축으로 2만큼 비례해보자. 그렇다면 해당 비례 행렬은 다음과 같다.
$$S=\begin{bmatrix}0.5 & 0 & 0 \\0 & 2 & 0 \\ 0 & 0 & 1 \end{bmatrix}$$
이제 사각형의 최솟점과 최댓점에 이행렬을 곱한다. 그러면 구하려는 비례의 사각형의 최솟/최댓점이 나온다.
$$[-4, -4, 0] \begin{bmatrix}0.5 & 0 & 0 \\0 & 2 & 0 \\ 0 & 0 & 1 \end{bmatrix}=[-2, -8, 0]\\ [4, 4, 0] \begin{bmatrix}0.5 & 0 & 0 \\0 & 2 & 0 \\ 0 & 0 & 1 \end{bmatrix}=[2, 8, 0]$$
'DirectX12 > 게임 수학' 카테고리의 다른 글
원점을 기준으로 회전하는 카메라 (0) | 2021.10.17 |
---|---|
행렬식(Determinant) (0) | 2021.08.05 |
외적 (Outer Product / Cross Product) (0) | 2021.08.01 |
직교화(Orthogonalization) (0) | 2021.07.28 |
내적과 직교 투영 (0) | 2021.07.28 |