2011-06-06 3 views
0

J'ai essayé de nombreuses formules et conversions, mais rien ne m'a donné le résultat attendu.Ajout de la rotation locale à la rotation globale

Le scénario est très simple:

Comment la 3DS Max et autres logiciels 3D font la « transformation » d'un incrément en rotation locale à la rotation globale absolue? Un exemple peut vous aider à comprendre: 3DS Max - Maya - Modo (tous les trois m'ont donné le même résultat, donc je suis porté à croire que ce résultat est correct.) En supposant que l'ordre de rotation absolu est XYZ.

1. World Rotation Y = 35.0; 
2. Local Rotation X = 35.0; 

Après ces transformations, dans cet ordre, je regarde la rotation du monde absolu et ce que je vois est X:40.524 Y:-28.024 Z:-21.881

Comment ils arriver à ce résultat? Quel genre de formule? En utilisant la matrice, les angles d'Euler ou les quaternions, peu importe, comment puis-je obtenir le même résultat?

Merci. PS: Une solution simple pourrait être l'utilisation d'un quaternion ou d'une matrice, ajouter la rotation locale dans le global et ensuite récupérer le résultat absolu. Mais cela ne fonctionne pas bien, parce que de cette façon nous n'avons pas de contrôle sur l'ordre de rotation, le résultat vient toujours en utilisant l'ordre de la formule pour récupérer les valeurs.

+0

Votre post scriptum n'a pas beaucoup de sens. A partir des angles d'Euler, vous pouvez construire (ET déconstruire) une matrice de rotation en utilisant n'importe quel ordre de rotation que vous aimez. C'est beaucoup plus clair pour vos utilisateurs si vous respectez un seul ordre de rotation. –

Répondre

1

Vous voulez multiplier les matrices de rotation afin dépendant de l'ordre dans lequel les rotations sont appliquées, si la rotation locale doit être appliqué d'abord (que je soupçonne que c'est) alors:

WorldMat * LocalMat [* column vector] 

(à condition de pré-multiplier les vecteurs de colonne pour appliquer vos transformations, prenez simplement la transposition de l'expression entière si vous le faites dans l'autre sens)

De même, si vous travaillez avec des quaternions, vous devriez être multipliant vos quaternions (sans les ajouter).

0

Les matrices de rotation ressemblent à ceci (en supposant la représentation de vecteur colonne):

[ 1  0  0 ] 
[ 0 cos(a) sin(a)] = Rx(a) 
[ 0 -sin(a) cos(a)] 

[ cos(a) 0 -sin(a)] 
[ 0  1  0 ] = Ry(a) 
[ sin(a) 0  cos(a)] 

[ cos(a) sin(a) 0 ] 
[-sin(a) cos(a) 0 ] = Rz(a) 
[ 0  0  1 ] 

Multiplying 'local' signifie que la matrice va à droite. La multiplication de "global" signifie que la matrice va sur la gauche. Donc, votre rotation est Ry (35 °) * Rx (35 °). Ou approximativement:

[ .819 .329 -.469 ] 
[ 0 .019 .574 ] 
[ .574 -.470 .671 ] 

L'ordre de rotation Euler XYZ signifie Rx (ax) * Ry (ay) * Rz (az). Donc, si vous branchez les numéros Rx (40.524 °) * Ry (-28.024 °) * Rz (-21.881), vous obtenez environ (dans l'erreur d'arrondi) la même matrice (je l'ai essayé, juste pour assure-toi).