es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para rotar la cámara alrededor del eje X e Y en un proyecto OpenGL usando glm::lookAt para la posición de la cámara, puedes seguir estos pasos:

    1. Crea una variable para la posición de la cámara, inicialízala con la posición inicial de la cámara:
      glm::vec3 cameraPos = glm::vec3(0.0f, 0.0f, 3.0f);
    2. Crea dos variables para almacenar los ángulos de pitch y yaw, e inicialízalos en 0:
      float pitch = 0.0f;
      float yaw = 0.0f;
    3. Siempre que quieras rotar la cámara, actualiza los ángulos de pitch y yaw con los valores deseados. Por ejemplo, para rotar la cámara alrededor del eje X e Y según el movimiento del ratón, puedes usar el siguiente código:
    void mouse_callback(GLFWwindow* window, double xpos, double ypos)
    {
        static double lastX = 0.0, lastY = 0.0;
        if (glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT) == GLFW_PRESS)
        {
            double dx = xpos - lastX;
            double dy = ypos - lastY;
            lastX = xpos;
            lastY = ypos;
            float sensitivity = 0.05f;
            yaw += dx * sensitivity;
            pitch -= dy * sensitivity;
            pitch = glm::clamp(pitch, -89.0f, 89.0f);
        }
    }
    
    1. Construye un nuevo vector de dirección de la cámara a partir de los ángulos de pitch y yaw utilizando trigonometría. El nuevo vector de dirección se puede calcular de la siguiente manera:
    glm::vec3 direction;
    direction.x = cos(glm::radians(yaw)) * cos(glm::radians(pitch));
    direction.y = sin(glm::radians(pitch));
    direction.z = sin(glm::radians(yaw)) * cos(glm::radians(pitch));
    
    1. Calcula una nueva posición de destino sumando el vector de dirección a la posición de la cámara:
      glm::vec3 targetPos = cameraPos + direction;
    2. Utiliza glm::lookAt para construir la matriz de vista de la cámara:
      glm::mat4 view = glm::lookAt(cameraPos, targetPos, glm::vec3(0.0f, 1.0f, 0.0f));
    3. Utiliza la matriz de vista para renderizar la escena.

    Ten en cuenta que este enfoque utiliza ángulos de Euler para representar la rotación. Si bien puede funcionar bien en muchos casos, puede sufrir de bloqueo de cardanes cuando el ángulo de pitch se acerca a +/- 90 grados. Si experimentas problemas con el bloqueo de cardanes o deseas implementar rotaciones más complejas, es posible que desees considerar el uso de cuaterniones.

Comments are closed.