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
반응형
'개발 · 컴퓨터공학 > LearnOpenGL' 카테고리의 다른 글
OpenGL Lighting Scene 조명 씬 구현 [Learn OpenGL 쉬운 번역] (12) | 2024.09.08 |
---|---|
OpenGL Color 색 [Learn OpenGL 쉬운 번역] (6) | 2024.09.07 |
OpenGL Camera Mouse Input 카메라 마우스 입력 [Learn OpenGL 쉬운 번역] (8) | 2024.09.05 |
OpenGL Camera Euler Angle 카메라 오일러각 [Learn OpenGL 쉬운 번역] (6) | 2024.09.04 |
OpenGL Camera Movement 카메라 이동 [Learn OpenGL 쉬운 번역] (8) | 2024.09.03 |