Les Quaternions -> Angles d'Euler -> Matrice de Rotation de la difficulté (GLM)
Je suis en train d'écrire un programme qui charge un fichier contenant une description de la scène, puis la montre à l'aide d'OpenGL. Je suis l'aide de GLM pour toutes mes opérations mathématiques. Les Rotations dans le fichier de scène sont stockés dans quaternion format. Ma scène systèmes de gestion prend les rotations d'objets dans la forme des angles d'euler, et ces angles sont par la suite convertis à une matrice de rotation lors de l'élaboration.
Mon processus de chargement prend donc le quaternion rotations, les convertit en angles d'euler pour le stockage dans ma classe de l'objet, puis de convertir ces angles d'euler à la rotation des matrices pour le dessin. Je suis en utilisant le glm::eulerAngles et glm::eulerAngleYXZ fonctions (respectivement) pour effectuer ces deux opérations.
Cependant, j'obtiens des résultats incorrects. Par exemple, si je comprends bien le quaternion {0.500 -0.500 0.500 0.500} (W X Y Z) doit décrire la rotation de prendre une flèche de l' +axe Z +Y et l'axe. Quand je lance le programme, cependant, je reçois la flèche pointant le long de la +X axe.
Je suppose qu'il existe une faille dans ma compréhension de quaternions, mais je suis en mesure d'obtenir mes résultats attendus en sautant l'intermédiaire d'euler angle de la forme. En convertissant le quaternion directement à une matrice de rotation à l'aide de glm::toMat4, je reçois une rotation des points de my +Z flèche vers +Y.
Je vais avoir de la difficulté à concilier ces deux produits différents, considérant que les deux méthodes semblent à la fois simple et correcte. Pour simplifier ma question, pourquoi est-ce que ces deux apparemment équivalent méthodes produisent des résultats différents:
glm::quat q(.5, -.5, .5, .5);
glm::vec3 euler = glm::eulerAngles(q) * 3.14159f / 180.f; //eulerAngleYXZ takes radians but eulerAngles returns degrees
glm::mat4 transform1 = glm::eulerAngleYXZ(euler.y, euler.x, euler.z);
//transform1 rotates a +Z arrow so that it points at +X
glm::quat q(.5, -.5, .5, .5);
glm::mat4 transform2 = glm::toMat4(q);
//transform2 rotates a +Z arrow so that it points at +Y
OriginalL'auteur iondune | 2012-08-21
Vous devez vous connecter pour publier un commentaire.
Vous l'avez sans doute compris maintenant... mais
Ce eulerAngle déroulement de la séquence de la fonction:
retour? Si elle ne renvoie pas explicitement un "YXZ' de la séquence, vous ne serez pas en mesure d'utiliser la fonction suivante correctement:
Votre variable 'euler' ce doit être le même type de séquence que la fonction que vous spécifiez pour la transformer en une matrice de rotation.
Après la recherche ici il ressemble à la fonction "glm::eulerAngles' retourne 'XYZ' comme tangage, lacet et roulis. Ainsi, en supposant qu'ils sont "YXZ", ou de lacet, tangage, roulis est incorrect.
Comme l'a dit avant, avec les angles d'Euler et les matrices de rotation, l'ordre des questions!
OriginalL'auteur dinkelk
L'ordre de multiplication est important lorsque vous traitez avec des angles d'Euler. YXZ et XYZ produire très différentes rotations.
Vous pourriez calculer les matrices distinctes pour chaque axe, puis à multiplier ensemble dans l'ordre de votre besoin.
J'ai considéré que ma conversion des angles d'euler pour la matrice pourrait être le problème, mais il y a un écart devant cette scène. Par exemple, les quaternions (0.5, -0.5, 0.5, 0.5) et (0.707106, 0, 0.707106, 0) à la fois convertir angles d'euler (0, 90, 0), malgré représentant deux rotations distinctes (+Z +et Y +Z +X respectivement) lors de la conversion directement à une matrice.
OriginalL'auteur Markus Jarderot