※ 본 포스팅은 learnopengl.com을 번역 및 가감한 포스팅이며, learnopengl에서는 번역 작업 참여를 적극 장려하고 있습니다!
아래 링크에서 원문을 확인할 수 있습니다.
Walk around
카메라가 자동으로 회전하는 것보다 직접 움직일 수 있다면 좋겠죠. 카메라에 몇 가지 변수를 정의해서 시스템을 만들어봅시다.
glm::vec3 cameraPos = glm::vec3(0.0f, 0.0f, 3.0f);
glm::vec3 cameraFront = glm::vec3(0.0f, 0.0f, -1.0f);
glm::vec3 cameraUp = glm::vec3(0.0f, 1.0f, 0.0f);
LookAt함수는 이렇게 세팅해주세요.
view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);
카메라 위치는 cameraPos로 설정하고, 방향은 현재 위치에서 Front방향 vector를 더했습니다. 이러면 계속해서 한 방향으로 보고 있겠네요. 이제 키를 누르면 cameraPos를 업데이트할 수 있게 해봅시다.
processInput이라는 함수에서 GLFW를 입력을 관리하고 있죠. 여기에 키에 따른 동작을 추가합니다.
void processInput(GLFWwindow *window)
{
...
const float cameraSpeed = 0.05f; // 상황에 맞게 조정하세요
if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS)
cameraPos += cameraSpeed * cameraFront;
if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS)
cameraPos -= cameraSpeed * cameraFront;
if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS)
cameraPos -= glm::normalize(glm::cross(cameraFront, cameraUp)) * cameraSpeed;
if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS)
cameraPos += glm::normalize(glm::cross(cameraFront, cameraUp)) * cameraSpeed;
}
이제 WASD 키를 누르면 카메라 위치가 업데이트 됩니다. 앞 뒤로 이동하는 데에는 아까 만든 Front vector를 사용했고, 옆으로 이동할 때는 right vector를 만들어서 곱했습니다. 방향은 단위로만 정하고 이동속도는 cameraSpeed값이 결정하고 있죠. 이렇게 해서 앞은 본 채 옆으로 균일하게 이동하는 strafe 효과를 얻습니다.
right vector는 반드시 normalize 해야합니다. 안그러면 cameraFront의 크기가 반영되어서 크기를 같는 vector가 나오고 cameraSpeed로 조절하는 속도와 다른 속도로 이동하게 될 겁니다.
카메라를 이동할 수 있게 되었지만, 컴퓨터마다 이동 속도가 다를 수도 있죠? 이걸 조절하는 방법을 알아봅시다.
Movement speed
지금은 이동속도가 일정한데, 사실 이게 좋은 방법은 아닌게 컴퓨터 연산 처리 속도가 빠르면 빠르게 움직이고 느리면 느리게 움직이게 됩니다. 초당 프레임을 처리하는 속도의 차이 때문인데, 좋은 컴퓨터를 쓰면 이동이 빨라지는거죠. 그럼 안되고 동일하게 맞추려면 어떻게 할까요?
게임 개발을 해보셨다면 익숙할 deltaTime이라는 개념을 사용할 겁니다. deltaTime은 이전 프레임을 렌더링하는데 걸린 시간을 현재 시간에서 뺀 값인데요. 처리가 느리면 시간이 걸리므로 deltaTime이 처리고 반대로 빠르면 작아집니다. 이 deltaTime을 이동 속도에 곱하면 이전 프레임 처리 속도가 느렸으면 속도를 높이고, 처리 속도가 빨랐으면 그만큼 속도를 줄입니다. 이 방법으로 PC에 구애받지 않고 속도를 일정하게 합니다.
deltaTime 값을 계산해봅시다. 우선 두 변수를 만듭니다.
float deltaTime = 0.0f; // 현재 프레임과 마지막 프레임 사이의 시간
float lastFrame = 0.0f; // 마지막 프레임의 시간
매 프레임마다 deltaTime을 계산합니다.
float currentFrame = glfwGetTime();
deltaTime = currentFrame - lastFrame;
lastFrame = currentFrame;
계산한 deltaTime을 속도에 반영합니다.
void processInput(GLFWwindow *window)
{
float cameraSpeed = 2.5f * deltaTime;
[...]
}
이제 초당 2.5 unit 만큼의 일정한 속도가 유지됩니다. 성능과 관계없이 자연스러운 움직임을 카메라가 갖게 되었습니다.
'개발 · 컴퓨터공학 > LearnOpenGL' 카테고리의 다른 글
OpenGL Camera Mouse Input 카메라 마우스 입력 [Learn OpenGL 쉬운 번역] (8) | 2024.09.05 |
---|---|
OpenGL Camera Euler Angle 카메라 오일러각 [Learn OpenGL 쉬운 번역] (6) | 2024.09.04 |
OpenGL Camera view 카메라 뷰 LookAt [Learn OpenGL 쉬운 번역] (2) | 2024.09.02 |
OpenGL Coordinate Systems 코드 구현 cube 큐브 그리기 [Learn OpenGL 쉬운 번역] (8) | 2024.09.01 |
OpenGL Coordinate Systems (view, projection) 좌표계 (뷰, 투영) [Learn OpenGL 쉬운 번역] (1) | 2024.08.31 |