게임수학/행렬

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

PJNull 2021. 11. 17.
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
반응형

댓글