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?