본문 바로가기

Theory/Mathmatics

변환(Transformation)

저번 "행렬과 연산" 포스팅에 이은 행렬을 이용한 변환? 변형? (아 뭐라고 해야 할지는 모르겠네요 ;_;) 기법에 대해서 알아 보려고 합니다.
   
이 포스팅을 하는 목표가 게임엔진 제작을 위한 3D 그래픽에 관련된 부분이라 한 가지 집고 넘어가야 하는 부분이 있습니다. 왜 하필 "행렬"을 이용 할까? 입니다. 알고 싶으신 분들만 보도록 하세요 :-D
   
   
3D 오브젝트는 여러 개의 점(여기서의 표현은 벡터)로 이루어 져있습니다. 그러한 점들을 변형 하는 방법은 아래의 세가지 입니다.
   
  • Translation(이동)
  • Rotation(회전)
  • Scaling(확대/축소)
   
각각에 대한 행렬을 잘 만들어서 벡터에 곱하게 되면, 그 결과값이 나오는 거지요. 그리고 3차원이라서 3x3짜리 행렬을 사용 하는 것이라 아니라 4x4짜리 행렬을 사용하게 된답니다. 자세한 내용은 생략 하도록 할게요 :-D 프로그래밍 분류에서 설명 했다 시피 "Point"와 "Vector"는 서로 다른 의미 이기 때문에 프로그램 상에서는 이를 분류하기 위해 하나의 변수를 더 사용해서 3x1이 아닌 4x1짜리 벡터를 사용하게 되는데 아래와 같이 사용됩니다.

    
위에서 빨강색으로 표현된 값을 homogeneous value라고 하는데, 저도 정확한 의미는 가물가물 :-D
  • Translation(이동)
    이동을 시켜주는 행렬은 아래와 같습니다. 입력 벡터의 각항에 대한 변화량을 더해주는 결과를 얻을 수 있습니다.

     
       
    여기에 입력된 벡터가 아래와 같다고 하면,


       
    행렬과 벡터를 곱한 결과는 아래와 같습니다.

     


    다항식으로 표현 하면 아래와 같겠죠?

     
       
  • Rotation(회전)
    3차원에서 기본적인 축이 세 개가 있습니다. x, y, z축. 그 각각의 축에 대한 회전행렬을 먼저 살펴 볼게요.
    • x축 회전 행렬 

         
    • y축 회전 행렬 

         
    • z축 회전 행렬 

       
    예시로 벡터p를 z축에 의해서 회전 시켜 볼게요. 벡터 p가 아래와 같으면,


       
    계산은 아래와 같이 되겠죠.

     
       
    결과를 보시면 의미를 알 수 있을 거에요. z값은 아무런 변화가 없이 전에 있던 값이 나오잖아요? 그림에서 그려보면 z축을 기준으로 회전 시키는 것이니까, 아무리 회전해도 z축의 값은 변하지 않고 x,y의 값만 z축을 기준으로 뱅뱅 도는 거죠 :-D

     
       
    그럼 실제 사용함에 있어서 기본축(x, y, z)만 기준으로 회전하게 될까요? 아니죠~ 임의의 축에 대한 회전도 이루어 질 수도 있는 것이죠. 각각의 축에 대해서 회전을 모두 시키게 되면 임의의 축에 대한 회전이 되는 것이고, 그걸 행렬로 만드는 방법은 그냥 싸그리 곱해주면 되는 거죠 :-D

     
       
    그런데, 위에서 얘기한 것들은 각 축에 대한 회전각에 대해서 회전한 겁니다. 고로, "축"이 주어가 아니라 그 "축을 중심으로 한 각도"가 주어가 되는 것이죠. 그렇게 해서 각 축에 대한 회전각을 x가 β, y가 γ, z가 α만큼 회전시키는 행렬은 아래와 같습니다.

     
       
    그럼 임의의 축에 대한 회전은 어떻게 계산해야 하는가..?!
       
    간단해 지죠. 임의의 축이 x, y, z각축에 대해서 몇 도씩 회전되었는지 알 수 있을 테고, 그것은 곧장 저 행렬에 대입하면 나올 테니까요. :-D 몇도 회전 되었는지 어떻게 아냐구요? 바로 저번 행렬 포스팅에서 내적을 이용 하면 됩니다요.
       
    회전 행렬까지는 돌려보진 않았지만, 두 개의 임의의 벡터간에 각도를 구하는 프로그램을 구현해 보았습니다. => 임의의 벡터간 각도 구하기
       
  • Scaling(확대/축소)
    확대/축소는 간단합니다. 각 축을 몇 배 해라. 라는 내용만 넣으면 되니까요. 그 행렬은 아래와 같습니다.

     
       
    벡터 p가 아래와 같을 때, 연산한 결과 입니다.  


       
    이를 다항식으로 표기하면 아래와 같겠죠.  


       
참조 : OPENGL GAME PROGRAMMING(Foreword by Mark J.Kilgard)

'Theory > Mathmatics' 카테고리의 다른 글

행렬과 연산  (0) 2011.12.14
수학에서의 Scalar와 Vector  (0) 2011.12.13