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
Dans le cas où vous voulez votre propre fonction pour l'expérimentation et savons ce qui se passe derrière les scènes que j'ai donné une réponse ici.

OriginalL'auteur iondune | 2012-08-21