Поверните и переведите объект в локальную и глобальную ориентацию, используя glm

я пытаюсь реализовать функции, в которых я могу вращать / переводить объект в локальной или глобальной ориентации, как в программном обеспечении для 3D-моделирования, используя glm. Что-то вроде этого:

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

но я не знаю, как заставить это работать. Локальное вращение должно быть примерно таким (?):

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)

Но как совместить это с местной ориентацией? На самом деле мне нужно вращать матрицу вращения в мировой ориентации, верно? Я надеюсь, что вы знаете, что я имею в виду под локальной и глобальной ориентированной ротацией / переводом, как в программах трехмерного моделирования. В большинстве из них у вас есть кнопка для переключения между локальным и глобальным.

И как тогда рассчитать вектор вперед / вправо / вверх? обычно это должно быть примерно так, верно?

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

Я попробовал глобальное вращение с этим:

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);

но тогда только вращение x находится в глобальной ориентации, вращение y и z находится в локальной ориентации, поскольку оно уже вращается вокруг оси x. Так что мне нужно повернуть все 3 угла одновременно (?)

Перевод локального должен просто добавлять значения перевода к текущему переводу, и местный перевод должен быть glm :: inverse (m_Orientation) * translationVector, верно?

Ответы на вопрос(1)

Ваш ответ на вопрос