Je suis en train de construire un programme de modélisation et je voudrais faire des transformations sur des objets dans leur propre espace, puis assigner cet objet à un groupe pour tourner autour d'un autre axe. autour. Cependant, j'aimerais aussi être capable de faire des transformations dans l'espace de l'objet quand il est combiné.OpenGL transformant des objets avec des rotations multiples de différents axes
En manipulant l'objet individuel, je choisis le centre de l'objet.
glm::mat4 transform;
transform = glm::translate(transform, - obj.meshCenter);
glm::mat4 transform1;
transform1 = glm::translate(transform1, obj.meshCenter);
obj.rotation = transform1*obj.thisRot*transform;
J'envoie ensuite cette option pour le shader,
glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(obj.translation*obj.rotation*objscale);
Je voudrais maintenant faire pivoter cet objet autour d'un autre axe, par exemple un axe de (5,0,0) de 45 degrés.
J'ai maintenant:
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)
J'ai maintenant déplacé l'objet à partir de son espace local à l'espace du Groupe. J'ai un peu de mal à gérer les transformations dans l'espace de l'objet quand on le combine avec la rotation du groupe. J'ai eu un succès limité quand je mets l'axe à; R (0,1,0) comme ceci:
///Translating object in its own space///
glm::mat4 R = obj.groupRotation;
obj.translation = glm::inverse(R) * obj.translate * R;
le problème est que cela ne traduit correctement l'objet dans son propre espace si l'axe de rotation de R (rotation du groupe) est égale à (0,1,0):
///Rotating object in its own space///
glm::mat4 R = obj.groupRotation;
obj.rotation = glm::inverse(R) * obj.rot * R;
Encore une fois, les rotations sont incorrectes. Je pense que je dois peut-être annuler la traduction de l'axe du groupe? puis réappliquer quelque part?
Peut-être que cette question peut vous aider [Problèmes avec la matrice de rotation de l'axe Z dans glsl shader ] (https://stackoverflow.com/questions/6458051/issues-with-z-axis-rotation-matrix-in- glsl-shader/44986176 # 44986176) – Rabbid76
ce que j'essaie de faire est d'annuler le groupRotation de sorte que mes calculs de transformation locale soient corrects.L'inverse ci-dessus retournera les rotations et les traductions (n'ont pas encore tenté de mise à l'échelle) dans l'espace local. Le raccrochage est si l'axe de groupRotation n'est pas situé à l'origine. Je vais essayer d'insérer une translation inverse de l'emplacement de l'axe dans les multiplications matricielles ci-dessus. Je ne suis pas sûr dans quel ordre il devrait être ou si cela fonctionnera même. Cependant, je vais faire un bon coup le matin. –
Ne pouvez-vous pas modifier 'obj.thisRot' directement et recalculer la transformation combinée? Ce serait beaucoup moins sujet aux erreurs. Btw, je ne compterais pas sur 'glm :: value_ptr()' pour retourner une adresse valide pour un objet temporaire qui est supprimé juste après l'appel de 'glm :: value_ptr()'. –