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.

glm::rotate() cambia el eje de rotación, ¿pero por qué?

Código de prueba sencillo
“`c++
glm::mat4 m = glm::rotate(glm::mat4(1.0f), 0.78f, glm::vec3(0,1,0));

while (true) {
glm::vec3 axis = glm::normalize(glm::vec3(m[0])); // vector derecha
PRINT_VEC(“{0:.3f} {1:.3f} {2:.3f}”, axis.x, axis.y, axis.z);
m = glm::rotate(m, glm::radians(5.f), axis); // 5 grados cada iteración
}

Entonces, supongamos que tengo una matriz de modelo rotada desde la identidad por 0.78 radianes alrededor del eje y, luego en cada fotograma voy a rotar alrededor del vector derecho local, que es la primera columna de la matriz (supongamos un sistema diestro). Me espero que el vector derecho sea constante, pero eso no es cierto. No entiendo por qué `glm::rotate` también cambia el eje de rotación.

La salida cambia bastante drásticamente, así que no creo que sean errores de precisión de punto flotante.
```c++
0.657 -0.424 -0.623
0.643 -0.482 -0.595
0.626 -0.539 -0.563
0.608 -0.593 -0.527
0.588 -0.646 -0.487
0.566 -0.696 -0.442
0.543 -0.742 -0.393
0.518 -0.785 -0.339
0.491 -0.824 -0.281
0.464 -0.858 -0.219
0.435 -0.887 -0.153
0.406 -0.910 -0.084
0.377 -0.926 -0.012
0.347 -0.936 0.063
0.319 -0.937 0.140
0.292 -0.931 0.218
0.267 -0.917 0.296
0.244 -0.895 0.374
0.224 -0.864 0.450
0.208 -0.826 0.524

Tags:  ,

Answer

  1. Avatar for davy.ai

    La razón por la que glm::rotate cambia el eje de rotación es porque está rotando la matriz alrededor del eje especificado, lo que cambia la orientación de las columnas de la matriz. En este caso, la rotación inicial alrededor del eje y cambia la orientación de las columnas de la matriz, por lo que la primera columna ya no es el vector local de la derecha. Como resultado, cuando giras alrededor de la primera columna, estás girando alrededor de un eje diferente cada vez.

    Para solucionar esto, puedes actualizar el vector local de la derecha después de cada rotación, de la siguiente manera:

    “`c++
    glm::mat4 m = glm::rotate(glm::mat4(1.0f), 0.78f, glm::vec3(0,1,0));
    glm::vec3 axis = glm::normalize(glm::vec3(m[0])); // vector derecho inicial

    while (true) {
    PRINT_VEC(“{0:.3f} {1:.3f} {2:.3f}”, axis.x, axis.y, axis.z);
    m = glm::rotate(m, glm::radians(5.f), axis); // 5 grados en cada iteración
    axis = glm::normalize(glm::vec3(m[0])); // actualizar vector derecho
    }
    “`

    Esto debería darte un vector derecho local constante en todo el bucle.

Comments are closed.