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?

Respuestas a la pregunta(1)

Su respuesta a la pregunta