반응형

http://blog.naver.com/oranke?Redirect=Log&logNo=40000788158  에서 일부 내용을 추려옵니다



뷰변환 행렬에 대해 살펴보기 전에 짚고 넘어가야 할 문제가 있습니다. OpenGL과 D3D를 말할 때 가장 큰 차이점으로 오른손 좌표계냐 왼 손 좌표계냐를 따집니다. 그리고 또 하나 얘기하는 것이 바로 행기준 행렬이냐 열기준 행렬이냐는 것이죠...

 

 좌표계 문제는 Z좌표를 뒤집기만 하면 끝납니다. 앞에서 살펴봤던 회전행렬 역시 오른손 좌표계가 오른손 법칙으로 양의 방향을 규정하는 것 처럼 왼손 좌표계는 왼손이 감기는 방향을 양의 방향으로 하기 때문에 회전행렬을 그대로 쓸 수 있습니다. 양의 방향에 해당하는 좌표평면과 축을 2차원에 설정해 그려보면 금방 알 수 있습죠...






OpenGL에서 사용하는 열기준 행렬과 D3D의 행기준 행렬이란 녀석들은 확실하게 그 차이를 이해해 두지 않으면 두고 두고 뒤통수를 맞게 됩니다. 

 참고로 양키들은 행기준 행렬(Row major matrix) 의 곱셈을 프리멀티플리케이션(Pre-multiplication), 열기준 행렬(Column major matrix) 의 곱셈을 포스트멀티플리케이션(Post-multiplication) 이라고 구분해서 쓰더군요.

 

 아무튼 우리가 일반적으로 사용하는 행기준 행렬은 아래처럼 정의되고,

 

  A(Row) = | a00 a01 a02 a03 |
           | a04 a05 a06 a07 |
           | a08 a09 a10 a11 |
           | a12 a13 a14 a15 |

 

 OpenGL 레퍼런스에 따르면 열기준 행렬은 다음과 같이 생겨먹었습니다.

 

  A(Col) = | a00 a04 a08 a12 |
           | a01 a05 a09 a13 |
           | a02 a06 a10 a14 |
           | a03 a07 a11 a15 |





행기준 변환행렬 A에 의해 절점 P(x,y,z,w) 가 새로운 절점 P'(x',y',z',w') 로 변환하는 과정을 살펴보죠. 고등학교 때 배웠듯이 행렬의 곱셈이 성립하려면 행과 열의 갯수가 같아야 하므로 다음과 같이 적어줍니다. (행렬의 어떤 요소끼리 곱하는지 손가락으로 짚으면서 보세요.)

 

  | x' y' z' w' | =

 

  | x  y  z  w  | × | a00 a01 a02 a03 |
                     | a04 a05 a06 a07 |
                     | a08 a09 a10 a11 |
                     | a12 a13 a14 a15 |

 

  x' = x*a00 + y*a04 + z*a08 + w*a12
  y' = x*a01 + y*a05 + z*a09 + w*a13
  z' = x*a02 + y*a06 + z*a10 + w*a14
  w' = x*a03 + y*a07 + z*a11 + w*a15

 

 원래 열기준 행렬은 절점, 또는 벡터를 표현하는 행렬을 세로, 즉 열로 표현하기 위해 사용합니다. 벡터 V(x,y,z,w) 에 변환행렬이 적용된 새로운 벡터 V'를 계산하는 과정을 열기준 행렬로 표현할 때는 다음과 같이 적어 줍니다.

 

  | x' |   | a00 a04 a08 a12 |    | x |
  | y' | = | a01 a05 a09 a13 | × | y |
  | z' |   | a02 a06 a10 a14 |    | z |
  | w' |   | a03 a07 a11 a15 |    | w |

 

 풀어보면 다음과 같습죠. (손가락을 짚으면서 보세요.)

 

  x' = a00*x + a04*y + a08*z + a12*w
  y' = a01*x + a05*y + a09*z + a13*w
  z' = a02*x + a06*y + a10*z + a14*w
  w' = a03*x + a07*y + a11*z + a15*w ... ①

 

 비교해 보나 마나 같은 결과 입니다. 



 OpenGL에서는 ① 에서의 방법으로 행렬을 표시하고 곱해주네요



반응형

+ Recent posts