Search
Duplicate
🖼️

행렬 연산과 물체의 이동

간단소개
물체의 이동 연산
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
Graphics
Scrap
태그
벡터연산
9 more properties

Translation Matrix (물체 이동)

(x,y) from origin1 ⇒ (x+a, x+b) from origin 1
[x, y, 1] Vector를 [x+a. x+b, 1]로 (α\alpha , β\beta)만큼 이동시킨다. 이때 [x, y, 1] 에 1 이 뒤에 붙음으로서 행렬 하나로 이동 연산을 처리할 수 있다.
Translate 2D[10α01β001][xy1]=[x+αy+β1]Translate\ 2D\\ \begin{bmatrix} 1 & 0 & \alpha \\ 0 & 1 & \beta \\ 0& 0& 1 \\ \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} = \begin{bmatrix} x+\alpha \\ y+\beta \\ 1 \end{bmatrix}
Translate 3D[100α010β001γ0001][xyz1]=[x+αy+βz+γ1]Translate\ 3D\\ \begin{bmatrix} 1 & 0 & 0 & \alpha\\ 0 & 1 & 0 & \beta \\ 0 & 0 & 1 & \gamma\\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} = \begin{bmatrix} x+\alpha \\ y+\beta \\ z+\gamma \\ 1 \end{bmatrix}

Scaling Matrix (물체 크기 변경)

(2) 원점 기준 Scaling

Scale 2D[a000b0001][xy1]=[axby1]Scale \ 2D \\ \begin{bmatrix} a & 0 & 0 \\ 0 & b & 0 \\ 0 & 0 & 1 \\ \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} = \begin{bmatrix} ax \\ by \\ 1 \end{bmatrix}
Scale 3D[α0000β0000γ00001][xyz1]=[αxβyγz1]Scale\ 3D\\ \begin{bmatrix} \alpha & 0 & 0 & 0\\ 0 & \beta & 0 & 0\\ 0 & 0 & \gamma & 0\\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} = \begin{bmatrix} \alpha x \\ \beta y \\ \gamma z\\ 1 \end{bmatrix}

(2) 점 (α,β)(\alpha, \beta)를 기준으로 도형 Scaling

사각형에게 이 Matrix를 적용할 때, 중심점이 (0,0)이면 아무 문제가 없다. 문제는 도형의 중심점이 Origin Point가 아닐 때 생긴다.
기준점이 0,0인 경우 의도한 대로 정상 작동
그러나 물체의 위치까지 함께 변화하는 문제 발생
이를 어떻게 해결할 것인가?
사각형 중심을 원점(0,0)으로 이동시킨뒤 Scale matrix를 곱해주고 기존 원점으로 재 이동 시킨다. 즉 Translate + Scale + Translate.
만약 a(1,1) b(1,3) c(3,1) d(3,3) 점을 가진 사각형의 중심축이 (2, 2)라면 a(1,1) → 2* a'(-1, -1) ⇒ a''(-2, -2) → a'''(0, 0) b(1,3) → 2* b'(-1, 1) ⇒ b''(-2, 2) → b'''(0, 4) c(3,1) → 2* c'(1, -1) ⇒ c''(2, -2) → c'''(4, 0) d(3,3) → 2* d'(1, 1) ⇒ d''(2, 2) → d'''(4, 4)
이를 행렬로 표현하면 아래와 같다.
Translate 2D[10α01β001][xy1]=[x+αy+β1]Translate\ 2D\\ \begin{bmatrix} 1 & 0 & \alpha \\ 0 & 1 & \beta \\ 0& 0& 1 \\ \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} = \begin{bmatrix} x+\alpha \\ y+\beta \\ 1 \end{bmatrix}
Scale(i^,j^)[i000j0001][xy1]Scale(\hat{i},\hat{j}) \\ \begin{bmatrix} i & 0 & 0 \\ 0 & j & 0 \\ 0 & 0 & 1 \\ \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix}
Translate(α,β)Scale(i^,j^)Translate(+α,+β)[10α01β001][i000j0001][10α01β001][xy1]=[xy1]{\color{blue}Translate(-\alpha,-\beta)} \Rightarrow Scale(\hat{i},\hat{j}) \Rightarrow Translate(+\alpha,+\beta)\\ \begin{bmatrix} 1 & 0 & \alpha \\ 0 & 1 & \beta \\ 0 & 0 & 1 \\ \end{bmatrix} \begin{bmatrix} i & 0 & 0 \\ 0 & j & 0 \\ 0 & 0 & 1 \\ \end{bmatrix} {\color{blue}\begin{bmatrix} 1 & 0 & -\alpha \\ 0 & 1 & -\beta \\ 0 & 0 & 1 \\ \end{bmatrix}} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} \\ = \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix}
Translate 3D[100α010β001γ0001][xyz1]=[x+αy+βz+γ1]Translate\ 3D\\ \begin{bmatrix} 1 & 0 & 0 & \alpha\\ 0 & 1 & 0 & \beta \\ 0 & 0 & 1 & \gamma\\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} = \begin{bmatrix} x+\alpha \\ y+\beta \\ z+\gamma \\ 1 \end{bmatrix}
Scale 3D[α0000β0000γ00001][xyz1]Scale\ 3D\\ \begin{bmatrix} \alpha & 0 & 0 & 0\\ 0 & \beta & 0 & 0\\ 0 & 0 & \gamma & 0\\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix}
Translate(α,β,γ)Scale(i^,j^,k^)Translate(+α,+β,+γ)[100α010β001γ0001][α0000β0000γ00001][100α010β001γ0001][xyz1]=[xyz1]{\color{blue}Translate(-\alpha,-\beta,-\gamma)} \Rightarrow Scale(\hat{i},\hat{j},\hat{k}) \Rightarrow Translate(+\alpha,+\beta,+\gamma)\\ \begin{bmatrix} 1 & 0 & 0 & \alpha\\ 0 & 1 & 0 & \beta \\ 0 & 0 & 1 & \gamma\\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} \alpha & 0 & 0 & 0\\ 0 & \beta & 0 & 0\\ 0 & 0 & \gamma & 0\\ 0 & 0 & 0 & 1 \end{bmatrix} {\color{blue}\begin{bmatrix} 1 & 0 & 0 & -\alpha\\ 0 & 1 & 0 & -\beta \\ 0 & 0 & 1 & -\gamma\\ 0 & 0 & 0 & 1 \end{bmatrix}} \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} \\ = \begin{bmatrix} x' \\ y' \\ z' \\ 1 \end{bmatrix}

2D Rotating Matrix (회전 변환)

사용된 공식.
cos(θ+ϕ)=cosθcosϕsinθsinϕcos(\theta+\phi) = cos\theta cos\phi - sin\theta sin\phi
sin(θ+ϕ)=sinθcosϕ+cosθsinϕsin(\theta+\phi) = sin\theta cos\phi + cos\theta sin\phi

(1) 원점 기준 2D Rotating

x=Rcosϕ\begin{matrix} x &=& Rcos\phi \end{matrix}
y=Rsinϕ\begin{matrix} y &=& Rsin\phi \end{matrix}
x=Rcos(θ+ϕ)=RcosθcosϕRsinθsinϕ=xcosθysinθ\begin{matrix} x' &=&Rcos(\theta+\phi)\\ &=&Rcos\theta cos\phi - Rsin\theta sin\phi\\ &=& xcos\theta - ysin\theta \end{matrix}
y=Rsin(θ+ϕ)=Rsinθcosϕ+Rcosθsinϕ=xsinθ+ycosθ\begin{matrix} y'&=& Rsin(\theta+\phi)\\ &=&Rsin\theta cos\phi + Rcos\theta sin\phi\\ &=& xsin\theta + ycos\theta \end{matrix}
Rotateθ 2D[cosθsinθ0sinθcosθ0001][xy1]=[xy1]Rotate \theta \ 2D\\ \begin{bmatrix} cos\theta & -sin\theta & 0 \\ sin\theta & cos\theta & 0 \\ 0 & 0 & 1 \\ \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} = \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix}

(2) (α,β)(\alpha, \beta)점 기준 2D Rotating

Translate(α,β)RotateθTranslate(+α,+β)[10α01β001][cosθsinθ0sinθcosθ0001][10α01β001][xy1]=[xy1]{\color{blue}Translate(-\alpha,-\beta)} \Rightarrow Rotate \theta \Rightarrow Translate(+\alpha,+\beta)\\ \begin{bmatrix} 1 & 0 & \alpha \\ 0 & 1 & \beta \\ 0 & 0 & 1 \\\end{bmatrix} \begin{bmatrix} cos\theta & -sin\theta & 0 \\ sin\theta & cos\theta & 0 \\ 0 & 0 & 1 \\ \end{bmatrix} {\color{blue}\\ \begin{bmatrix} 1 & 0 & -\alpha \\ 0 & 1 & -\beta \\ 0 & 0 & 1 \\ \end{bmatrix}} \cdot \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} = \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix}

3D Rotating Matrix

(1) (X, Y, Z) axis 기준 3D Rotating

특성 1) X axis 를 기준으로 회전시, 점의 X값들은 유지된다.
특성 2) Y axis 를 기준으로 회전시, 점의 Y값들은 유지된다.
특성 3) Z axis 를 기준으로 회전시, 점의 Z값들은 유지된다.
Z axis 기준 회전시 예시
Xaxis 3D Rotateθ[10000cosθsinθ00sinθcosθ00001][xyz1]=[xyz1]{\color{Green}X_{axis}} \ 3D \ Rotate\theta \\ \begin{bmatrix} 1 & 0 & 0 & 0\\ 0 & cos\theta & -sin\theta & 0\\ 0 & sin\theta & cos\theta & 0\\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} {\color{Green}x} \\ y \\ z \\ 1 \end{bmatrix} = \begin{bmatrix} {\color{Green}x} \\ y' \\ z' \\ 1 \end{bmatrix}
Yaxis 3D Rotateθ[cosθ0sinθ00100sinθ0cosθ00001][xyz1]=[xyz1]{\color{Green}Y_{axis}} \ 3D \ Rotate\theta \\ \begin{bmatrix} cos\theta & 0 & -sin\theta & 0\\ 0 & 1 & 0 & 0\\ sin\theta & 0 & cos\theta & 0\\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ {\color{Green}y} \\ z \\ 1 \end{bmatrix} = \begin{bmatrix} x' \\ {\color{Green}y} \\ z' \\ 1 \end{bmatrix}
Zaxis 3D Rotateθ[cosθsinθ00sinθcosθ0000100001][xyz1]=[xyz1]{\color{Green}Z_{axis}} \ 3D \ Rotate\theta \\ \begin{bmatrix} cos\theta & -sin\theta & 0 & 0\\ sin\theta & cos\theta & 0 & 0\\ 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ {\color{Green}z} \\ 1 \end{bmatrix} = \begin{bmatrix} x' \\ y' \\ {\color{Green}z} \\ 1 \end{bmatrix}

(2) Vector (P1, P2)를 기준으로 3D Rotate (around an Arbitrary Axis)

Rotate Around Aritrary AxisRax((P1,P2), ω회전각)[xyz1]=T1(P1)Ry1(θ)Rx1(ϕ)Rz(ω)Rx((ϕ)Ry(θ)T(P1)[xyz1]=[xyz1]이때 θ, ϕ 는 P2arctan(P2)로계산가능Rotate \ Around \ Aritrary \ Axis \\ R_{ax}(축(P_1, P2),\ {\color{red}\omega_{회전각}}) \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} \\= T^{-1}(P_1) \cdot R^{-1}_y(\theta) \cdot R^{-1}_x(\phi) \cdot {\color{red}R_z(\omega)} \cdot R_x((\phi) \cdot R_y(\theta) \cdot T(P_1) \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} = \begin{bmatrix} x' \\ y' \\ z' \\ 1 \end{bmatrix} \\ \\ 이때\ \theta ,\ \phi \ 는 \ P2의 \arctan{(P_2)}로 계산 가능
arctan (아크탄젠트)는 (x,0), (0,y) 정보가 있다면 각도를 구할 수 있다.
Rotate around an Arbitrary Axis (xyz축 중 선택)
1.
회전축 벡터의 시작점(P)를 원점으로 이동(Translate)시킨다.
2.
회전축 벡터를 Y Z Axis 평면으로 Rotate 시킨다.
3.
회전축 벡터를 Z Axis로 Rotate 시킨다.
4.
Z Axis를 기준으로 회전시킬 도형을 회전시킨다.
5.
(-) 회전축 벡터를 Z Axis로 복구 Rotate 시킨다.
6.
(-) 회전축 벡터를 Y Z Axis 평면으로 복구 Rotate 시킨다.
7.
(-) 회전축 벡터의 시작점(P)를 원점에서 시작점으로 이동(Translate)시킨다.