본문 바로가기

Theory/Graphic

투영(Projection)

실컷 3D의 세계에 대해서 떠들었네요. 그 기본이 되는 수학도 잠시 살펴보고:-D
   
이제 우리 눈에 보여질 것들에 대해서 설명하려고 합니다. 일단 그 기본이 되는게 projection이죠. 뭐 한글로 구지 풀어쓰자면 투영인데, 어딘가에 비추는 겁니다.
   
컴퓨터 내부에서 백날 3D로 계산하고 어쩌구 해도 실제 우리 눈에 비춰지는 것은 2D잖아요.(모니터) 뭐 3D모니터는 뭔가요? 라고 물어보시면 어차피 그건 눈속임이지 완전 우리 실생활에 있는 거처럼 3차원으로 보여지고 그런건 아니랍니다. 그런거면 안경이나 다른 3D장비가 왜 나오나요~ 3~
   
잡설이 좀 길었네요. 그럼 투영이 뭔지 설명하는 거보다 아래 그림 하나 보는게 더 빠를 거 같아요.

 
   
까만색 원이 바라보는 시각인데, 이것을 camera라고 합니다. 카메라가 컴퓨터 내부에서 계산된 3D세계를 바라보고 있는 상태에요. 실세계 에서 우리가 세상을 바라 볼 때 모든 세상을 다 볼 수는 없죠? 한눈에 들어오는 세계는 시야라는 것 때문에 한정 되어 있으니까요. 마찮가지 입니다. 가려진 것들 혹은 시야각에 벗어난 것들, 너무 멀리는 것들은 안 보이는 것이죠.
   
일단 이러한 projection에 대해서 알아볼 까요?
   
  • Parallel Projection
    간단히 말해서 원근감이 없는 투영 입니다. Orthographic projection 이라고도 합니다. CAD에서 특히나 많이 사용되는데 각 물체들의 절대적인 크기를 봐야 할 때 사용 됩니다.
       
    아래 보시는 거처럼 만약 xy평면, yz평면 또는 xz평면에서 저 사각형을 본다면 파랑색 사각형만 보이겠죠? 실제 3차원 물체는 정육면체임에도 불구 하지만요.

     
       
    물론 카메라가 바라보게 되는 평면이 우리가 알고 있는 것처럼 항상 xy, yz, xz평면은 아니겠죠? 그럼 해당 카메라가 바라보는 평면으로 저 사각형의 모습이 원근감 없이 보이겠죠?

       

       
  • Perspective Projection
    방금 설명한 투영과는 다른 원근감이 있는 projection입니다. 실제 우리 눈이 보는 것과 같은데요, 약간 이론 적인 설명을 한다면 아래와 같습니다.

     
    왼쪽 눈과 오른쪽 눈은 실제로 보게 되는 화면 자체가 다릅니다. 하지만 같은 물체가 뭔지는 알기 때문에 어느정도 만큼의 차이가 있으니까 사람이 인식하게 되는 결과적인 화면자체는 머리 위에 말풍선에 처럼 절대적인 크기는 차이가 있는 야구공과 농구공이지만 큰 차이가 없는 거처럼 보이게 되죠. 물론 농구공이 야구공 뒤쪽에 있는 것 처럼요.
    (이해를 돕기 위해 매우 과장해서 그렸습니다 :-D)
       
    그래도 이해가 안되신다구요? 이건 어떤가요?

     

       
    3차원 상에서 이 perspective projection을 시키는 행렬이 있는데, perspective transformation matrix, 이것을 설명하기 전에 FOV(Field of View) angle, 즉 시야각에 대해서도 봐야 합니다.
       
    focus distance라는 것은 view plane까지의 거리를 의미 합니다. 그리고 그렇게 만들어지는 각도를 FOV angle이라고 하구요.
       
    3차원적으로 표현한 것도 있지만, 이것은 우리가 이해하기 편하려고 보기 좋게 만든 이미지 이고, 실제로는 카메라를 바탕으로 만들어진 내용입니다.(이거 이해하려고 2시간인가 걸렸....ㅠㅠ) 아래에서 보는 view plane은 가상의 것이라고 생각하셔야 정신건강에 좋을 거 같아요:-D

     

       
    카메라는 받아드리는 상을 거꾸로 뒤집어서 필름에 상을 맺게하는 방식입니다. 물론 아까도 말했다 시피 위쪽그림과는 다른것은 우리가 이해하기 쉽도록 하기 위해서 만들어지는 것이지, 실제적으로 위쪽 처럼 된다는건 아닙니다.(오히려 실제적인 것에 가까운것은 아래 그림이지요. 파랑색 빗금 쳐진 부분이 view plane이 됩니다.

     

       
    view plane의 크기는 변하지 않습니다. 그런데 FOV가 변하게 된다면 어떻게 될까요? FOV는 focus distance와 반비례하게 됩니다. FOV가 작아지게 되면 시야가 좁아지는 것이죠. 바로 아래 그림 처럼 말이죠.

     

       
    하지만 우리는 3차원을 다루고 있고, 이것을 적용시켜서 이것을 보았을 때 어떠한 위치에 보이는 지를 계산해 주는 행렬은 아래와 같습니다. 하지만 바로 적용하지 않고 normalize시켜서 부피가 1인 view volume을 만들어서 계산하게 되요.

       
    계산이 될 벡터는 아래와 같습니다.

     

       
    계산에 의한 결과는 다음과 같습니다.

     

       
    결과 값을 보면 알겠지만, 3D에서 벡터를 의미하는 마지막 값이 1이 아닙니다. 이것을 renormalize시키게 되면 아래와 같이 되요.

     

       
    여기서 중요한 포인트는 z는 0이면 안되겠죠? 하지만 내부적으로 이를 계산하지 않게 되는데 이게 바로 Clipping 입니다. 그림을 다시 가져와 보자면, 아래의 그림 중 view volume이 있는 부분만 처리하게 되고, 나머지 z가 0부터 음수가 되는 부분은 처리하지 않게 되는 것입니다.

     

       
    저도 내부적으로 정확히는 모르지만, 우리가 설정하게 된 절대적인 z좌표가 아니라, view volume내부에 있는 z좌표에 대해서 처리하는 것이니까 오브젝트를 만들 때 z가 0보다 커야 하나 뭐 이런 고민은 안 하셔도 될 듯 :-D    
참조 : OPENGL GAME PROGRAMMING(Foreword by Mark J.Kilgard)

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

텍스쳐 바르기(Texture Mapping)  (0) 2011.12.19
빛(Lighting)  (0) 2011.12.19