[openGL] Transformation

나우히즈·2024년 10월 1일

Graphics

목록 보기
3/17

서론

이번 게시글에서는 어떻게 물체를 표현하는데 필요한 변환(Transformation)에 대해 알아보고 여러가지 공간들에 대해 알아보자.


물체 공간

그래픽스에서 물체를 렌더링하기 위해서 렌더링 파이프라인을 따라 여러가지 변환을 사용해가며 물체를 표현하는데, 순서에 따라 하나씩 보도록 하자.

Local space

대부분의 버텍스 데이터는 모델 공간이라고 알려진 객체 공간에서 시작한다.

개별 오브젝트의 고유한 좌표계로 ModelTransform을 구성하면서 정해진다. ModelTransformtranslate -> rotate -> scaling 의 세 가지 동작으로 이루어지며 이를 통해 오브젝트 원점, 축 등을 정의하게 된다.

오브젝트의 기하학적 데이터(버텍스, 노멀 등)는 로컬 공간에서 정의됩니다. 이 공간에서의 변환(회전, 이동, 크기 조절 등)은 해당 오브젝트에만 영향을 미칩니다.

로컬 공간에 존재하는 점을 ModelTransform 시키게 되면 월드공간으로 변환된다.

auto model = glm::translate(glm::mat4(1.0f), glm::vec3( 2.0f, 5.0f, -15.0f));
     model = glm::rotate(model, glm::radians(45.0f), glm::vec3(1.0f, 0.0f, 0.0f));

위 코드는 오브젝트의 점을 (2, 5, -15)을 원점으로 하여 옮기고, 45도 회전을 x 축 기준으로 진행하는 model 행렬.

World space

모든 오브젝트가 배치된 세계의 좌표계. 고정된 전역 원점에 대한 상대적인 값으로 좌표가 저장됨.

월드 공간에서는 모든 오브젝트가 상대적인 위치를 가지며, 환경 내에서 서로의 위치와 방향을 정의할 수 있다. 따라서 라이팅 계산이나 물리 계산이 이루어지는 공간이기도 함.

해당 월드 공간을 카메라의 시점으로 변환하여 뷰 공간으로 변환하게 된다.

View 행렬 만들기

  • 카메라의 위치를 원점으로 이동시킵니다. 이를 통해 월드 공간의 원점(0, 0, 0)을 카메라 위치로 설정하게 됩니다.

  • 카메라가 바라보는 방향에 맞게 월드 공간의 축을 조정합니다. 카메라의 업 벡터(up vector)와 바라보는 방향(view direction)을 기반으로 축을 정렬하여, 카메라가 어떻게 회전해야 하는지를 정의합니다.

이후 월드 좌표 상의 점을 View 행렬을 곱하여 View space로 변환한다.

View Space

카메라의 시점에서 본 공간으로, 월드 공간에서 카메라의 위치와 방향을 기준으로 변환된 공간입니다.

월드 공간에서 오브젝트의 위치를 카메라의 시점으로 변환하기 위해 뷰 행렬을 사용합니다. 이 행렬은 카메라의 위치와 방향을 기준으로 합니다.

특징: 뷰 공간에서는 카메라가 (0, 0, 0)에 위치하고, 카메라의 방향이 x, y, z 축을 기준으로 정의됩니다.

프로젝션 행렬을 사용하여 Canonical space로 변환하게 된다. 뷰 공간에서의 좌표는 프로젝션 행렬을 사용하여 정규화된 클립 공간으로 변환되는데, 이 행렬은 원근 투영 또는 직교 투영에 따라 달라집니다.

  • perspective projection
glm::mat4 projection = glm::perspective(fovy, aspect, near, far);

fovy: 세로 방향의 필드 오브 뷰(Field of View) 각도(라디안 단위). 일반적으로 카메라의 시야가 수직으로 얼마나 넓은지를 정의합니다.
aspect: 화면의 가로 세로 비율(width/height). 보통 창의 너비를 높이로 나눈 값입니다.
near: 카메라의 앞쪽 평면(near clipping plane)까지의 거리. 이 거리보다 가까운 물체는 렌더링되지 않습니다.
far: 카메라의 뒤쪽 평면(far clipping plane)까지의 거리. 이 거리보다 먼 물체는 렌더링되지 않습니다.

  • orthogonal projection
glm::mat4 projection = glm::ortho(left, right, bottom, top, near, far);

left: 좌측 평면의 x 좌표
right: 우측 평면의 x 좌표
bottom: 하단 평면의 y 좌표
top: 상단 평면의 y 좌표
near: 카메라의 앞쪽 평면(near clipping plane)까지의 거리
far: 카메라의 뒤쪽 평면(far clipping plane)까지의 거리

Canonical Space

3D 공간을 2D 화면으로 프로젝션하기 전에 오브젝트가 위치하는 공간.
보통은 [-1, 1]의 범위를 갖는 정규화된 좌표계를 사용.

오브젝트 공간에 있는 물체를 흔히 MVP 행렬을 곱하여 Canonical space로 변환한다.

0개의 댓글