2 minute read

생각

  • 키보드 입력을 받아서, 보이는 것을 조절해보자.
  • 화면을 상하좌우로 움직이는것은 무엇을 의미할까? 모델을 움직이는것은 분명히 아닐 것이다.
  • 상하 좌우로 움직이는 것은 모델 자체가 움직이는게 아니라 내가 보는 (윈도우) 에서 위치가 변경되는 것이다.
  • 축소와 확대는 보이는 화면 자체를 늘리고 , 줄여서 변경할 수 있다.
  • 그렇다면 View Mat, Projection Mat를 키보드와 마우스 입력에 맞게 계속적으로 바꿔주면 되지 않을까?

코드 구현

  • 코드의 얼개는 다음과 같을 것이다.

      do
      {
          projection = projection_with_keyboard()
          view = view_with_keyboard()
    
          // 알맞게 그림 그리기
      }
      while(NOT PUSH [ESC_KEY]);
    
  • 한꺼번에 viewprojection 매트릭스를 작성하려면 다음과 같이 하면 된다..!

      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;
      }
    

Categories:

Updated: