[OpenGL3] 키보드 입력 받기
생각
- 키보드 입력을 받아서, 보이는 것을 조절해보자.
- 화면을 상하좌우로 움직이는것은 무엇을 의미할까?
모델을 움직이는것은 분명히 아닐 것이다. - 상하 좌우로 움직이는 것은 모델 자체가 움직이는게 아니라 내가 보는 (윈도우) 에서 위치가 변경되는 것이다.
- 축소와 확대는 보이는 화면 자체를 늘리고 , 줄여서 변경할 수 있다.
- 그렇다면
View Mat
,Projection Mat
를 키보드와 마우스 입력에 맞게 계속적으로 바꿔주면 되지 않을까?
코드 구현
-
코드의 얼개는 다음과 같을 것이다.
do { projection = projection_with_keyboard() view = view_with_keyboard() // 알맞게 그림 그리기 } while(NOT PUSH [ESC_KEY]);
-
한꺼번에
view
와projection
매트릭스를 작성하려면 다음과 같이 하면 된다..!do { computeMatricesFromInputs(); // 키보드 인풋에 대한 project view Matrix 계산 glm::mat4 ProjectionMatrix = getProjectionMatrix(); // 반환 glm::mat4 ViewMatrix = getViewMatrix(); // 반환 // 알맞게 그림 그리기 } while(NOT PUSH [ESC_KEY]);
-
computeMatricesFromInputs()
설명은 다음과 같다..!void computeMatricesFromInputs(){ // glfwGetTime is called only once, the first time this function is called static double lastTime = glfwGetTime(); // Compute time difference between current and last frame double currentTime = glfwGetTime(); // 명령어 한줄 한줄 지나칠 때 소요되는 시간을 deltaTime 이라고 하자. float deltaTime = float(currentTime - lastTime); // Get mouse position double xpos, ypos; glfwGetCursorPos(window, &xpos, &ypos); // Reset mouse position for next frame glfwSetCursorPos(window, 1024/2, 768/2); // Compute new orientation horizontalAngle += mouseSpeed * float(1024/2 - xpos ); verticalAngle += mouseSpeed * float( 768/2 - ypos ); // Direction : Spherical coordinates to Cartesian coordinates conversion glm::vec3 direction( cos(verticalAngle) * sin(horizontalAngle), sin(verticalAngle), cos(verticalAngle) * cos(horizontalAngle) ); // Right vector glm::vec3 right = glm::vec3( sin(horizontalAngle - 3.14f/2.0f), 0, cos(horizontalAngle - 3.14f/2.0f) ); // Up vector glm::vec3 up = glm::cross( right, direction ); // Move forward if (glfwGetKey( window, GLFW_KEY_UP ) == GLFW_PRESS){ position += direction * deltaTime * speed; } // Move backward if (glfwGetKey( window, GLFW_KEY_DOWN ) == GLFW_PRESS){ position -= direction * deltaTime * speed; } // Strafe right if (glfwGetKey( window, GLFW_KEY_RIGHT ) == GLFW_PRESS){ position += right * deltaTime * speed; } // Strafe left if (glfwGetKey( window, GLFW_KEY_LEFT ) == GLFW_PRESS){ position -= right * deltaTime * speed; } float FoV = initialFoV;// - 5 * glfwGetMouseWheel(); // Now GLFW 3 requires setting up a callback for this. It's a bit too complicated for this beginner's tutorial, so it's disabled instead. // Projection matrix : 45° Field of View, 4:3 ratio, display range : 0.1 unit <-> 100 units ProjectionMatrix = glm::perspective(glm::radians(FoV), 4.0f / 3.0f, 0.1f, 100.0f); // Camera matrix ViewMatrix = glm::lookAt( position, // Camera is here position+direction, // and looks here : at the same position, plus "direction" up // Head is up (set to 0,-1,0 to look upside-down) ); // For the next frame, the "last time" will be "now" lastTime = currentTime; }