11
votes

Retourner un quaternion des coordonnées droitières à gauche

J'ai besoin de retourner un quaternion de droite:
x = de gauche à droite
y = avant à dos
z = haut en bas

Coordonnées gauchers Où:
x = de gauche à droite
Y = haut en bas
z = avant vers l'arrière

Comment allais-je faire cela?


2 commentaires

S'il vous plaît expliquer ce que vous essayez réellement de faire. Comme c'est le cas, votre question n'a pas de sens. C'est bon de ne pas comprendre comment faire quelque chose, mais vous devez donner toute l'histoire. Mon devinez est que votre question devrait lire quelque chose comme "J'ai un quaternion qui représente une rotation en 3 dimensions, mais parce que j'utilise un système de coordonnées qui diffère de l'envoi dans cette manière particulière , le quaternion ne représente pas la rotation que je veux. Comment puis-je le convertir en quaternion qui fait la rotation que je veux? " Ceci est presque un DUP de Stackoverflow.com/Questtions/1263072


Je n'ai pas réfléchi à donner plus, mais oui, il représente une rotation, ou peut-être une orientation, en 3D où l'axe z est tourné vers le haut. Maintenant, j'ai besoin d'échanger essentiellement l'axe Z et Y afin que l'axe des Y soit tourné vers le haut. Et oui, c'est semblable à mon autre question parce que j'essaie d'atteindre la même chose, mais ils sont deux questions différentes.


6 Réponses :


0
votes

1 commentaires

Le message que vous avez cité répond réellement une question différente - l'affiche originale semble avoir utilisé "gaucher" à signifier "Tourner dans la direction opposée". C'est assez différent d'échanger les axes Y et Z alors que Cmann veut faire.



1
votes

Une fois que vous faites cela, vous n'avez plus de quaternion, c'est-à-dire les règles habituelles de multiplication eux ne fonctionneront pas. L'identité i ^ 2 = j ^ 2 = k ^ 2 = ijk = -1 ne tiendra plus si vous échangez J et K (Y et Z dans votre système droitier).


3 commentaires

Alors, dis-tu que vous ne pouvez pas changer le quaternion?


@cmann non si vous souhaitez conserver les propriétés habituelles. Je suppose que l'on pourrait dériver tout un autre ensemble de règles pour LH-Quaternions ... mais pourquoi? Qu'est-ce que vous essayez d'accomplir? Peut-être qu'il y a un moyen plus facile; peut-être convertir lh en coordonnées de l'HR, faire vos rotations ou quoi que ce soit, puis à la conversion du système LH?


J'essaie d'exporter des données de Blender à OpenGL



6
votes

OK, juste pour être clair, les quaternions n'ont pas vraiment de la main. Ils sont sans main (voir l'article Wikipedia sur quaternions). Cependant, la conversion à une matrice d'un quaternion a de la main l'associée. Voir http://osdir.com/ml/games.devel. Algorithmes / 2002-11 / msg00318.html Si votre code effectue cette conversion, vous devrez peut-être avoir deux fonctions distinctes à convertir en une matrice gauchoise ou une matrice droitier.

espère que cela aide.


2 commentaires

Je pense que ce que l'utilisateur demande vraiment est "Comment changer la garantie de ma base affecte-t-elle mon quaternion de rotation?" qui est une question valide. L'orientation est une donnée sur le vectorial, pas ses transformations (y compris les représentations de quaternion et de matrice.)


Que le fil OSDIR n'est pas correct. La conversion du quaternion à une matrice 3x3 n'implique aucun type. Il est purement "résoudre pour la matrice m telle que mv = qv" (en supposant que vous utilisez des vecteurs de colonne). Voir EuclideanSpace.com/maths/geométrie/rotations/conversions/... pour la dérivation.



10
votes

Je ne pense pas que l'une de ces réponses est correcte.

andres est correct que les quaternions n'ont pas de caractère (*). Handedness (ou ce que j'appellerai «Conventions de l'axe») est une propriété que les humains s'appliquent; C'est la façon dont nous mappons nos concepts de "avant, à droite" aux axes x, y, z.

Ces choses sont vraies:

  • Les matrices de rotation pure (orthogonal, déterminant 1, etc.) peuvent être converties en une unité Quaternion et en arrière, récupérant la matrice d'origine. Les matrices
  • sont non pure rotations (celles qui ont déterminant -1, par exemple des matrices qui basculent sur un axe unique) sont également appelées "rotations inappropriées", et ne peuvent pas être converties en une unité Quaternion et arrière. Votre routine mat_to_quat () peut ne pas exploser, mais cela ne vous donnera pas la bonne réponse (dans le sens où quat_to_mat (mat_to_quat (m)) == M ) .
  • Un changement de base qui swaps de la santé a déterminant -1. Il s'agit d'une rotation inappropriée: équivalente à une rotation (peut-être identité) composée d'une mise en miroir sur l'origine.

    Pour changer la base d'un quaternion, disons de Ros (droitier) à l'unité (gauchers), nous pouvons utiliser la méthode de. xxx

    lignes 1-4 sont simplement la méthode de https://stackoverflow.com/a/39519079/194921 : "Comment effectuez-vous un changement de base sur une matrice?"

    ligne 5 est intéressant. Nous savons mat_to_quat () ne fonctionne que sur des matrices de rotation pure. Comment savons-nous que m_unity est une rotation pure? Il est certainement concevable que ce ne soit pas, car unity_to_ros et ros_to_unity ont les deux déterminants -1 (à la suite du commutateur de la maintien).

    la main- La réponse ondulée est que la garantie passe deux fois, le résultat n'a donc pas de commutateur de maintien. La réponse plus profonde concerne le fait que les transformations de similitude préservent certains aspects de l'opérateur, mais je n'ai pas assez de mathématiques pour faire la preuve.

    Notez que cela vous donnera un correct résultat, mais vous pouvez probablement le faire plus rapidement si Unity_to_ros est une matrice simple (par exemple, avec juste un swap d'axe). Mais vous devriez probablement dériver cette méthode plus rapide en développant les mathématiques faites ici.

    (*) En fait, il existe une distinction entre les quaternions de Hamilton et JPL; Mais tout le monde utilise Hamilton, il n'ya donc pas besoin de bouer les eaux avec cela.


0 commentaires

7
votes

Je pense que la solution est la suivante: xxx

in Unité: xxx


5 commentaires

C'est ce qui a effectivement fonctionné ici; La seule chose était que nous avions besoin de {Y, Z, -W, X} (donc la négation nécessaire). Cela pourrait être parce que je fais quelque chose de mal cependant; C'était dans une application OpenGL où je calcule une matrice de modèleView, puis envoyez ceci comme quaternion à l'unité et essayez de configurer la caméra là-bas.


Cela ne devrait pas fonctionner sauf si vous utilisez des structures de données de quaternion vraiment étrange. La valeur W est classiquement soit la première ou la dernière valeur du tuple, et n'est également associé directement à aucune direction spatiale. Il ne devrait donc jamais finir en troisième position.


J'essayais d'ajuster la rotation d'un os d'une armature à une autre avec une hauteur différente, je pense que cela a résolu élégamment mon problème! Merci!


Peut-être que j'ai foiré quelque part dans la traduction, mais pour une raison quelconque, l'option 1 n'est pas équivalente à l'option 2. J'ai essayé de les définir dans une caméra dans l'éditeur d'Unity3D. L'option 2 fonctionne pour moi.


Curieux, comment vous prouvez mathématiquement ceux-ci pour être égaux? Basé sur leurs produits DOT?



0
votes

Je sais que cette question est ancienne, mais la méthode ci-dessous est testée et fonctionne. J'ai utilisé Pyquaternion pour manipuler les quaternions.

aller de droit à gauche. Trouvez l'axe et l'angle du quaternion de la main droite. Convertissez ensuite l'axe en coordonnées à gauche. Nier l'angle de la main droite pour obtenir l'angle de la main gauche. Construire le quaternion avec axe gaucher et angle gauche.


0 commentaires