Мне нужно вращать объект в локальной системе координат, как вы можете повернуть его в 3dmax \ майи и т.д ...OpenGl GLM локального вращения
Мой текущий код:
ModelMatrix = glm::mat4(1.0f);
TransformMatrix = glm::mat4(1.0f);
ScaleMatrix = glm::mat4(1.0f);
RotateMatrix = glm::mat4(1.0f);
ScaleMatrix = glm::scale(ScaleMatrix, glm::vec3(scalex, scalez, scaley));
TransformMatrix = glm::translate(TransformMatrix, glm::vec3(x, z, y));
RotateMatrix = glm::rotate(RotateMatrix, anglex, glm::vec3(1, 0, 0));
RotateMatrix= glm::rotate(RotateMatrix, angley, glm::vec3(0, 0, 1));
RotateMatrix = glm::rotate(RotateMatrix, anglez, glm::vec3(0, 1, 0));
ModelMatrix = TransformMatrix * ScaleMatrix* RotateMatrix;
MVP = Projection * View * ModelMatrix ;
anglex, у, z - происходит с клавиатуры.
В настоящее время только последний размер работает как локальный (im мой пример это glm :: vec3 (0, 1, 0) Z-ось) На этом IMAGE Я показываю, что мне нужно (2) и то, что у меня есть (3) ... Если я изменяю «anglez», он всегда работает как ROLL. Но anglex и angley находятся в мировой системе координат.
Вторая моя попытка - использовать Кватернионы:
quat MyQuaternion= glm::quat(cos(glm::radians(xangle/2)), 0, sin(glm::radians(xangle/2)), 0);
quat MyQuaternion2 = glm::quat(cos(glm::radians(yangle/ 2)), sin(glm::radians(yangle/2)), 0, 0);
quat MyQuaternion3 = glm::quat(cos(glm::radians(zangle/2)), 0,0,sin(glm::radians(zangle/2)));
glm::mat4 RotationMatrix = toMat4(MyQuaternion*MyQuaternion2*MyQuaternion3);
Но у меня есть один и тот же результат
Этот способ работает только в том случае, если я не сбрасываю матрицу каждый цикл - // ModelMatrix = glm :: mat4 (1.0f); 'Таким образом, все мои дочерние модели могут наследовать родительскую модель только путем умножения:' ModelMatrix [i] * = TransformMatrix [i] * ScaleMatrix [i] * RotateMatrix [i]; '... Также таким образом я могу вращаться только строго вдоль осей. – Hangmoon
Зачем вам нужно сбросить матрицу? Просто используйте временную матрицу, которая накапливает матрицы из графика сцены. Не является ли строгое ограничение по оси, что вы хотели в первую очередь? Конечно, вы всегда можете указать другие оси вращения. –
Спасибо! Я просто не сбросил только матрицу вращения, и теперь она работает нормально. Только спецификация: 'angle = value', но не' angle + = value'. – Hangmoon