web-dev-qa-db-fra.com

Rotation d'un vecteur dans l'espace 3D

Je fais un projet Android en openGL es qui utilise un accéléromètre pour calculer le changement d'axes spécifiques et mon objectif est de faire pivoter le vecteur de mouvement de mon objet semblable à un engin spatial. Le problème est que je ne comprends pas le calcul derrière les matrices de rotation. Le vecteur de mouvement par défaut est 0,1,0, ce qui signifie + y, de sorte que l'objet est orienté vers le haut au début. et j'essaie de faire pivoter son vecteur de mouvement afin de pouvoir déplacer l'objet là où il pointe. Je peux recueillir les changements de rotation dans le téléphone. axe x: rotation [0], axe y: rotation [1], axe z: rotation [2]. Comment puis-je faire pivoter mon vecteur de mouvement à l'aide de la matrice de rotation?

46
deniz

Si vous voulez faire pivoter un vecteur, vous devez construire ce que l’on appelle matrice de rotation .

Rotation en 2D

Disons que vous voulez faire pivoter un vecteur ou un point de θ, alors trigonométrie indique que les nouvelles coordonnées sont

    x' = x cos θ − y sin θ
    y' = x sin θ + y cos θ

Pour en faire la démonstration, prenons les axes cardinaux X et Y; Lorsque nous faisons pivoter l'axe X de 90 ° dans le sens inverse des aiguilles d'une montre, nous devrions nous retrouver avec l'axe X transformé en axe des ordonnées. Considérer

    Unit vector along X axis = <1, 0>
    x' = 1 cos 90 − 0 sin 90 = 0
    y' = 1 sin 90 + 0 cos 90 = 1
    New coordinates of the vector, <x', y'> = <0, 1>  ⟹  Y-axis

Lorsque vous comprenez cela, créer une matrice pour le faire devient simple. Une matrice n’est qu’un outil mathématique permettant d’effectuer cette opération de manière confortable et généralisée, de sorte que diverses transformations telles que la rotation, l’échelle et la translation (déplacement) puissent être combinées et exécutées en une seule étape, à l’aide d’une méthode commune. De l'algèbre linéaire, pour faire pivoter un point ou un vecteur en 2D, la matrice à construire est

    |cos θ   −sin θ| |x| = |x cos θ − y sin θ| = |x'|
    |sin θ    cos θ| |y|   |x sin θ + y cos θ|   |y'|

Rotation en 3D

Cela fonctionne en 2D, alors qu'en 3D, nous devons prendre en compte le troisième axe. Faire pivoter un vecteur autour de l'origine (un point) en 2D signifie simplement le faire pivoter autour de l'axe Z (une ligne) en 3D; Puisque nous sommes en rotation autour de l’axe des Z, sa coordonnée doit rester constante, c’est-à-dire 0 ° (la rotation s’effectue sur le plan XY en 3D). En 3D, la rotation autour de l'axe Z serait

    |cos θ   −sin θ   0| |x|   |x cos θ − y sin θ|   |x'|
    |sin θ    cos θ   0| |y| = |x sin θ + y cos θ| = |y'|
    |  0       0      1| |z|   |        z        |   |z'|

autour de l'axe des Y serait

    | cos θ    0   sin θ| |x|   | x cos θ + z sin θ|   |x'|
    |   0      1       0| |y| = |         y        | = |y'|
    |−sin θ    0   cos θ| |z|   |−x sin θ + z cos θ|   |z'|

autour de l'axe X serait

    |1     0           0| |x|   |        x        |   |x'|
    |0   cos θ    −sin θ| |y| = |y cos θ − z sin θ| = |y'|
    |0   sin θ     cos θ| |z|   |y sin θ + z cos θ|   |z'|

Note : l'axe autour duquel la rotation est effectuée ne comporte aucun élément sinus ou cosinus dans la matrice. J'espère que cela clarifie le cas de rotation.

Composition

Les matrices susmentionnées font pivoter un objet comme si celui-ci se trouvait à une distance r = √ (x² + y²) de l'origine; lookup coordonnées polaires pour savoir pourquoi. Cette rotation se fera par rapport à l'origine de l'espace mondial. Habituellement, nous devons faire pivoter un objet autour de son propre cadre/pivot et non du monde entier. Étant donné que tous les objets ne sont pas au monde d'origine, la rotation à l'aide de ces matrices ne donnera pas le résultat souhaité en faisant la rotation autour du propre cadre de l'objet. Vous devez donc en savoir plus sur traduction . Vous voudriez d’abord traduire (déplacer) l’objet en Origine du monde (pour que l’Origine de l’objet s’aligne sur le monde, faisant ainsi r = 0), effectuer la rotation avec une (ou plusieurs) de ces matrices et la ré-traduire ensuite à son emplacement précédent. L'ordre dans lequel les transformations sont appliquées Matters .

Je vous exhorte à lire sur les transformations linéaires et affines et leur composition pour effectuer plusieurs transformations en une fois, avant de jouer avec les transformations en code. Sans comprendre les bases mathématiques, des transformations de débogage seraient un cauchemar. J'ai trouvé cette vidéo de conférence une très bonne ressource. Une autre ressource est ce tutoriel sur les transformations qui se veut intuitive et illustre les idées avec animation.

Remarque: Cette méthode d'exécution des rotations suit le système de rotation angle d'Euler , qui est plus simple à enseigner et à saisir. Cela fonctionne parfaitement pour les cas 2D et 3D simples; mais quand une rotation doit être effectuée autour des trois axes en même temps, les angles d'Euler ne sont pas suffisants à cause d'un défaut inhérent à ce système qui se manifeste par verrouillage du cardan . Les gens ont recours à Quaternion s dans de telles situations, ce qui est plus avancé que cela mais ne souffre pas des verrous Gimbal lorsqu'il est utilisé correctement.

137
legends2k

Référence docs ici: http://developer.Android.com/reference/Android/opengl/Matrix.html

  1. Construire une matrice de rotation
  2. Transformer le vecteur avec la matrice

Vous n'avez pas besoin de comprendre le calcul, les fonctions de la bibliothèque feront le travail.

0
Minthos