Rotar y traducir objetos en orientación local y global usando glm
Estoy tratando de implementar funciones, donde puedo rotar / traducir un objeto en orientación local o global, como en el software de modelado 3D, usando glm. Algo como esto:
void Rotate(float x, float y, float z, bool localOrientation);
pero no sé cómo hacerlo funcionar. La rotación de rotación local debería ser algo como esto (?):
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)
Pero, ¿cómo combinar esto con la orientación local? En realidad, necesito rotar la matriz de rotación en orientación mundial, ¿verdad? Espero que sepa a qué me refiero con rotación / traducción orientada local y globalmente, como en los programas de modelado 3D. En la mayoría de ellos, tiene un botón para cambiar entre local y global.
¿Y cómo calcularía el vector hacia adelante / derecha / arriba entonces? normalmente debería ser algo como esto, ¿verdad ?:
forward = m_Orientation * glm::vec4(0,0,-1,0);
Intenté la rotación global con esto:
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);
pero entonces solo la rotación x está en orientación global, la rotación y y z está en orientación local, ya que ya está rotada alrededor del eje x. Entonces necesito rotar los 3 ángulos a la vez (?)
La traducción local solo debe agregar valores de traducción a la traducción actual, y la traducción local debe ser glm :: inverse (m_Orientation) * translationVector ¿verdad?