게임수학/행렬

게임수학) Chapter4. 변환행렬(SRT)

PJNull 2021. 11. 17. 15:27
728x90
반응형

Translation 행렬

 

변환행렬(Translation Matrix)은 위치벡터에서 크기,회전,위치변환을 위해 곱해지는 행렬을 의미한다.

예를 들면 행렬 A(x,y,z)인 1x3의 행렬을 3x3의 행렬로 곱하여 원하는 값을 얻기 위한것이다.

위의 그림과 같이 계산하게된다면

x->X

=ax+dy+gz

 

y->Y

=bx+hz+ye

 

z->Z

=cx+fy+jz

 

가 되며 계산된 각 원소는 x,y,z의 값에 영향을 받게 된다는 것을 알게된다. 이럴 경우 변환행렬에 관계없이 원하는 좌표로 이동이 불가하게 된다.

따라서 변환행렬을 할때는 n차원의 행렬은 n+1차원의 행렬로 변환하여 계산하게 된다.

x->X

=ax+ey+jz+n

 

y->Y

=bx+fy+kz+o

 

z->Z

=cx+gy+lz+p

 

w->W

=dx+hy+mz+q

 

가 되며 X,Y,Z의 n,o,p는 x,y,z의 영향을 받지 않으므로 n,o,p를 원하는 좌표로 지정하면 원하는 좌표로 이동을 시킬수 있으며, W의 q값은 1로 다시 나와야 되기 때문에 q값은 1이되게된다.

여기서 X=ax+ey+jz+n인데 x를 n만큼 이동하고 싶은것이기에

X=x+n

Y=y+o

Z=z+q

의 식이 되어야 한다.

따라서 Translate행렬이 되기 위해서는 

이 되어야 한다.

 

 

Scale 행렬

 

Scale행렬의 경우 좌표가 배수로 변화하기를 원하기 때문에 

X=x*a

Y=y*b

Z=z*c

W=1와 같은 형식으로 나와야 하며

와 같은 형태의 행렬이 나와야 한다.

 

 

 

 

Rotation 행렬

 

 z축으로 회전을 하기 위해서 위의 그래프와 같이 대각의 길이를 a라고 하고 그 각이 c라고 할때

x의 값은 a*cos(c), x'는 a*cos(c+θ)이 되며,

y의 값은 a*sin(c), y'의 값은 a*sin(c+θ)가 되게된다.

z는 축이 되어야 되기 때문에 가지고 있는 z값을 그대로 가져야된다.

이것을 풀어쓰면

x'=a*(cos(c)*cosθ-sin(c)sinθ)

=xcosθ-ysinθ

y'=a*(sin(c)cosθ+cos(c)sinθ)

=xsinθ+ycosθ

z'=z이 되며

 

이것을 행렬로 바꾸면 

 

 

z축 회전의 경우

 

y축 회전의 경우

x축 회전의 경우

 

※변환행렬은 반드시 Scale->Rotation->Translation순으로 적용해야된다.

728x90
반응형