повернуть камеру LookAt point - PullRequest
1 голос
/ 23 мая 2019

Использование функции glm :: lookAt для создания матрицы вида камеры хорошо, но не помогает в сохранении углов Эйлера камеры.хотя расчеты кажутся правильными, вид, кажется, дает неправильное значение шага.

в следующем коде, если значения Y текущей позиции камеры и пункта назначения одинаковы, проблем нет.однако вид, кажется, наклоняется дальше вниз или вверх, если значения Y положения камеры и пункта назначения не равны.Вопрос в том, почему камера неправильно указывает на объект, если значения Y камеры и положения объекта не равны.

    float wrapAngle(float angle)
    {
      int break_after = 100;
      constexpr float full_rotation = 2.0 * glm::pi<float>();
      while (angle < 0.0f || angle >= full_rotation)
      {
        if (angle < 0.0f) angle = angle + full_rotation;
        if (angle >= full_rotation) angle = angle - full_rotation;
        if (--break_after == 0) break;
      }
      if (break_after == 0) angle = 0.0f;
      return angle;
    }

    void getLookAtAngle(const glm::vec3& position, const glm::vec3& destination, glm::vec3 &angle)
    {
      //! Find vector of sight toward destination.
      glm::vec3 sight = destination - position;

      //! Find X, Y rotation against the axis (global).
      double yAngle = wrapAngle(std::atan2(sight.x, sight.z));

      glm::mat4 yModel(1);
      yModel = glm::rotate(yModel, static_cast<float>(-yAngle), glm::vec3(0.0f, 1, 0));
      sight = yModel * glm::vec4(sight, 1.0f);

      double xAngle = wrapAngle(-std::atan2(sight.y, sight.z));

      //! assign xAngle, yAngle to the parameter 'angle'
      angle.x = glm::degrees(static_cast<float>(xAngle));
      angle.y = glm::degrees(static_cast<float>(yAngle));
      angle.z = 0.0f;
    }

    void updateCamera(const glm::vec3& position, const glm::vec3& destination)
    {
      glm::vec3 m_rotation(1);
      getLookAtAngle(position, destination, m_rotation)
      m_model = glm::mat4(1);
      m_model = glm::rotate(m_model, glm::radians(m_rotation[0]), glm::vec3(1.0f, 0, 0));
      m_model = glm::rotate(m_model, glm::radians(m_rotation[1]), glm::vec3(0.0f, 1, 0));
      m_model = glm::rotate(m_model, glm::radians(m_rotation[2]), glm::vec3(0.0f, 0, 1));
      m_front = glm::normalize(glm::vec3(m_model * glm::vec4(0, 0, 1.0f, 1.0f)));
      m_right = glm::normalize(glm::cross(m_front, glm::vec3(0, 1.0f, 0)));
      m_up = glm::normalize(glm::cross(m_right, m_front));
      m_view = glm::lookAt(position, position+ m_front, m_up);
    }
...