본문 바로가기
Directx12 3D 프로그래밍 입문/3. 변환

3. 변환

by ftftgop3 2023. 9. 17.

선형 변환

함수에 3차원 벡터를 입력 하면 새로운 벡터 하나를 출력

선형 변환의 성질에 성립 시 이 함수를 선형 변환 이라고 한다.

선형 변환의 성질 : t(u+v) = t(u) + t(v), t(ku) = kt(u)

 

선형 변환을 행렬 표현 예시

표준 기저 벡터 : 현재 좌표계 축의 단위 벡터들

ex) i = (1,0,0), j = (0,1,0), k = (0,0,1)

$$t(u) = t(xi+yi+zk) = xt(i) + yt(j) + zt(k)$$

$$uA = [x,y,z]
\begin{bmatrix}
A_{11} & A_{12} & A_{13} \\
A_{21} & A_{22} & A_{23} \\
A_{31} & A_{32} & A_{33} \\
\end{bmatrix}$$

 

비례

물체의 크기를 조절, 선형 변형

비례 변환 공식

$$\\
S(x,y,z) = (s_{x}x, s_{y}y, s_{z}z)
\\
S(i) = (S_{x}\cdot1, S_{x}\cdot0,S_{x}\cdot0)=(S_{x},0,0)\\
S(j) = (S_{x}\cdot0, S_{x}\cdot1,S_{x}\cdot0)=(0,S_{y},0)\\
S(k) = (S_{x}\cdot0, S_{x}\cdot0,S_{x}\cdot1)=(0,0,S_{z})\\$$

i, j, k = 표준 기저 벡터 삽입으로 비례 행렬 생성

비례 행렬, 역행렬

\begin{bmatrix}Sx & 0 & 0 \\0 & Sy & 0 \\0 & 0 & Sz \end{bmatrix}\begin{bmatrix}1/Sx & 0 & 0 \\0 & 1/Sy & 0 \\0 & 0 & 1/Sz \end{bmatrix}

회전

물체의 회전, 선형 변환

회전행렬의 행벡터가 정규 직교 이기 때문에 회전 행렬의 역행렬은 전치 행렬과 같다

행벡터 : 1 x n 로 이루어진 행렬

정규 직교 : 행 벡터 들이 x, y, z 축으로 이루어진 직교 형태

$$c = cos\theta\\s = sin\theta$$회전 행렬

$$\begin{bmatrix}c+(1 -2)x^{2} & (1-c)xy+sz & (1-c)xz-sy \\(1-c)xy - sz & c+(1-c)y^{2} & (1-c)yz+sx \\ (1-c)xz+sy& (1-c)yz - sx & c+ (1-c)z^2 \end{bmatrix}$$

 

회전 행렬의 역행렬 == 전치 행렬(정규 직교)

$$\begin{bmatrix}c+(1 -2)x^{2} & (1-c)xy-sz & (1-c)xz+sy \\(1-c)xy + sz & c+(1-c)y^{2} & (1-c)yz-sx \\(1-c)xz-sy& (1-c)yz + sx & c+(1-c)z^{2} \end{bmatrix}$$

 

각 회전 축 행렬

$$Rx = \begin{bmatrix} 1& 0 & 0 & 0 \\ 0& c & s & 0 \\ 0& -s & c &0 \\ 0& 0 & 0 & 1 \end{bmatrix}Ry = \begin{bmatrix} c& 0 & -s & 0 \\ 0& 1 & 0 & 0 \\ s& 0 & c &0 \\ 0& 0 & 0 & 1 \end
{bmatrix}Rz = \begin{bmatrix} c& s & 0 & 0 \\ -s& c & 0 & 0 \\ 0& 0 & 1 &0 \\ 0& 0 & 0 & 1 \end{bmatrix}$$

 

 

아핀 변환 : 선형 변환 + 이동 변환

$$a(u)=uA+b=[x,y,z]\begin{bmatrix}A_{11} & A_{12} & A_{13} \\A_{21} & A_{22} & A_{23} \\A_{31} & A_{32} & A_{33} \end{bmatrix}+[b_x,b_y,b_z] = [x',y',z']$$

 

동차 좌표 : 벡터와 점을 동일한 방식으로 사용, 4x4 행렬

$$[x,y,z,1]\begin{bmatrix}A_{11} & A_{12} & A_{13} & 0 \\A_{21} & A_{22} & A_{23} & 0 \\A_{31} & A_{32} & A_{33} & 0 \\b_x & b_y & b_z & 1 \end{bmatrix}=[x',y',z',1]$$

 

벡터는 w 값이 0인 이유 : 벡터는 위치 개념이 없고 방향과 크기만 존재

점은 w 값이 1인 이유 : 위치에 대해서 정확하게 표현 해야 된다.

항등 변환 : 주어진 인수를 그대로 돌려주는 선형 변환

$$I(u) = u, t(u) = uI + b = u+b$$

이동변환은 수식 처럼 점 u를 b 만큼 움직이게 한다

$$T=\begin{bmatrix}1 & 0 & 0 & 0 \\0 & 1 & 0 & 0 \\0 & 0 & 1 & 0 \\b_x & b_y & b_z & 1 \end{bmatrix} T^{-1}=\begin{bmatrix}1 & 0 & 0 & 0 \\0 & 1 & 0 & 0 \\0 & 0 & 1 & 0 \\-b_x & -b_y & -b_z & 1 \end{bmatrix}$$

 

아핀 변환 행렬의 기하학 적 해석

강체 변환 : 변환 시 물체의 형태가 유지

강체 변환 → 아핀 변환으로 서술

$$a(x,y,z) = t(x,y,z) +b = xt(i)+yt(j)+zt(k)+b$$

$$p = xi + yj + zk\\a(p) = xt(i) + yt(j) + zt(k) +b$$

 

점P의 강체 변환(회전, 이동)을 아핀 변환으로 서술

변환 행렬의 의 합성

비 합성 시 : 점 P * S * R * T = 변환 된 점 곱하기 횟수 : 3번

SRT 합성 시 : 점 P * (SRT) = 변환 된 점 곱하기 횟수 : 1번

점의 개수가 많을 수록 성능에 부하를 줄 일수 있다.

  • 행렬은 교환 법칙이 만족 하지 않는다. SRT 순서 아니고 다른 순서로 곱하면 변환이 다르다.

좌표 변경 변환

점, 벡터의 좌표계 변환은 다르다.

좌표계 A의 벡터 표현 : $$P = xu+yv$$

좌표계 B의 벡터 표현 : $$P_{B} = xu_B + yv_B$$

좌표계 A의 u, v 를 좌표계 B에 상대적인 벡터를 구한다면 변환이 가능

A → B 좌표계 변환 식 : $$P_B = x_a*u_b + y_a * v_b$$

좌표계 변환에는 좌표계의 축을 알아야 한다

점에 대한 좌표 변환

좌표계 A의 점 표현 : $$P = xu+yv+Q$$

좌표계 B의 점 표현 : $$P_{B} = xu_B + yv_B + Q_b$$

좌표계 A의 u, v, Q를 좌표계 B 상대적인 벡터를 구한다면 변환이 가능

A → B 좌표계 변환 식 : $$P_B = x_a*u_b + y_a * v_b + (Q_b - Q)$$

다른 점 : 벡터는 위치 값이 중요하지 않지만 점은 위치 값이 중요

 

좌표 변환 행렬

동차 좌표 사용 시 점과 벡터를 하나의 행렬로 변환 가능

$$(x', y', z',w) = xu_B + yv_B+zw_B + wQ_b$$

좌표 변경 행렬

$$[x', y', z', w'] = [x,y,z,w]\begin{bmatrix}u_x & u_y & u_z & 0 \\v_x & v_y & v_z & 0 \\w_x & w_y & w_z & 0 \\Q_x & Q_y & Q_z & 1 \end{bmatrix} = xu_B + yv_B+zw_B + wQ_B$$

2D 좌표계 변환 행렬 공식

  1. (0,0) 를 좌표 값으로 Q원점 위치 값을 구한다.
  2. (1,1) 를 좌표 값으로 넣어서 스케일 행렬 값을 구한다.

$$[x,y,0,1]\begin{bmatrix} S_x& 0 & 0 & 0 \\ 0& S_y& 0 & 0 \\ 0& 0& 1 & 0 \\ Q_x& Q_y & 0 & 1 \end{bmatrix}[x^.,y^.,0,1]$$

  1. (0,0)를 x,y에 넣어서 계산 행렬의 원점 (0.5, 0.5)

$$[0,0,0,1]\begin{bmatrix} S_x& 0 & 0 & 0 \\ 0& S_y& 0 & 0 \\ 0& 0& 1 & 0 \\ Q_x& Q_y & 0 & 1 \end{bmatrix} =[0.5,0.5,0,1]$$

  1. (1,1)를 좌표 값으로 행렬 계산 하면 스케일 값 (0.5,-0.5)

$$[1,1,0,1]\begin{bmatrix} S_x& 0 & 0 & 0 \\ 0& S_y& 0 & 0 \\ 0& 0& 1 & 0 \\ 0.5& 0.5 & 0 & 1 \end{bmatrix} =[1,0,0,1]$$

$S_x = 0.5, S_y = -0.5$초

  1. A → B 좌표계 변환 행렬

$$[x,y,0,1]\begin{bmatrix} 0.5& 0 & 0 & 0 \\ 0& -0.5& 0 & 0 \\ 0& 0& 1 & 0 \\ 0.5& 0.5 & 0 & 1 \end{bmatrix} =[x^.,y^.,0,1]$$ 

역행렬과 좌표 변경 행렬

A → B 좌표계 변환하는 행렬을 M 지정

$P_AM = P_B$ 일때 반대로 좌표 변환 시 다음 공식에 따라 처리

$P_B = P_AM\\P_BM^{-1}=P_AMM^{-1}\\P_BM^{-1}=P_AI\\P_BM^{-1}=P_A$

좌표 변경 행렬과 역행렬의 관계

M은 가역 행렬로 역행렬이 존재 할 때만 가능

책에 나오는 모든 행렬에는 가역 행렬이 존재

좌표계 변경 시 역행렬이 존재 하지 않으면 좌표 변경 시 큰 어려움

 

B→ C 좌표계 변경 시 행렬 L 지정

A→C 좌표계 변경 시 $P_AML = P_C$ 공식을 따라 처리

C→A 좌표계 변경 시

$P_AML = P_C\\P_AML(ML)^{-1} = P_C(ML)^{-1}\\P_AMLL^{-1}M^{-1} = P_CL^{-1}M^{-1}\\P_A = P_CL^{-1}M^{-1}$ 위의 공식으로 구함

행렬의 역행렬 공식 $(ML)^{-1} = L^{-1}M^{-1}$

변환 행렬(이동, 회전, 비례)과 좌표 변경 변환을 구분 했지만 수식 자체는 같음

즉 좌표 변경 변환이 비례 회전 이동으로 표현 가능, 해석 자체만 다를 뿐