비타Cpp

비례(Scaling) 행렬 본문

DirectX12/게임 수학

비례(Scaling) 행렬

멍C 2021. 8. 2. 18:27

비례(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
Comments