본문 바로가기

ComputerGraphics [고려대학교_한정현]

[Learn OpenGL 번역] 2-8 시작하기 - 좌표시스템

좌표시스템

 

Vertex(정점)들을  Transfrom(변환)하는 것은 수학적으로 Transform Matrix( 변환 행렬 ) 을 사용하면 된다고 배웠습니다.

OpenGL에서는 각 Vertex Shader ( 프로그램 입니다) 가 실행 된 후 우리가 그릴 모든 Vertex(정점) 들의 각 x,y,z좌표는  (-1.0 ~ 1.0) 사이의 정규화된 좌표로 표시되어야 합니다. 

이 범위 밖의 좌표들은 보이지 않게 됩니다.

보통 우리가 직접 구성한 자유로운 범위의 좌표를 지정하고  Vertex Shader에서 이 좌표들을 NDC좌표 (-1.0,1.0) 으로 변환합니다.

VertexShader에서 나온 NDC 좌표들은 Rasterizer에게 보내집니다. 화면위의 2D 좌표/ 픽셀로 변환됩니다.

 

#NDC좌표로은 4번의 Transform 을 통해 화면위의 2D좌표로 변환 됩니다.

 *Object Space

    -- World 공간의 원점을 기준으로 하는 좌표계. 원점을 기준으로 2개 이상 Object를 배치 [Model Matrix사용] ---->   *WorldSpace

    --카메라(보는사람)시점에서 보이는 공간에서의 좌표 [View Matrix사용]---->    

 *ViewSpace(EyeSpace CameraSpace)

    --Vertex들이 화면위에 그려지게 될것인지 결정됨 [Projection Matrix사용]---->

 *ClipSpace 

   -- NDC(-1.0,1.0) 좌표 범위로 변환 [glViewPort Transform]--->

 *ScreenSpace 

   => 여기서 나온 NDC좌표는 Rasterizer로 보내져 Fragment 로 변환됩니다.

 

이 좌표시스템들은 Vertex들이 Fragment 로 최종적으로 변환되기 전까지는 모두 다른 상입니다.

 

각각의 Space(공간)들이 무엇을 위해 쓰이는지 조금은 이해가 가셨나요?

자세한 설명은 곧 하고,  왜 절차적으로 공간을 이동시키는지 설명해드리겠습니다. 

 

Vertex들을 다른 Space(공간)들로 Transfrom(변환) 하는 것을 절차적으로 하는 이유는 일부 연산들이 특정 좌표 시스템에서 좀 더 사용하기 쉽기 때문입니다.  그 일부 연산을 예를 들자면, 하나의 오브젝트를 수정할 때 Object Space에서 작업하는 것이 가장 직관 적입니다. 반면에 하나의 Object(물체) 다른 Object(물체) 에 상대적으로 변환하는 특정 연산을 수행하는 것은  World Space 좌표에서 가장 직관적 입니다. 

우리는 당연히 Object Space 에서 ClipSpace로 한번에  Transform 하는 matrix를 구할 수 있으나, 유연성을 저하시킵니다.

 

[ 공간에 대한 설명 ]

Object Space 

 우리의 오브젝트(물체)에 대한 좌표 공간입니다. 즉, 오브젝트(물체)가 시작하는 공간입니다. 모델링 소프트웨어(blending) 에서 정육면체를 생성했다고 상상해보세요. 그 물체는 게임상에서 좌표가 따로 있을테지만,  모델링상에서는 원점(0,0,0)을 기준으로 그려졌을 것입니다.

우리가 게임 내에 배치해야할 모든 물체들은 처음 모델링 상황에서는 모두 (0,0,0)원점을 기준으로 그려졌을 것입니다.

 

우리가 사용했던 컨테이너의 Vertex 들은 0,0을 원점으로 -0,5와 0.5 사이의 좌표들로 지정했었습니다. 이것이 Object 좌표입니다.

 

World Space

 우리의 모든 물체들을 게임에 직접 넣는다면 그 물체들은 모두 원점이 (0,0,)인 World를 중심으로 쌓이게 될 것입니다. 이것은 우리가 원하는 것이 아닙니다. 우리는 각 물체들을 더 큰 World 에 배치하기 위해서 각 물체에 대한 위치를  정의해야 합니다. 이 World내에서의 좌표가 WorldSpace좌표입니다. 모든 Vertex의 좌표는 World(게임내)를 기준으로 합니다. 이것은 우리가 게임을 만들며 세상에 물체를 원하는 곳에 배치하는 현실적인 방법입니다.

Object Space에서 World Space로 이동하는 것은 Model 행렬을 이용해서 수행됩니다.

 

View Space

 사람들이 일반적으로 OpenGL 에서 바라보는 관점(카메라)를 나타내는것입니다. 따라서 Eye Space라고도 불립니다. ViewSpace는 WorldSpace를 유저의 시점에서 보는 좌표로 변환했을 때의 결과입니다.

따라서 View Space 는 카메라의 관점에서 바라보는 공간입니다. 일반적으로 Scene(씬)을 이동/회전 시키기 위해서 이동,회전의 조합을 사용하여 수행합니다. 그리고 특정 아이템이 카메라 앞으로 변환됩니다.

  이 조합된 변환(이동,회전이 조합된 변환)들은 일반적으로 View Matrix 에 저장되고, View 행렬은 World Space 좌표를 View Space공간으로 변환합니다.