[openGL] 카메라

나우히즈·2024년 10월 4일

Graphics

목록 보기
7/17

서론

게임을 하다 보면 다양한 시점에서 물체를 바라보게 된다.

이를 위해 필요한 카메라에 대해 생각해보자


카메라

컴퓨터 속 3D 가상 공간을 가상의 눈 시야로 바라보는 것을 카메라라고 한다. 우리는 이 카메라를 이동시키기도 하고, 회전시키기도 하면서 다채로운 각도로 물체를 보게 된다.
그렇다면 이 카메라는 어떻게 다루어지는걸까?

카메라도 하나의 오브젝트

제목 그대로 카메라도 하나의 오브젝트이다. 그렇기에 로컬 좌표계를 가지고 이 위치를 월드공간에 나타내야한다. 하지만 한 가지 특별한 점은, 카메라는 월드공간에 나타낼 때 월드공간의 중심, 즉 원점에 위치시킨다는 점이다.

월드공간에 다양한 오브젝트들이 존재한다. 우리는 그것들을 카메라의 시점에서 바라보아야하니, 아래의 항목들이 필요하게 된다.

  • 카메라의 위치
  • 카메라가 바라보는 방향 혹은 대상위치
  • 카메라의 윗 방향 벡터

이렇게 세 가지 벡터를 통해 우리는 카메라의 로컬 좌표를 구성할 수 있다.

카메라가 바라보는 방향(Z축)과 윗 방향 벡터를 외적하여 X축 좌표를 구할 수 있고,
Z, X를 차례로 외적하여 Y축을 얻을 수 있다.

이렇게 세 기저 벡터를 알게되면 이를 통해 월드 -> 카메라 변환 행렬을 구성할 수 있게 된다. 하지만 우리가 사용하게될 행렬은 이 변환행렬의 역행렬이 된다.

왜 역행렬을 사용하는가

역행렬을 사용하여 카메라공간을 월드공간으로 만드는 이유는, 월드공간은 모든 좌표의 기준이 되기 때문이다. 기준이 되는 값을 변환하여 바꿔버리는 것은 불안하다. 월드공간에서 라이팅 계산이나 여러가지 작업이 이루어지므로, 월드공간을 건들이지 않기로 한다.

하지만 우리는 카메라의 시점으로 물체들을 바라보아야하니, 카메라 시점에 맞게 다른 오브젝트들에 카메라의 시점을 적용한 이 역행렬을 연산해주는 것이 된다.

이 역행렬은 View 행렬이라 부르고, 일반적으로 물체의 로컬 공간을 월드공간으로 변환하는 Model transformation에 View transformation 을 연속하여 변환을 진행한다. Model transformation이 로컬 좌표 상의 물체를 월드 공간으로 옮기는 과정이고, View transformation이 월드공간상의 물체들을 카메라의 시점으로 적용하여 주는 것이 된다. (카메라는 월드 공간의 원점이 됨)

정리하자면,

  • 월드 좌표는 변하지 않는다:
    월드 좌표는 3D 씬에서 모든 오브젝트의 기본 위치와 방향을 나타내는 좌표계.
    이 좌표계를 유지하면서, 오브젝트들이 서로 어디에 있고, 어떻게 배치되어 있는지를 결정함.
  • 카메라의 좌표계를 적용:
    하지만 카메라가 위치한 곳에서 본 장면을 그리려면, 카메라를 기준으로 각 오브젝트가 어떻게 보이는지 계산해야함.
    이때 물체들에 카메라의 좌표계를 적용하여, 마치 카메라가 움직인 것처럼 보이지만, 실제로는 오브젝트들이 카메라 시점에 맞게 변환됨.
  • view 행렬을 곱하는 이유:
    이렇게 카메라의 위치와 방향에 맞춰 오브젝트들의 위치를 변환하는 과정이 view 행렬을 곱하는 작업이야.

월드 좌표계 자체를 변경하는 게 아니라, 월드 좌표에 있는 오브젝트들을 카메라 기준으로 변환하는 것. 그 결과, 카메라가 기준이 되는 좌표계에서 모든 오브젝트들이 적절하게 배치되고, 이를 통해 카메라 시점에서 장면을 렌더링할 수 있게 되는 것이다.


결론

나는 왜 월드 공간을 카메라 공간으로 변환하지 않고, 카메라공간을 월드공간으로 변환하는지에 대해 의문이 있었다. 하지만 정리를 해 보면서 여러가지 알아보게 되었고, 월드 공간을 기준으로 하여 카메라가 보는 시점을 정리하기 위해 나머지 오브젝트들에 뷰 행렬을 곱해 보이는 물체를 구분한다는 것을 알았다.

자칫 가볍게 넘어갈 수 있는 부분이었는데, 꼼꼼하게 본 결과 디테일을 놓치지 않은 것 같아 뿌듯하다!

0개의 댓글