본문 바로가기

예전/3D수학

[3D 수학] 3D 변환 행렬



1. 이동

 - (x, y, z, 1) 벡터에 이동 행렬 T(p)를 곱하면 x축으로 Px, y축으로 Py, z축으로 Pz만큼 이동된 벡터가 나온다.

Direct3D에서 사용하는 함수명은 D3DXMatrixTranslate이다.





2. 회전


- 행렬을 이용해 x, y, z축에서 벡터를 회전시킬 수 있다. 





Direct3D에서 사용하는 함수명은 각각


D3DXMatrixRotationX







D3DXMatrixRotationY






D3DXMatrixRotationZ 이다.


- Direct3D는 왼손 좌표계를 사용한다. 엄지를 위로 하고 검지와 중지를 폈을 때, 엄지가 +y, 검지가 +z, 중지가 +x 축이 된다.




3. 크기 변형


 - 벡터에 이동 행렬 S(q)를 곱하면 x축으로 qx, y축으로 qy, z축으로 qz만큼 크기 변형된 벡터가 나온다.





Direct3D의 함수명은 


D3DXMatrixScaling 이다.



4. 변환 조합


- 앞서 기본적인 행렬 포스팅에서 3D에서 행렬을 사용하는 이유에 대해 보았다. 다시 한번 보자면,


위와 같다.


1번은 위의 이동, 회전, 크기 변환 행렬을 통해 보였다.

2번은 지금부터 할 변환 조합이다. 


행렬의 곱은 여러 행렬을 곱해 하나의 행렬로 표현할 수 있다. 다만, 행렬의 곱은 교환 법칙이 성립하지 않으므로 이를 주의한다면 

유용하게 사용할 수 있다.


문제를 통해 변환 조합의 활용도를 보자.





위 문제를 요약 하면, 


모든 축으로 1/5 크기만큼 축소, y축으로 45도 만큼 회전, (1, 2, -3) 만큼 이동이 된다.




이 문제를 푸는 데는 2가지 방법이 있다.



첫 번째, 벡터에 하나씩 행렬을 곱하는 방법을 보겠다.










먼저 p에 크기 변형 행렬 S를 곱하면, p'가 나온다.








p'에 y축 회전 행렬 Ry를 곱하여 p''를 만든다.








p''에 이동 행렬 T를 곱한후 p'''를 만든다.




이 p'''가 최종적인 결과물이다.

이 간단한 크기 변형, 회전, 이동을 하는 데만 행렬 곱셈의 연산이 3번이 들어갔다. 


벡터 하나를 변환하는데 이런 정도의 연산이 들어간다면, 후에 복잡한 메쉬를 변환할 땐 얼마나 많은 연산이 필요할까?



이것이 바로 행렬을 3D에서 사용하는 이유다.



두 번째, 여러 변환을 하나의 행렬로 결합이 가능하다.







 















위에 나온 SRyT행렬을 순서대로 곱하여 하나의 변환 행렬 Q를 만들었다.


이를 벡터 p와 곱하면



위와 같다.



결과적으로 벡터 p에 행렬을 하나 하나 씩 곱하나, 행렬을 하나의 행렬로 만든 후 벡터 p에 곱하나 같은 값이 나온다는 것을 의미한다.


이와 같은 작업 방식은 벡터, 행렬 곱 연산 수를 획기적으로 줄여줘 3D 변환에 매우 유용하다.








'예전 > 3D수학' 카테고리의 다른 글

[3D 수학] 사원수(Quaternion : 쿼터니언)  (4) 2012.09.12
[3D 수학] D3DXMatrixInverse 의 이해  (0) 2012.09.05
[3D 수학] D3DX 행렬  (0) 2012.09.03
[3D 수학] 기본적인 행렬  (0) 2012.09.03
[3D 수학] 벡터 (Vector)  (0) 2012.09.03