OpenGL Camera Zoom 카메라 줌 [Learn OpenGL 쉬운 번역]

728x90
반응형
※ 본 포스팅은 learnopengl.com을 번역 및 가감한 포스팅이며, learnopengl에서는 번역 작업 참여를 적극 장려하고 있습니다!
아래 링크에서 원문을 확인할 수 있습니다.

 

Zoom

이제 카메라 시스템에 추가적으로 줌 기능을 구현해봅시다. 시야각(field of view)의 정도에 따라 얼마나 넓은 공간을 한 눈에 볼 수 있는지 결정됩니다. 시야각이 작으면 투영 공간이 작아지고 동일한 NDC에 투영되기 때문에 확대되서 보이는 줌 효과가 발생합니다. 우리는 줌 인터렉션으로 마우스 휠을 사용할 겁니다. 마우스 움직임과 키보드 입력처럼 스크롤도 콜백 함수가 있습니다. 

void scroll_callback(GLFWwindow* window, double xoffset, double yoffset)
{
    fov -= (float)yoffset;
    if (fov < 1.0f)
        fov = 1.0f;
    if (fov > 45.0f)
        fov = 45.0f; 
}

스크롤시 yoffset은 수직으로 스크롤한 정도입니다. scroll_callback 함수가 호출되면 fov 변수의 값을 변경합니다. 기본적으로 시야각은 45.0이므로 줌 레벨은 1.0~45.0 사이로 제한합니다.

 

매 프레임마다 perspective projection matrix를 GPU에 올려야합니다. 여기서는 fov 변수를 시야로 사용합니다.

projection = glm::perspective(glm::radians(fov), 800.0f / 600.0f, 0.1f, 100.0f);

그리고 스크롤 콜백 함수를 등록합시다.

glfwSetScrollCallback(window, scroll_callback);

이제 3D 환경에서 움직이는 카메라 시스템을 완성했습니다. 

 

 
 
 

 

 

 

 

Camera class

코드가 길어지면서 class를 나누는 것이 코드를 간결하기 보기좋습니다. 그래서 카메라 class를 만들어서 추상화하면 간결한 코드를 만들 수 있습니다. 

 

 

이전 shader 객체와 같이 camera class로 헤더 파일에 완전히 정의하는 방식입니다. 위 링크에서 camera class를 볼 수 있고 지금은 아니더라도 쭉 진행하다보면 코드를 금방 알 수 있습니다. 

 

우리의 카메라 시스템은 fly camera로 오일러 각도로 작동하고 있죠? 그렇다고 이걸 그대로 FPS나 비행 시뮬레이션 카메라에 쓰기는 부적절 합니다. 각 시스템마다 특징이 더 있기때문에 그럼 점들을 파악해야하죠. 예를 들면 우리의 fly camera는 pitch가 90도 이상 올라가지 않도록 제한했죠. 또 롤 값을 고려해서 방향 벡터를 정하고 있지는 않습니다. 

아래 링크의 소스로 새로운 카메라 객체를 확인할 수 있습니다.

 

 

 

728x90
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유