Je me suis retrouvé coincé à faire sortir mes angles d'Euler de ma matrice de rotation.Problème avec les angles d'Euler de la matrice de rotation YZX
Mes conventions sont les suivantes:
- gaucher (x droite, z arrière, y up)
- YZX
- rotation angle gaucher
Ma matrice de rotation est constitué des angles d'Euler comme (de mon code):
var xRotationMatrix = $M([
[1, 0, 0, 0],
[0, cx, -sx, 0],
[0, sx, cx, 0],
[0, 0, 0, 1]
]);
var yRotationMatrix = $M([
[ cy, 0, sy, 0],
[ 0, 1, 0, 0],
[-sy, 0, cy, 0],
[ 0, 0, 0, 1]
]);
var zRotationMatrix = $M([
[cz, -sz, 0, 0],
[sz, cz, 0, 0],
[ 0, 0, 1, 0],
[ 0, 0, 0, 1]
]);
Quels sont les résultats dans une matrice de rotation finale:
R(YZX) = | cy.cz, -cy.sz.cx + sy.sx, cy.sz.sx + sy.cx, 0|
| sz, cz.cx, -cz.sx, 0|
|-sy.cz, sy.sz.cx + cy.sx, -sy.sz.sx + cy.cx, 0|
| 0, 0, 0, 1|
Je calculer mes angles euler retour de cette matrice en utilisant ce code:
this.anglesFromMatrix = function(m) {
var y = 0, x = 0, z = 0;
if (m.e(2, 1) > 0.999) {
y = Math.atan2(m.e(1, 3), m.e(3, 3));
z = Math.PI/2;
x = 0;
} else if (m.e(2, 1) < -0.999) {
y = Math.atan2(m.e(1, 3), m.e(3, 3));
z = -Math.PI/2;
x = 0;
} else {
y = Math.atan2(-m.e(3, 1), -m.e(1, 1));
x = Math.atan2(-m.e(2, 3), m.e(2, 2));
z = Math.asin(m.e(2, 1));
}
return {theta: this.deg(x), phi: this.deg(y), psi: this.deg(z)};
};
Je l'ai fait les mathématiques avant et en arrière quelques fois, mais je ne peux pas voir ce qui ne va pas. Toute aide serait grandement appréciée.
S'il vous plaît poser votre question sur http://math.stackexchange.com/ –
Je l'aurais fait, mais il y a beaucoup plus de matériel sur la rotation 3D sur stackoverflow. Et math.stackexchange prétend être le site "pour les personnes qui étudient les mathématiques ou dans les professions liées aux mathématiques". Cela m'exclut. –
@ Scorpi0: Ceci est une question appropriée ici. @Brendon: Votre code semble correct. J'essaierais les cas triviaux: faites pivoter +90 deg autour de l'axe X et vérifiez le résultat. Puis autour de l'axe Y et ainsi de suite. Une seule rotation à la fois, et toujours à partir de l'état d'origine, pas de rotations consécutives. – Ali