Gire e traduza objetos na orientação local e global usando glm

estou tentando implementar funções, onde posso girar / traduzir um objeto na orientação local ou global, como no software de modelagem 3D, usando glm. Algo assim:

void Rotate(float x, float y, float z, bool localOrientation);

mas eu não sei como fazê-lo funcionar. A rotação de rotação local deve ser algo como isto (?):

m_Orientation *= glm::rotate(x, glm::vec3(1,0,0);
m_Orientation *= glm::rotate(y, glm::vec3(0,1,0);
m_Orientation *= glm::rotate(z, glm::vec3(0,0,1);

// (m_Orientation is glm::mat4)

Mas como combinar isso com a orientação local? Na verdade eu preciso girar a matriz de rotação na orientação mundial, certo? Espero que você saiba o que quero dizer com rotação / tradução orientada local e global, como nos programas de modelagem 3D. Na maioria deles, você tem um botão para alternar entre local e global.

E como eu calcularia o vetor forward / right / up então? normalmente deve ser algo assim, certo ?:

forward = m_Orientation * glm::vec4(0,0,-1,0);

Eu tentei a rotação global com isso:

m_GlobalOrientation = glm::rotate(m_GlobalRotation.x, glm::vec(1,0,0);
m_GlobalOrientation *= glm::rotate(m_GlobalRotation.y, glm::vec(0,1,0);
m_GlobalOrientation *= glm::rotate(m_GlobalRotation.z, glm::vec(0,0,1);

mas somente a rotação x está na orientação global, a rotação yez está na orientação local, já que já está girada em torno do eixo x. Então, eu preciso girar os três ângulos de uma só vez (?)

A tradução local deve apenas adicionar valores de tradução à tradução atual e a tradução local deve ser glm :: inverse (m_Orientation) * translationVector, certo?

questionAnswers(1)

yourAnswerToTheQuestion