2015-10-08 4 views
0

Мне нужно вращать объект в локальной системе координат, как вы можете повернуть его в 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); 

Но у меня есть один и тот же результат

ответ

0

Вы должны изменить всю ModelMatrix вместо углов. Инициализируйте ModelMatrix в единую матрицу. Затем, когда вы обрабатываете ввод с клавиатуры:

if(rotate about x-axis) 
    ModelMatrix = glm::rotate(ModelMatrix, angle, glm::vec3(1, 0, 0)); 
if(rotate about y-axis) 
    ModelMatrix = glm::rotate(ModelMatrix, angle, glm::vec3(0, 1, 0)); 
if(rotate about z-axis) 
    ModelMatrix = glm::rotate(ModelMatrix, angle, glm::vec3(0, 0, 1)); 
if(any rotation happened) 
    MVP = Projection * View * ModelMatrix ; 

Вы можете выполнить эту модификацию на любом уровне. Либо уровень MVP, уровень ModelMatrix (как показано здесь), либо уровень RotateMatrix.

+0

Этот способ работает только в том случае, если я не сбрасываю матрицу каждый цикл - // ModelMatrix = glm :: mat4 (1.0f); 'Таким образом, все мои дочерние модели могут наследовать родительскую модель только путем умножения:' ModelMatrix [i] * = TransformMatrix [i] * ScaleMatrix [i] * RotateMatrix [i]; '... Также таким образом я могу вращаться только строго вдоль осей. – Hangmoon

+0

Зачем вам нужно сбросить матрицу? Просто используйте временную матрицу, которая накапливает матрицы из графика сцены. Не является ли строгое ограничение по оси, что вы хотели в первую очередь? Конечно, вы всегда можете указать другие оси вращения. –

+0

Спасибо! Я просто не сбросил только матрицу вращения, и теперь она работает нормально. Только спецификация: 'angle = value', но не' angle + = value'. – Hangmoon