Objetos de transformação OpenGL com várias rotações de diferentes eixos
Estou criando um programa de modelagem e gostaria de fazer transformações em objetos em seu próprio espaço e depois atribuir esse único objeto a um grupo para girar em torno de outro eixo em que o grupo gira. No entanto, eu também gostaria de poder fazer transformações no próprio espaço do objeto quando ele for combinado.
Manipulando o objeto individual, eu escolho o centro do objeto.
glm::mat4 transform;
transform = glm::translate(transform, - obj.meshCenter);
glm::mat4 transform1;
transform1 = glm::translate(transform1, obj.meshCenter);
obj.rotation = transform1*obj.thisRot*transform;
Então eu envio isso para o shader,
glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(obj.translation*obj.rotation*objscale);
Gostaria agora de rodar este objeto em torno de outro eixo, digamos um eixo de (5,0,0) de 45 graus.
Agora tenho:
glm::mat4 groupR;
groupR = glm::rotate(groupR,glm::degrees(45.0f),glm::vec3(5,0,0));
obj.groupRotation = groupR;
glUniformMatrix4fv(modelLoc, 1, GL_FALSE,
glm::value_ptr(obj.groupRotation*obj.translation*obj.rotation*objscale)
Agora movi o objeto do espaço local para o espaço do grupo. Estou com um pouco de dificuldade agora em operar as transformações no próprio espaço do objeto quando combinadas com a rotação do grupo. Eu tive sucesso limitado quando defino o eixo groupR como (0,1,0) da seguinte forma:
///Translating object in its own space///
glm::mat4 R = obj.groupRotation;
obj.translation = glm::inverse(R) * obj.translate * R;
o problema aqui é que isso só traduzirá o objeto corretamente em seu próprio espaço se o eixo de rotação de R (rotação do grupo) for igual a (0,1,0):
///Rotating object in its own space///
glm::mat4 R = obj.groupRotation;
obj.rotation = glm::inverse(R) * obj.rot * R;
Mais uma vez, as rotações estão incorretas. Estou pensando que talvez eu precise desfazer a tradução do eixo do groupR? e depois reaplicá-lo em algum lugar?