상세 컨텐츠

본문 제목

개념 3D 이해 3.변환

프로그래밍/3D

by ∫2tdt=t²+c 2008. 11. 13. 13:20

본문

3차원 그래픽을 위해서인지는 몰라도 선형대수학이라는 학문이 발전되어 있다. 고등학교 때 행렬을 배우면서 이걸 어디에다가 쓰지 어디에다가 쓰지 했지면, 행렬은 3차원 그래픽에 쓰이고 있었다!
위키백과: 선형대수학
선형대수학은 벡터와 행렬에 대해서 연구하는 학문인데, 간단하게 말해서 우리는 3차원 상의 변환을 표현하기 위해서 행렬 변환을 사용할 것이다.

여기서 너무 수학적인것에 대해 설명한다면 머리가 터질지 모르므로 간략히 설명하면서 넘어가겠다.
일단 저번에 표현해봤던 점을 다음과 같이 벡터로 표현해보자.
(x y z 1)

마지막에 1이 왜 들어갔냐고 따지지말라. 1의 유용함이 곧 드러날것이다.

우리는 이 4차원 벡터에다가 4차 정사각행렬을 곱할것이다.
이 식 그림들은
DirectX Documentation for C++에서 가져왔음.

그럼 x',y',z'은 다음과 같이 될 것이다.

(이게 왜 이렇게 나오는지 궁금하다면 고등학교 수학1 행렬부분을 다시 공부하길 바란다.)
이제 M11에서 M44에 좀 실용적인 숫자를 넣어서 실용적인 결과가 나오도록 해보자.







1
0
0
0







0
1
0
0
0
0
1
0
Tx
Ty
Tz
1
이 행렬을 대신 넣어서 곱해보자.

그러면
x'=x+Tx
y'=y+Ty
z'=z+Tz
가 된다.
이를 평행이동 변환이라고 한다. 3차원 물체의 점들에 각각 이 행렬을 곱해주면 3차원 물체가 (Tx,Ty,Tz)만큼 평행이동을 할 것이다.








Sx
0
0
0







0
Sy
0
0
0
0
Sz
0
0
0
0
1
이 행렬을 곱하면
x'=Sx * x
y'=Sy * y
z'=Sz * z
가 된다.
이것은 점을 x,y,z축으로 확대/축소(스케일링)하게 된다.

회전변환들

다음 행렬을 곱하면 x축 중심으로 T도 회전한다.







1
0
0
0







0
cosT
sinT
0
0
-sinT
cosT
0
0
0
0
1

다음 행렬을 곱하면 y축 중심으로 T도 회전한다.







cosT
0
-sinT
0







0
1
0
0
sinT
0
cosT
0
0
0
0
1

다음 행렬을 곱하면 z축 중심으로 T도 회전한다.







cosT
sinT
0
0







-sinT
cosT
0
0
0
0
1
0
0
0
0
1

그러면 여러 변환들을 함께하려면 어떻게해야할까?

A,B,C를 변환 행렬이라고 하면

[x' y' z' 1]=[x y z 1]*A*B*C

이렇게 하면 차례대로 A변환 B변환 C변환이 적용될 것이다.
행렬은 교환법칙이 성립하지 않지만 결합법칙이 성립한다는것을 기억하라.
따라서 다음처럼 묶어줄수 있고
[x' y' z' 1]=[x y z 1]*(A*B*C)

A*B*C를 계산한 결과가 R이라고 하면
[x' y' z' 1]=[x y z 1]*R
이 된다.

이는 무엇을 의미하는가?
그 어떤 행렬변환들을 몇번반복했던간에 하나의 행렬로 표시할수 있다.
따라서 3차원 상의 모든 변환들은 행렬하나를 곱하는것으로 대체할수 있는걸 의미한다.


'프로그래밍 > 3D' 카테고리의 다른 글

Direct3D에 FreeType로 폰트 출력하기  (4) 2013.04.06
개념 3D 이해 6.월드 변환  (0) 2008.12.30
개념 3D 이해 5.프로젝션 변환  (0) 2008.11.17
개념 3D 이해 4.뷰 변환  (0) 2008.11.13
개념 3D 이해 2.위치  (0) 2008.11.13
개념 3D 이해 1.삼각형  (0) 2008.11.13

관련글 더보기

댓글 영역