2011년 2월 20일 일요일

백업] 네이버 30

때 늦은 3D 공부 중입니다. 나이 들어 정석책을 뒤지려니 죽을 맛이네요... ㅠㅠ;; 좌표계를 이동시키는 행렬 중 이동과 크기변환은 쉽게 이해가 되는데 회전행렬은 그렇지 않더군요. 삼각함수만 보이면 왠지 주눅이 들어서.. ^^;
공부한 거 정리도 할 겸 해서 회전공식을 유도하는 과정을 간단히 적어보겠습니다. 회전행렬에 왜 sin, cos이 들어가는지 궁금하신 분들만 보세요...
 

 
쉽게 생각할 수 있도록 2차원에서 접근해 보죠. 위의 그림과 같이 점 p(a,b)를 x,y 평면의 1사분면에 그려진 원과 직각삼각형에 대응시켜 봅시다. 삼각형의 길이를 a, b, c라 하고 밑변 a와 빗변 c가 이루는 각을 th라 하면 다음과 같은 관계가 있죠...

a = c * cos(th)
b = c * sin(th) ... ①
 

여기서 붉은 색으로 그려진 원의 반지름은 c이기 때문에 각 th가 0도일 때 점(c,0)을 th만큼 회전한 거라고 생각할 수 있겠네요.
이제 이 점을 각 th2만큼 회전시킨 점 p'(a',b')를 봅시다. 위의 관계에서 이 새로운 점 p'는 다음과 같이 생각할 수 있습니다.

a' = c * cos(th + th2)
b' = c * sin(th + th2) ... ②
 

식 ②는 삼각함수의 덧셈정리에 의해 다음과 같이 바꿀 수 있구요..

a' = c * cos(th) * cos(th2) - c * sin(th) * sin(th2)
b' = c * sin(th) * cos(th2) + c * cos(th) * sin(th2) ... ③
 

이제 식 ③에 식 ①을 넣으면 다음과 같이 바뀌죠...

a' = a * cos(th2) - b * sin(th2)
b' = a * sin(th2) + b * cos(th2)
 

이걸 행렬식으로 바꾸면 다음과 같구요...
 
| a' b' 1 | =  
 
| a  b  1 | *

|  cos(th2)  sin(th2)  0 |
| -sin(th2)  cos(th2)  0 |
|  0         0         1 |


위의 경우는 XY평면에서 Z축을 중심으로 임의의 각도만큼 회전한 경우 입니다. 3차원으로 생각할 때 변환 후 Z값은 그대로 넘어오게 되죠. 따라서 (x,y,z)를 Z축 중심으로 th만큼 회전한 경우 Z값을 그대로 넘기는 3차원 동차행렬은 다음과 같이 구성할 수 있습니다.
 
Z축 회전 행렬  

| x' y' z' 1 | =
다른 평면에 대해서도 생각해 보죠. 위와 마찬가지로 YZ평면에서 X축을 중심으로 th만큼 회전시킨 점 p'는 다음과 같고
 
| x  y  z  1 | *

|  cos(th)  sin(th)  0  0 |
| -sin(th)  cos(th)  0  0 |
|  0        0        1  0 |
|  0        0        0  1 |


 
p(x,y,z) --> p'(x',y',z').  

x' = y
y' = y * cos(th) - z * sin(th)
z' = y * sin(th) + z * cos(th)


XZ평면에서 Y축을 중심으로 th만큼 회전시킨 점 p'는 다음과 같겠네요.
 
p(x,y,z) --> p'(x',y',z').  

x' =   x * cos(th) + z * sin(th)
y' =   y
z' = - x * sin(th) + z * cos(th)


양의 방향 회전이므로 오른손 법칙에 의해 X축을 수직, Z축을 수평으로 놓은 2차원 좌표계를 그려 위의 과정대로 풀어보면 다른 축의 회전과는 sin 부호가 반대로 되는 것을 알 수 있습니다.
이제 위의 수식을 행렬로 표시하면 다음과 같게 됩니다.
 
X축 회전 행렬

|  1   0        0        0  |
|  0   cos(th)  sin(th)  0  |
|  0  -sin(th)  cos(th)  0  |
|  0   0        0        1  |
 
 
Y축 회전 행렬

|  cos(th)  0  -sin(th)  0  |
|  0        1   0        0  |
|  sin(th)  0   cos(th)  0  |
|  0        0   0        1  |


헥헥~~~ 끝났군요...
다음에는 뷰변환행렬을 얻는 과정에 대해 살펴보죠~~


그럼... ^^;;

댓글 없음:

댓글 쓰기

국정원의 댓글 공작을 지탄합니다.

UPBIT is a South Korean company, and people died of suicide cause of coin investment.

 UPBIT is a South Korean company, and people died of suicide cause of coin. The company helps the people who control the market price manipu...