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.

Cómo rotar un objeto alrededor de un punto con GLM OpenGL C++?

Estoy intentando hacer algo así, pero por alguna razón mi cubo todavía gira alrededor del origen. ¿Qué estoy haciendo mal?

glm::mat4 identity = glm::mat4(1.0f); // construir matriz identidad

glm::mat4 trans;
glm::mat4 rot;
glm::mat4 transBack;
glm::mat4 M;

glm::vec4 br = glm::vec4(currentPositionX - 0.4, 0.0f, currentPositionZ + 1.2, 1.0f);

// obtener la transformación de matriz para la traducción
trans = glm::translate(identity, glm::vec3(+0.4, 0.0f, -1.2));

identity = glm::mat4(1.0f); // construir matriz identidad
// obtener la transformación de matriz para la rotación
rot = glm::rotate(identity, glm::radians(rotation), glm::vec3(0.0, 1.0, 0.0));  // rotar con ROT del coche -

identity = glm::mat4(1.0f); // construir matriz identidad
// obtener la transformación de matriz para la traducción
transBack = glm::translate(identity, glm::vec3(-0.4, 0.0f, +1.2));

M = transBack * rot * trans;

// A' = M . A, siendo A un punto
br = M * br;
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que estás aplicando las transformaciones en el orden incorrecto. En el código, primero estás traduciendo el cubo, luego girándolo y luego volviéndolo a su posición original. Esto hará que el cubo rote alrededor de su origen local, lo cual puede que no sea lo que deseas.

    Para rotar el cubo alrededor de un punto diferente, necesitas traducirlo primero hacia ese punto, luego aplicar la rotación y luego traducirlo de vuelta. Por lo tanto, el orden correcto de las transformaciones debería ser:

    1. Traducir el cubo hacia el origen de la rotación.
    2. Aplicar la rotación alrededor del origen.
    3. Traducir el cubo de vuelta a su posición original.

    En el código, puedes lograr esto cambiando el orden de las transformaciones de la siguiente manera:

    glm::vec3 origenDeRotacion = glm::vec3(currentPositionX, 0.0f, currentPositionZ + 1.2);
    
    // obtener la transformación de matriz para traducir el cubo hacia el origen de la rotación
    trans = glm::translate(identity, -origenDeRotacion);
    
    // obtener la transformación de matriz para rotar alrededor del origen
    rot = glm::rotate(identity, glm::radians(rotacion), glm::vec3(0.0, 1.0, 0.0));
    
    // obtener la transformación de matriz para traducir de vuelta a la posición original
    transBack = glm::translate(identity, origenDeRotacion);
    
    M = transBack * rot * trans;
    
    // aplicar la transformación al punto br
    br = M * br;
    

    Con estos cambios, el cubo debería girar ahora alrededor del punto origenDeRotacion.

Comments are closed.